diff --git a/README.md b/README.md index a2effddc..95524972 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,19 @@ We currently include a variety of CI Images, including Alpine and Debian Stretch The latest Debian Stretch release can be pulled from `quay.io/reactiveops/ci-images:v7-stretch`. A full list of the latest image tags is available on our [Quay repository](https://quay.io/repository/reactiveops/ci-images). +## Examples + +rok8s-scripts is designed to work well in a wide variety of environments. That includes Bitbucket Pipelines, CircleCI, GitLab CI, and more. There are many valid ways to configure CI pipelines, we've includes a variety of [examples](/examples) in this repository. + +Most notably, the CI example includes sample configuration for the following platforms: + +- [Bitbucket Pipelines](/examples/ci/bitbucket-pipelines.yml) +- [CircleCI](/examples/ci/.circleci/config.yml) +- [GitLab CI](/examples/ci/.gitlab-ci.yml) +- [Jenkins](/examples/ci/Jenkinsfile) + +On their own, these examples may not make a lot of sense. There's a lot more documentation below that should cover everything included in these examples and more. + ## Further Reading - [Building and Pushing Docker Images](/docs/docker.md) diff --git a/docs/index.md b/docs/index.md index 87c21490..611eb661 100644 --- a/docs/index.md +++ b/docs/index.md @@ -16,7 +16,21 @@ We currently include a variety of CI Images, including Alpine and Debian Stretch The latest Debian Stretch release can be pulled from `quay.io/reactiveops/ci-images:v7-stretch`. A full list of the latest image tags is available on our [Quay repository](https://quay.io/repository/reactiveops/ci-images). +## Examples + +rok8s-scripts is designed to work well in a wide variety of environments. That includes Bitbucket Pipelines, CircleCI, GitLab CI, and more. There are many valid ways to configure CI pipelines, we've includes a variety of [examples](/examples) in this repository. + +Most notably, the CI example includes sample configuration for the following platforms: + +- [Bitbucket Pipelines](/examples/ci/bitbucket-pipelines.yml) +- [CircleCI](/examples/ci/.circleci/config.yml) +- [GitLab CI](/examples/ci/.gitlab-ci.yml) +- [Jenkins](/examples/ci/Jenkinsfile) + +On their own, these examples may not make a lot of sense. There's a lot more documentation below that should cover everything included in these examples and more. + ## Further Reading + - [Building and Pushing Docker Images](/docs/docker.md) - [Deploying to Kubernetes with Helm](/docs/helm.md) - [Deploying to Kubernetes without Helm](/docs/without_helm.md) @@ -26,11 +40,6 @@ The latest Debian Stretch release can be pulled from `quay.io/reactiveops/ci-ima - [Amazon Web Services](/docs/aws.md) - [Google Cloud](/docs/gcp.md) -### CI Specific Documentation -- CircleCI -- GitLab CI -- Bitbucket Pipelines - ### Contributing - [Releasing New Versions of rok8s-scripts](/docs/releasing.md) diff --git a/docs/without_helm.md b/docs/without_helm.md index da686b76..22d7a82d 100644 --- a/docs/without_helm.md +++ b/docs/without_helm.md @@ -46,6 +46,10 @@ k8s-deploy-and-verify -f deploy/development.config More indepth examples are available in the [examples directory](/examples). +## Versioning +**If a Docker image is used in the file then any cases of `:latest` will be replaced with th `CI_SHA1` if it is defined.** This allows a set image tag to be used when deploying from a CI system. When files that could use `CI_SHA1` are deployed, a new file will be created with that value as part of the filename. + +If using an HPA, set `replicas: hpa` in the deployment file to have k8s-deploy get the current number of replicas from the cluster and deploy that number of replicas. This is a workaround for an open issue (https://github.com/kubernetes/kubernetes/issues/25238). ## Deployment Configuration Listed below are all the types of resources rok8s-scripts supports. In all cases, the filename suffix is important and must match the spec precisely. diff --git a/examples/Jenkins-K8s-Plugin/Dockerfile b/examples/Jenkins-K8s-Plugin/Dockerfile deleted file mode 100644 index 8c5badc6..00000000 --- a/examples/Jenkins-K8s-Plugin/Dockerfile +++ /dev/null @@ -1 +0,0 @@ -FROM node:alpine diff --git a/examples/Jenkins-K8s-Plugin/charts/example/.helmignore b/examples/Jenkins-K8s-Plugin/charts/example/.helmignore deleted file mode 100644 index f0c13194..00000000 --- a/examples/Jenkins-K8s-Plugin/charts/example/.helmignore +++ /dev/null @@ -1,21 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*~ -# Various IDEs -.project -.idea/ -*.tmproj diff --git a/examples/Jenkins-K8s-Plugin/charts/example/Chart.yaml b/examples/Jenkins-K8s-Plugin/charts/example/Chart.yaml deleted file mode 100644 index e8af496d..00000000 --- a/examples/Jenkins-K8s-Plugin/charts/example/Chart.yaml +++ /dev/null @@ -1,3 +0,0 @@ -apiVersion: v1 -name: example -version: 0.1.0 diff --git a/examples/Jenkins-K8s-Plugin/charts/example/templates/NOTES.txt b/examples/Jenkins-K8s-Plugin/charts/example/templates/NOTES.txt deleted file mode 100644 index c3b3453e..00000000 --- a/examples/Jenkins-K8s-Plugin/charts/example/templates/NOTES.txt +++ /dev/null @@ -1,2 +0,0 @@ -1. Get the application URL by running these commands: - diff --git a/examples/Jenkins-K8s-Plugin/charts/example/templates/_helpers.tpl b/examples/Jenkins-K8s-Plugin/charts/example/templates/_helpers.tpl deleted file mode 100644 index 2f8a90ff..00000000 --- a/examples/Jenkins-K8s-Plugin/charts/example/templates/_helpers.tpl +++ /dev/null @@ -1,16 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Expand the name of the chart. -*/}} -{{- define "chart.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -*/}} -{{- define "chart.fullname" -}} -{{- $name := default .Chart.Name .Values.nameOverride -}} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} -{{- end -}} diff --git a/examples/Jenkins-K8s-Plugin/charts/example/templates/configmap.yaml b/examples/Jenkins-K8s-Plugin/charts/example/templates/configmap.yaml deleted file mode 100644 index 322cc85d..00000000 --- a/examples/Jenkins-K8s-Plugin/charts/example/templates/configmap.yaml +++ /dev/null @@ -1,9 +0,0 @@ -{{- if .Values.configmap }} ---- -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ template "chart.name" . }} -data: -{{ toYaml .Values.configmap.data | indent 2 }} -{{- end }} diff --git a/examples/Jenkins-K8s-Plugin/charts/example/templates/deployment.yaml b/examples/Jenkins-K8s-Plugin/charts/example/templates/deployment.yaml deleted file mode 100644 index a9ea5b73..00000000 --- a/examples/Jenkins-K8s-Plugin/charts/example/templates/deployment.yaml +++ /dev/null @@ -1,42 +0,0 @@ -apiVersion: extensions/v1beta1 -kind: Deployment -metadata: - name: {{ template "chart.name" . }} - labels: - app: {{ template "chart.name" . }} - chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }} - release: {{ .Release.Name }} - heritage: {{ .Release.Service }} -spec: - {{- if (and .Values.replicaCount (not .Values.hpa.enabled)) }} - replicas: {{ .Values.replicaCount }} - {{- end }} - template: - metadata: - labels: - app: {{ template "chart.name" . }} - release: {{ .Release.Name }} - spec: - containers: - - name: {{ .Chart.Name }} - image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" - imagePullPolicy: {{ .Values.image.pullPolicy }} - ports: - - containerPort: {{ .Values.service.internalPort }} - livenessProbe: - failureThreshold: {{ .Values.livenessProbe.failureThreshold }} - initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }} - periodSeconds: {{ .Values.livenessProbe.periodSeconds }} - successThreshold: {{ .Values.livenessProbe.successThreshold }} - timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }} - httpGet: - path: / - port: {{ .Values.service.internalPort }} - readinessProbe: - httpGet: - path: / - port: {{ .Values.service.internalPort }} - resources: -{{ toYaml .Values.resources | indent 12 }} - env: -{{ toYaml .Values.env | indent 10 }} diff --git a/examples/Jenkins-K8s-Plugin/charts/example/templates/horizontal_pod_autoscaler.yaml b/examples/Jenkins-K8s-Plugin/charts/example/templates/horizontal_pod_autoscaler.yaml deleted file mode 100644 index 2def7c62..00000000 --- a/examples/Jenkins-K8s-Plugin/charts/example/templates/horizontal_pod_autoscaler.yaml +++ /dev/null @@ -1,14 +0,0 @@ -{{- if .Values.hpa.enabled }} -apiVersion: autoscaling/v1 -kind: HorizontalPodAutoscaler -metadata: - name: {{ template "chart.name" . }} -spec: - minReplicas: {{ .Values.hpa.minReplicas }} - maxReplicas: {{ .Values.hpa.maxReplicas }} - scaleTargetRef: - apiVersion: extensions/v1beta1 - kind: Deployment - name: {{ template "chart.name" . }} -{{ toYaml .Values.hpa.targets | indent 2 }} -{{ end }} diff --git a/examples/Jenkins-K8s-Plugin/charts/example/templates/service.yaml b/examples/Jenkins-K8s-Plugin/charts/example/templates/service.yaml deleted file mode 100644 index e7672814..00000000 --- a/examples/Jenkins-K8s-Plugin/charts/example/templates/service.yaml +++ /dev/null @@ -1,26 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: {{ template "chart.name" . }} - labels: - app: {{ template "chart.name" . }} - chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }} - release: {{ .Release.Name }} - heritage: {{ .Release.Service }} - {{- if .Values.labels.dns }} - dns: {{ .Values.labels.dns }} - {{- end }} - {{- if .Values.nodeSelector }} - annotations: - {{ toYaml .Values.annotations }} - {{- end }} -spec: - type: {{ .Values.service.type }} - ports: - - port: {{ .Values.service.externalPort }} - targetPort: {{ .Values.service.internalPort }} - protocol: TCP - name: {{ .Values.service.name }} - selector: - app: {{ template "chart.name" . }} - release: {{ .Release.Name }} diff --git a/examples/Jenkins-K8s-Plugin/charts/example/values.yaml b/examples/Jenkins-K8s-Plugin/charts/example/values.yaml deleted file mode 100644 index 40a7340e..00000000 --- a/examples/Jenkins-K8s-Plugin/charts/example/values.yaml +++ /dev/null @@ -1,38 +0,0 @@ -# Default values for chart. -# This is a YAML-formatted file. -# Declare variables to be passed into your templates. -replicaCount: 3 -image: - repository: nginx - tag: latest - pullPolicy: IfNotPresent -livenessProbe: - failureThreshold: 3 - initialDelaySeconds: 3 - periodSeconds: 1 - successThreshold: 1 - timeoutSeconds: 1 -service: - name: http - type: LoadBalancer - externalPort: 80 - internalPort: 5000 - annotations: - domainName: "default.example.com" -labels: - dns: route53 -resources: - limits: - cpu: 100m - memory: 128Mi - requests: - cpu: 100m - memory: 128Mi -hpa: - enabled: False - -env: - - name: EXAMPLE1 - value: 'VAlUE_1' - - name: EXAMPLE2 - value: 'VALUE_2' diff --git a/examples/Jenkins-K8s-Plugin/deploy/development.config b/examples/Jenkins-K8s-Plugin/deploy/development.config deleted file mode 100644 index 645a8ad7..00000000 --- a/examples/Jenkins-K8s-Plugin/deploy/development.config +++ /dev/null @@ -1,6 +0,0 @@ -NAMESPACE='development' - -HELM_CHARTS=('charts/example') -HELM_RELEASE_NAMES=('example') -HELM_VALUES=('development/example') -HELM_TIMEOUTS=('400', '600') diff --git a/examples/Jenkins-K8s-Plugin/deploy/development/example.values.yml b/examples/Jenkins-K8s-Plugin/deploy/development/example.values.yml deleted file mode 100644 index 3fd51fdd..00000000 --- a/examples/Jenkins-K8s-Plugin/deploy/development/example.values.yml +++ /dev/null @@ -1,4 +0,0 @@ -configmap: - data: - example-data: example-value - example-data2: example-value2 diff --git a/examples/Jenkins-K8s-Plugin/deploy/production.config b/examples/Jenkins-K8s-Plugin/deploy/production.config deleted file mode 100644 index 0682914b..00000000 --- a/examples/Jenkins-K8s-Plugin/deploy/production.config +++ /dev/null @@ -1,6 +0,0 @@ -NAMESPACE='production' - -HELM_CHARTS=('charts/example') -HELM_RELEASE_NAMES=('example') -HELM_VALUES=('production/example') -HELM_TIMEOUTS=('600') diff --git a/examples/Jenkins-K8s-Plugin/deploy/production/example.values.yml b/examples/Jenkins-K8s-Plugin/deploy/production/example.values.yml deleted file mode 100644 index 31aeaa18..00000000 --- a/examples/Jenkins-K8s-Plugin/deploy/production/example.values.yml +++ /dev/null @@ -1,10 +0,0 @@ -configmap: - data: - example-data: example-value - example-data2: example-value2 -hpa: - enabled: True - targets: - targetCPUUtilizationPercentage: 10 - minReplicas: 1 - maxReplicas: 10 diff --git a/examples/Jenkins-K8s-Plugin/deploy/staging.config b/examples/Jenkins-K8s-Plugin/deploy/staging.config deleted file mode 100644 index 2445143f..00000000 --- a/examples/Jenkins-K8s-Plugin/deploy/staging.config +++ /dev/null @@ -1,11 +0,0 @@ -NAMESPACE='staging' - -EXTERNAL_REGISTRY_BASE_DOMAIN=quay.io/example-org -REPOSITORY_NAME='example' -DOCKERTAG=quay.io/example-org/example -DOCKERFILE='Dockerfile' - -HELM_CHARTS=('charts/example') -HELM_RELEASE_NAMES=('example') -HELM_VALUES=('staging/example') -HELM_TIMEOUTS=('600') diff --git a/examples/Jenkins-K8s-Plugin/deploy/staging/example.values.yml b/examples/Jenkins-K8s-Plugin/deploy/staging/example.values.yml deleted file mode 100644 index 31aeaa18..00000000 --- a/examples/Jenkins-K8s-Plugin/deploy/staging/example.values.yml +++ /dev/null @@ -1,10 +0,0 @@ -configmap: - data: - example-data: example-value - example-data2: example-value2 -hpa: - enabled: True - targets: - targetCPUUtilizationPercentage: 10 - minReplicas: 1 - maxReplicas: 10 diff --git a/examples/CircleCI-20/.circleci/config.yml b/examples/ci/.circleci/config.yml similarity index 100% rename from examples/CircleCI-20/.circleci/config.yml rename to examples/ci/.circleci/config.yml diff --git a/examples/ci/.gitlab-ci.yml b/examples/ci/.gitlab-ci.yml new file mode 100644 index 00000000..2be28b7e --- /dev/null +++ b/examples/ci/.gitlab-ci.yml @@ -0,0 +1,78 @@ +stages: + - build + - deploy + +variables: + GCLOUDSDK_CONTAINER_USE_V1_CLIENT: "false" + GOOGLE_APPLICATION_CREDENTIALS: /tmp/gcloud_key.json + GCP_REGION: us-west1 + CI_SHA1: $CI_COMMIT_SHA + CI_BRANCH: $CI_COMMIT_REF_NAME + CI_BUILD_NUM: $CI_JOB_ID + CI_TAG: $CI_COMMIT_TAG + DOCKER_HOST: tcp://localhost:2375 + DOCKER_DRIVER: overlay2 + +image: quay.io/reactiveops/ci-images:v7-alpine +services: + - docker:dind + +.aliases: + - &initialize-dev | + export GCP_PROJECT=sample-dev-project + export CLUSTER_NAME=sample-dev-cluster + export GCLOUD_KEY=$GCLOUD_KEY_DEV + export ROK8S_CONFIG="deploy/development.config" + prepare-gcloud + + - &initialize-staging | + export GCP_PROJECT=sample-staging-project + export CLUSTER_NAME=sample-staging-cluster + export GCLOUD_KEY=$GCLOUD_KEY_STAGING + export ROK8S_CONFIG="deploy/staging.config" + prepare-gcloud + + - &initialize-prod | + export GCP_PROJECT=sample-staging-project + export CLUSTER_NAME=sample-staging-cluster + export GCLOUD_KEY=$GCLOUD_KEY_PROD + export ROK8S_CONFIG="deploy/production.config" + prepare-gcloud + +build: + stage: build + script: + - *initialize-dev + - docker-build -f $ROK8S_CONFIG + - docker-push -f $ROK8S_CONFIG + +deploy_development: + stage: deploy + environment: + name: development + script: + - *initialize-dev + - helm-deploy -f $ROK8S_CONFIG + only: + - /^dev-.*/ + +deploy_staging: + stage: deploy + environment: + name: staging + script: + - *initialize-staging + - helm-deploy -f $ROK8S_CONFIG + only: + - master + +deploy_production: + stage: deploy + environment: + name: production + script: + - *initialize-prod + - helm-deploy -f $ROK8S_CONFIG + only: + - /^v.*/ + when: manual \ No newline at end of file diff --git a/examples/CircleCI-20/Dockerfile b/examples/ci/Dockerfile similarity index 100% rename from examples/CircleCI-20/Dockerfile rename to examples/ci/Dockerfile diff --git a/examples/Jenkins-K8s-Plugin/Jenkinsfile b/examples/ci/Jenkinsfile similarity index 100% rename from examples/Jenkins-K8s-Plugin/Jenkinsfile rename to examples/ci/Jenkinsfile diff --git a/examples/ci/bitbucket-pipelines.yml b/examples/ci/bitbucket-pipelines.yml new file mode 100644 index 00000000..1044c09c --- /dev/null +++ b/examples/ci/bitbucket-pipelines.yml @@ -0,0 +1,88 @@ +image: quay.io/reactiveops/ci-images:v7-stretch + +aliases: + - &initialize-env | + export GCLOUDSDK_CONTAINER_USE_V1_CLIENT="false" + export GOOGLE_APPLICATION_CREDENTIALS="${ROK8S_TMP:-${HOME}}/gcloud-service-key.json" + export GCP_REGIONAL_CLUSTER=true + export GCP_REGION=us-central1 + export CI_SHA1=$BITBUCKET_COMMIT + export CI_BRANCH=$BITBUCKET_BRANCH + export CI_BUILD_NUM=$BITBUCKET_BUILD_NUMBER + export CI_TAG=$BITBUCKET_TAG + + - &initialize-dev | + export GCP_PROJECT=sample-dev-project + export CLUSTER_NAME=sample-dev-cluster + export GCLOUD_KEY=$GCLOUD_KEY_DEV + export ROK8S_CONFIG="deploy/development.config" + prepare-gcloud + + - &initialize-staging | + export GCP_PROJECT=sample-staging-project + export CLUSTER_NAME=sample-staging-cluster + export GCLOUD_KEY=$GCLOUD_KEY_STAGING + export ROK8S_CONFIG="deploy/staging.config" + prepare-gcloud + + - &initialize-prod | + export GCP_PROJECT=sample-staging-project + export CLUSTER_NAME=sample-staging-cluster + export GCLOUD_KEY=$GCLOUD_KEY_PROD + export ROK8S_CONFIG="deploy/production.config" + prepare-gcloud + + - build-and-push-step: &build-and-push-step + name: Build and Push + services: + - docker + caches: + - docker + script: + - *initialize-env + - *initialize-dev + - docker-build -f $ROK8S_CONFIG + - docker-push -f $ROK8S_CONFIG + + - deploy-dev-step: &deploy-dev-step + name: Deploy Development + deployment: test + script: + - *initialize-env + - *initialize-dev + - helm-deploy -f $ROK8S_CONFIG + + - deploy-staging-step: &deploy-staging-step + name: Deploy Staging + deployment: staging + script: + - *initialize-env + - *initialize-staging + - helm-deploy -f $ROK8S_CONFIG + + - deploy-prod-step: &deploy-prod-step + name: Deploy Production + deployment: production + trigger: manual + script: + - *initialize-env + - *initialize-prod + - helm-deploy -f $ROK8S_CONFIG + +options: + docker: true + +pipelines: + default: + - step: *build-and-push-step + - step: *deploy-dev-step + + branches: + master: + - step: *build-and-push-step + - step: *deploy-staging-step + + tags: + release-*: + - step: *build-and-push-step + - step: *deploy-prod-step diff --git a/examples/CircleCI-20/charts/example/.helmignore b/examples/ci/charts/example/.helmignore similarity index 100% rename from examples/CircleCI-20/charts/example/.helmignore rename to examples/ci/charts/example/.helmignore diff --git a/examples/CircleCI-20/charts/example/Chart.yaml b/examples/ci/charts/example/Chart.yaml similarity index 100% rename from examples/CircleCI-20/charts/example/Chart.yaml rename to examples/ci/charts/example/Chart.yaml diff --git a/examples/CircleCI-20/charts/example/templates/NOTES.txt b/examples/ci/charts/example/templates/NOTES.txt similarity index 100% rename from examples/CircleCI-20/charts/example/templates/NOTES.txt rename to examples/ci/charts/example/templates/NOTES.txt diff --git a/examples/CircleCI-20/charts/example/templates/_helpers.tpl b/examples/ci/charts/example/templates/_helpers.tpl similarity index 100% rename from examples/CircleCI-20/charts/example/templates/_helpers.tpl rename to examples/ci/charts/example/templates/_helpers.tpl diff --git a/examples/CircleCI-20/charts/example/templates/configmap.yaml b/examples/ci/charts/example/templates/configmap.yaml similarity index 100% rename from examples/CircleCI-20/charts/example/templates/configmap.yaml rename to examples/ci/charts/example/templates/configmap.yaml diff --git a/examples/CircleCI-20/charts/example/templates/deployment.yaml b/examples/ci/charts/example/templates/deployment.yaml similarity index 100% rename from examples/CircleCI-20/charts/example/templates/deployment.yaml rename to examples/ci/charts/example/templates/deployment.yaml diff --git a/examples/CircleCI-20/charts/example/templates/horizontal_pod_autoscaler.yaml b/examples/ci/charts/example/templates/horizontal_pod_autoscaler.yaml similarity index 100% rename from examples/CircleCI-20/charts/example/templates/horizontal_pod_autoscaler.yaml rename to examples/ci/charts/example/templates/horizontal_pod_autoscaler.yaml diff --git a/examples/CircleCI-20/charts/example/templates/service.yaml b/examples/ci/charts/example/templates/service.yaml similarity index 100% rename from examples/CircleCI-20/charts/example/templates/service.yaml rename to examples/ci/charts/example/templates/service.yaml diff --git a/examples/CircleCI-20/charts/example/values.yaml b/examples/ci/charts/example/values.yaml similarity index 100% rename from examples/CircleCI-20/charts/example/values.yaml rename to examples/ci/charts/example/values.yaml diff --git a/examples/CircleCI-20/deploy/development.config b/examples/ci/deploy/development.config similarity index 100% rename from examples/CircleCI-20/deploy/development.config rename to examples/ci/deploy/development.config diff --git a/examples/CircleCI-20/deploy/development/example.values.yml b/examples/ci/deploy/development/example.values.yml similarity index 100% rename from examples/CircleCI-20/deploy/development/example.values.yml rename to examples/ci/deploy/development/example.values.yml diff --git a/examples/CircleCI-20/deploy/production.config b/examples/ci/deploy/production.config similarity index 100% rename from examples/CircleCI-20/deploy/production.config rename to examples/ci/deploy/production.config diff --git a/examples/CircleCI-20/deploy/production/example.values.yml b/examples/ci/deploy/production/example.values.yml similarity index 100% rename from examples/CircleCI-20/deploy/production/example.values.yml rename to examples/ci/deploy/production/example.values.yml diff --git a/examples/CircleCI-20/deploy/staging.config b/examples/ci/deploy/staging.config similarity index 100% rename from examples/CircleCI-20/deploy/staging.config rename to examples/ci/deploy/staging.config diff --git a/examples/CircleCI-20/deploy/staging/example.values.yml b/examples/ci/deploy/staging/example.values.yml similarity index 100% rename from examples/CircleCI-20/deploy/staging/example.values.yml rename to examples/ci/deploy/staging/example.values.yml