From cd50192ff5c73077b721c6b971995192e375ce32 Mon Sep 17 00:00:00 2001 From: Julien Maupetit Date: Thu, 30 Aug 2018 10:22:40 +0200 Subject: [PATCH 1/3] =?UTF-8?q?=E2=9C=A8(build)=20add=20support=20for=20BC?= =?UTF-8?q?s=20+=20ISs=20objects?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Until now, BuildConfiguration and ImageStream objects were not required. Now that we need to add APM and customize images on a per-client basis, using the aforementionned objects seems the more relevant solution. --- group_vars/all/main.yml | 3 +++ group_vars/env_type/ci.yml | 6 ++++++ group_vars/env_type/development.yml | 6 ++++++ init_project.yml | 2 ++ tasks/create_app_image_streams.yml | 14 ++++++++++++++ tasks/get_objects_for_app.yml | 21 ++++++++++++++++++++- tasks/manage_app.yml | 3 ++- 7 files changed, 53 insertions(+), 2 deletions(-) create mode 100644 tasks/create_app_image_streams.yml diff --git a/group_vars/all/main.yml b/group_vars/all/main.yml index 55ed1c812..f6e7e9a70 100644 --- a/group_vars/all/main.yml +++ b/group_vars/all/main.yml @@ -62,6 +62,9 @@ job_stamp: null # docs/developer_guide/secrets.md secret_id: "1.0.0" +# OpenShift's internal docker registry server +internal_docker_registry: "docker-registry.default.svc:5000" + # TODO: move the following settings to the redirect app # Ports aliases_port: 8999 diff --git a/group_vars/env_type/ci.yml b/group_vars/env_type/ci.yml index 61d65f74f..49214f4d7 100644 --- a/group_vars/env_type/ci.yml +++ b/group_vars/env_type/ci.yml @@ -2,6 +2,12 @@ project_description: "A minimal project to test apps bootstrapping ({{ env_type }})" domain_name: "{{ lookup('env', 'OPENSHIFT_DOMAIN') }}.nip.io" +# OpenShift's internal docker registry server +# +# FIXME: use docker registry server IP address instead of the service name (i.e. +# docker-registry.default.svc) to prevent oc cluster DNS issues +internal_docker_registry: "172.30.1.1:5000" + apps: - name: hello - name: richie diff --git a/group_vars/env_type/development.yml b/group_vars/env_type/development.yml index 8e734b119..40aae1a69 100644 --- a/group_vars/env_type/development.yml +++ b/group_vars/env_type/development.yml @@ -1,6 +1,12 @@ # Variables specific to development environments domain_name: "{{ lookup('env', 'OPENSHIFT_DOMAIN') }}.nip.io" +# OpenShift's internal docker registry server +# +# FIXME: use docker registry server IP address instead of the service name (i.e. +# docker-registry.default.svc) to prevent oc cluster DNS issues +internal_docker_registry: "172.30.1.1:5000" + # Use development images in the development environment edxapp_image_tag: "hawthorn.1-1.0.0-dev" richie_image_tag: "0.1.0-alpha.3-alpine-dev" diff --git a/init_project.yml b/init_project.yml index 058d2040d..10bf5b7a6 100644 --- a/init_project.yml +++ b/init_project.yml @@ -24,7 +24,9 @@ - create_app_volumes - create_app_endpoints - create_static_services_routes + - create_app_image_streams tags: - volume - endpoint - route + - stream diff --git a/tasks/create_app_image_streams.yml b/tasks/create_app_image_streams.yml new file mode 100644 index 000000000..8961e9c19 --- /dev/null +++ b/tasks/create_app_image_streams.yml @@ -0,0 +1,14 @@ +--- +# Create volumes for an app + +- name: Print app name + debug: msg="App name {{ app.name }}" + tags: stream + +- name: Make sure image streams exist + openshift_raw: + definition: "{{ lookup('template', item) | from_yaml }}" + state: present + with_items: "{{ streams }}" + when: streams is defined + tags: stream diff --git a/tasks/get_objects_for_app.yml b/tasks/get_objects_for_app.yml index f591f85ff..4d446e543 100644 --- a/tasks/get_objects_for_app.yml +++ b/tasks/get_objects_for_app.yml @@ -1,4 +1,3 @@ ---- # Get objects for an application - name: Set templates list for this app @@ -8,17 +7,29 @@ - name: Set OpenShift objects to manage set_fact: + builds: "{{ templates | map('regex_search', '.*/bc.*\\.yml\\.j2$') | select('string') | list }}" deployments: "{{ templates | map('regex_search', '.*/dc.*\\.yml\\.j2$') | select('string') | list }}" services: "{{ templates | map('regex_search', '.*/svc\\.yml\\.j2$') | select('string') | list }}" + streams: "{{ templates | map('regex_search', '.*/is.*\\.yml\\.j2$') | select('string') | list }}" jobs: "{{ templates | map('regex_search', '.*/job_.*\\.yml\\.j2$') | select('string') | list }}" routes: "{{ templates | map('regex_search', '.*/route.*\\.yml\\.j2$') | select('string') | list }}" tags: - deploy + - build - deployment - service + - stream - job - route +- name: Display OpenShift's builds for this app + debug: + msg: "{{ builds | to_nice_yaml}}" + when: builds + tags: + - deploy + - build + - name: Display OpenShift's deployments for this app debug: msg: "{{ deployments | to_nice_yaml}}" @@ -35,6 +46,14 @@ - deploy - service +- name: Display OpenShift's image streams for this app + debug: + msg: "{{ streams | to_nice_yaml }}" + when: streams + tags: + - deploy + - stream + - name: Display OpenShift's jobs for this app debug: msg: "{{ jobs | to_nice_yaml }}" diff --git a/tasks/manage_app.yml b/tasks/manage_app.yml index e6cc0bc72..ce06910d5 100644 --- a/tasks/manage_app.yml +++ b/tasks/manage_app.yml @@ -1,4 +1,3 @@ ---- # Task set to manage apps # # Args: @@ -12,10 +11,12 @@ definition: "{{ lookup('template', item) | from_yaml }}" state: "{{ deployment_state | default('present') }}" with_items: + - "{{ builds }}" - "{{ deployments }}" - "{{ services }}" tags: - deploy + - build - deployment - service From debe193924f6632d9d23c052a489506cd15c2884 Mon Sep 17 00:00:00 2001 From: Julien Maupetit Date: Thu, 30 Aug 2018 10:32:20 +0200 Subject: [PATCH 2/3] =?UTF-8?q?=E2=9C=A8(edxapp)=20add=20ImageStream=20and?= =?UTF-8?q?=20BuildConfig?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We now use custom image build for edxapp using ImageStream and BuildConfig objects. --- apps/edxapp/templates/cms/_dc_base.yml.j2 | 4 +- apps/edxapp/templates/cms/bc.yml.j2 | 38 +++++++++++++++++++ apps/edxapp/templates/cms/is.yml.j2 | 8 ++++ .../templates/cms/job_01_collectstatic.yml.j2 | 4 +- .../templates/cms/job_04_db_migrate.yml.j2 | 4 +- .../templates/cms/job_05_load_fixtures.yml.j2 | 4 +- apps/edxapp/templates/lms/bc.yml.j2 | 38 +++++++++++++++++++ apps/edxapp/templates/lms/is.yml.j2 | 8 ++++ .../templates/lms/job_02_collectstatic.yml.j2 | 4 +- .../templates/lms/job_03_db_migrate.yml.j2 | 4 +- 10 files changed, 110 insertions(+), 6 deletions(-) create mode 100644 apps/edxapp/templates/cms/bc.yml.j2 create mode 100644 apps/edxapp/templates/cms/is.yml.j2 create mode 100644 apps/edxapp/templates/lms/bc.yml.j2 create mode 100644 apps/edxapp/templates/lms/is.yml.j2 diff --git a/apps/edxapp/templates/cms/_dc_base.yml.j2 b/apps/edxapp/templates/cms/_dc_base.yml.j2 index 18e583a2d..0903d966b 100644 --- a/apps/edxapp/templates/cms/_dc_base.yml.j2 +++ b/apps/edxapp/templates/cms/_dc_base.yml.j2 @@ -57,7 +57,9 @@ spec: value: {{ service_variant }} - name: DJANGO_SETTINGS_MODULE value: {{ service_variant }}.envs.fun.docker_run - image: "{{ edxapp_image_name }}:{{ edxapp_image_tag }}" + # We point to a local registry image build for this "live" image (see + # ImageStream and BuildConfig templates) + image: "{{ internal_docker_registry }}/{{ project_name }}/edxapp-{{ service_variant }}:{{ edxapp_image_tag }}-live" imagePullPolicy: IfNotPresent volumeMounts: - mountPath: /config diff --git a/apps/edxapp/templates/cms/bc.yml.j2 b/apps/edxapp/templates/cms/bc.yml.j2 new file mode 100644 index 000000000..526d83ef7 --- /dev/null +++ b/apps/edxapp/templates/cms/bc.yml.j2 @@ -0,0 +1,38 @@ +apiVersion: "v1" +kind: "BuildConfig" +metadata: + # FIXME + # + # As mentionned in the official documentation [1]: + # + # Configuration change triggers currently only work when creating a new + # BuildConfig. In a future release, configuration change triggers will also + # be able to launch a build whenever a BuildConfig is updated. + # + # Hence, we must force BuildConfig to always get created with a unique name. + # This is a temporary solution that needs to be improved as soon as OKD + # triggers a new build upon BC object update. + # + # References: + # + # 1. https://docs.okd.io/latest/dev_guide/builds/triggering_builds.html#config-change-triggers + name: "edxapp-cms-{{ deployment_stamp }}" + namespace: "{{ project_name }}" + labels: + app: "edxapp" + service: "cms" + version: "{{ edxapp_image_tag }}" + deployment_stamp: "{{ deployment_stamp }}" +spec: + strategy: + type: Docker + source: + dockerfile: |- + FROM {{ edxapp_image_name }}:{{ edxapp_image_tag }} + # Add new statements here + triggers: + - type: "ConfigChange" + output: + to: + kind: "ImageStreamTag" + name: "edxapp-cms:{{ edxapp_image_tag }}-live" diff --git a/apps/edxapp/templates/cms/is.yml.j2 b/apps/edxapp/templates/cms/is.yml.j2 new file mode 100644 index 000000000..2c0f95df9 --- /dev/null +++ b/apps/edxapp/templates/cms/is.yml.j2 @@ -0,0 +1,8 @@ +apiVersion: "v1" +kind: "ImageStream" +metadata: + name: "edxapp-cms" + namespace: "{{ project_name }}" + labels: + app: "edxapp" + service: "cms" diff --git a/apps/edxapp/templates/cms/job_01_collectstatic.yml.j2 b/apps/edxapp/templates/cms/job_01_collectstatic.yml.j2 index 848d3e989..db7066991 100644 --- a/apps/edxapp/templates/cms/job_01_collectstatic.yml.j2 +++ b/apps/edxapp/templates/cms/job_01_collectstatic.yml.j2 @@ -22,7 +22,9 @@ spec: spec: containers: - name: edxapp-cms-collectstatic-{{ job_stamp }} - image: "{{ edxapp_image_name }}:{{ edxapp_image_tag }}" + # We point to a local registry image build for this "live" image (see + # ImageStream and BuildConfig templates) + image: "{{ internal_docker_registry }}/{{ project_name }}/edxapp-cms:{{ edxapp_image_tag }}-live" env: - name: DJANGO_SETTINGS_MODULE value: cms.envs.fun.docker_run diff --git a/apps/edxapp/templates/cms/job_04_db_migrate.yml.j2 b/apps/edxapp/templates/cms/job_04_db_migrate.yml.j2 index 1fb6faf34..981c470a6 100644 --- a/apps/edxapp/templates/cms/job_04_db_migrate.yml.j2 +++ b/apps/edxapp/templates/cms/job_04_db_migrate.yml.j2 @@ -22,7 +22,9 @@ spec: spec: containers: - name: edxapp-cms-dbmigrate-{{ job_stamp }} - image: "{{ edxapp_image_name }}:{{ edxapp_image_tag }}" + # We point to a local registry image build for this "live" image (see + # ImageStream and BuildConfig templates) + image: "{{ internal_docker_registry }}/{{ project_name }}/edxapp-cms:{{ edxapp_image_tag }}-live" env: - name: DJANGO_SETTINGS_MODULE value: cms.envs.fun.docker_run diff --git a/apps/edxapp/templates/cms/job_05_load_fixtures.yml.j2 b/apps/edxapp/templates/cms/job_05_load_fixtures.yml.j2 index 945f62efc..0846ec794 100644 --- a/apps/edxapp/templates/cms/job_05_load_fixtures.yml.j2 +++ b/apps/edxapp/templates/cms/job_05_load_fixtures.yml.j2 @@ -22,7 +22,9 @@ spec: spec: containers: - name: edxapp-cms-load-fixtures-{{ job_stamp }} - image: "{{ edxapp_image_name }}:{{ edxapp_image_tag }}" + # We point to a local registry image build for this "live" image (see + # ImageStream and BuildConfig templates) + image: "{{ internal_docker_registry }}/{{ project_name }}/edxapp-cms:{{ edxapp_image_tag }}-live" env: - name: DJANGO_SETTINGS_MODULE value: cms.envs.fun.docker_run diff --git a/apps/edxapp/templates/lms/bc.yml.j2 b/apps/edxapp/templates/lms/bc.yml.j2 new file mode 100644 index 000000000..4139bca92 --- /dev/null +++ b/apps/edxapp/templates/lms/bc.yml.j2 @@ -0,0 +1,38 @@ +apiVersion: "v1" +kind: "BuildConfig" +metadata: + # FIXME + # + # As mentionned in the official documentation [1]: + # + # Configuration change triggers currently only work when creating a new + # BuildConfig. In a future release, configuration change triggers will also + # be able to launch a build whenever a BuildConfig is updated. + # + # Hence, we must force BuildConfig to always get created with a unique name. + # This is a temporary solution that needs to be improved as soon as OKD + # triggers a new build upon BC object update. + # + # References: + # + # 1. https://docs.okd.io/latest/dev_guide/builds/triggering_builds.html#config-change-triggers + name: "edxapp-lms-{{ deployment_stamp }}" + namespace: "{{ project_name }}" + labels: + app: "edxapp" + service: "lms" + version: "{{ edxapp_image_tag }}" + deployment_stamp: "{{ deployment_stamp }}" +spec: + strategy: + type: Docker + source: + dockerfile: |- + FROM {{ edxapp_image_name }}:{{ edxapp_image_tag }} + # Add new statements here + triggers: + - type: "ConfigChange" + output: + to: + kind: "ImageStreamTag" + name: "edxapp-lms:{{ edxapp_image_tag }}-live" diff --git a/apps/edxapp/templates/lms/is.yml.j2 b/apps/edxapp/templates/lms/is.yml.j2 new file mode 100644 index 000000000..a93535931 --- /dev/null +++ b/apps/edxapp/templates/lms/is.yml.j2 @@ -0,0 +1,8 @@ +apiVersion: "v1" +kind: "ImageStream" +metadata: + name: "edxapp-lms" + namespace: "{{ project_name }}" + labels: + app: "edxapp" + service: "lms" diff --git a/apps/edxapp/templates/lms/job_02_collectstatic.yml.j2 b/apps/edxapp/templates/lms/job_02_collectstatic.yml.j2 index 159c77b04..0152a906d 100644 --- a/apps/edxapp/templates/lms/job_02_collectstatic.yml.j2 +++ b/apps/edxapp/templates/lms/job_02_collectstatic.yml.j2 @@ -22,7 +22,9 @@ spec: spec: containers: - name: edxapp-lms-collectstatic-{{ job_stamp }} - image: "{{ edxapp_image_name }}:{{ edxapp_image_tag }}" + # We point to a local registry image build for this "live" image (see + # ImageStream and BuildConfig templates) + image: "{{ internal_docker_registry }}/{{ project_name }}/edxapp-lms:{{ edxapp_image_tag }}-live" env: - name: DJANGO_SETTINGS_MODULE value: lms.envs.fun.docker_run diff --git a/apps/edxapp/templates/lms/job_03_db_migrate.yml.j2 b/apps/edxapp/templates/lms/job_03_db_migrate.yml.j2 index 877d1c931..33b0748b4 100644 --- a/apps/edxapp/templates/lms/job_03_db_migrate.yml.j2 +++ b/apps/edxapp/templates/lms/job_03_db_migrate.yml.j2 @@ -22,7 +22,9 @@ spec: spec: containers: - name: edxapp-lms-dbmigrate-{{ job_stamp }} - image: "{{ edxapp_image_name }}:{{ edxapp_image_tag }}" + # We point to a local registry image build for this "live" image (see + # ImageStream and BuildConfig templates) + image: "{{ internal_docker_registry }}/{{ project_name }}/edxapp-lms:{{ edxapp_image_tag }}-live" env: - name: DJANGO_SETTINGS_MODULE value: lms.envs.fun.docker_run From 03f2f2a702c69bbbf709e926334337c489145d20 Mon Sep 17 00:00:00 2001 From: Julien Maupetit Date: Mon, 3 Sep 2018 17:09:48 +0200 Subject: [PATCH 3/3] =?UTF-8?q?=E2=9C=A8(richie)=20add=20ImageStream=20and?= =?UTF-8?q?=20BuildConfig?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Service pods are now based on a locally built image instead of DockerHub's raw image. This allows us to add project-specific contrains or customization. --- apps/richie/templates/app/bc.yml.j2 | 38 +++++++++++++++++++ apps/richie/templates/app/dc.yml.j2 | 6 ++- apps/richie/templates/app/is.yml.j2 | 8 ++++ .../templates/app/job_collectstatic.yml.j2 | 4 +- .../templates/app/job_db_migrate.yml.j2 | 4 +- .../app/job_regenerate_indexes.yml.j2 | 4 +- 6 files changed, 59 insertions(+), 5 deletions(-) create mode 100644 apps/richie/templates/app/bc.yml.j2 create mode 100644 apps/richie/templates/app/is.yml.j2 diff --git a/apps/richie/templates/app/bc.yml.j2 b/apps/richie/templates/app/bc.yml.j2 new file mode 100644 index 000000000..4e80b9128 --- /dev/null +++ b/apps/richie/templates/app/bc.yml.j2 @@ -0,0 +1,38 @@ +apiVersion: "v1" +kind: "BuildConfig" +metadata: + # FIXME + # + # As mentionned in the official documentation [1]: + # + # Configuration change triggers currently only work when creating a new + # BuildConfig. In a future release, configuration change triggers will also + # be able to launch a build whenever a BuildConfig is updated. + # + # Hence, we must force BuildConfig to always get created with a unique name. + # This is a temporary solution that needs to be improved as soon as OKD + # triggers a new build upon BC object update. + # + # References: + # + # 1. https://docs.okd.io/latest/dev_guide/builds/triggering_builds.html#config-change-triggers + name: "richie-{{ deployment_stamp }}" + namespace: "{{ project_name }}" + labels: + app: "richie" + service: "richie" + version: "{{ richie_image_tag }}" + deployment_stamp: "{{ deployment_stamp }}" +spec: + strategy: + type: Docker + source: + dockerfile: |- + FROM {{ richie_image_name }}:{{ richie_image_tag }} + # Add new statements here + triggers: + - type: "ConfigChange" + output: + to: + kind: "ImageStreamTag" + name: "richie:{{ richie_image_tag }}-live" diff --git a/apps/richie/templates/app/dc.yml.j2 b/apps/richie/templates/app/dc.yml.j2 index ac2ac7a63..974835e81 100644 --- a/apps/richie/templates/app/dc.yml.j2 +++ b/apps/richie/templates/app/dc.yml.j2 @@ -9,7 +9,7 @@ metadata: name: "richie-app-{{ deployment_stamp }}" namespace: "{{ project_name }}" spec: - replicas: 1 # number of pods we want + replicas: 1 # number of pods we want template: metadata: labels: @@ -21,7 +21,9 @@ spec: spec: containers: - name: richie - image: "{{ richie_image_name }}:{{ richie_image_tag }}" + # We point to a local registry image build for this "live" image (see + # ImageStream and BuildConfig templates) + image: "{{ internal_docker_registry }}/{{ project_name }}/richie:{{ richie_image_tag }}-live" imagePullPolicy: IfNotPresent env: - name: DJANGO_SETTINGS_MODULE diff --git a/apps/richie/templates/app/is.yml.j2 b/apps/richie/templates/app/is.yml.j2 new file mode 100644 index 000000000..d3c737e09 --- /dev/null +++ b/apps/richie/templates/app/is.yml.j2 @@ -0,0 +1,8 @@ +apiVersion: "v1" +kind: "ImageStream" +metadata: + name: "richie" + namespace: "{{ project_name }}" + labels: + app: "richie" + service: "richie" diff --git a/apps/richie/templates/app/job_collectstatic.yml.j2 b/apps/richie/templates/app/job_collectstatic.yml.j2 index e1542ba53..395c6549c 100644 --- a/apps/richie/templates/app/job_collectstatic.yml.j2 +++ b/apps/richie/templates/app/job_collectstatic.yml.j2 @@ -38,7 +38,9 @@ spec: envFrom: - secretRef: name: richie-{{ secret_id }} - image: "{{ richie_image_name }}:{{ richie_image_tag }}" + # We point to a local registry image build for this "live" image (see + # ImageStream and BuildConfig templates) + image: "{{ internal_docker_registry }}/{{ project_name }}/richie:{{ richie_image_tag }}-live" command: ["python", "manage.py", "collectstatic", "--noinput"] volumeMounts: - mountPath: /data/static diff --git a/apps/richie/templates/app/job_db_migrate.yml.j2 b/apps/richie/templates/app/job_db_migrate.yml.j2 index 747b0092b..6da67f29e 100644 --- a/apps/richie/templates/app/job_db_migrate.yml.j2 +++ b/apps/richie/templates/app/job_db_migrate.yml.j2 @@ -38,6 +38,8 @@ spec: envFrom: - secretRef: name: richie-{{ secret_id }} - image: "{{ richie_image_name }}:{{ richie_image_tag }}" + # We point to a local registry image build for this "live" image (see + # ImageStream and BuildConfig templates) + image: "{{ internal_docker_registry }}/{{ project_name }}/richie:{{ richie_image_tag }}-live" command: ["python", "manage.py", "migrate"] restartPolicy: Never diff --git a/apps/richie/templates/app/job_regenerate_indexes.yml.j2 b/apps/richie/templates/app/job_regenerate_indexes.yml.j2 index 08a615883..6138130e2 100644 --- a/apps/richie/templates/app/job_regenerate_indexes.yml.j2 +++ b/apps/richie/templates/app/job_regenerate_indexes.yml.j2 @@ -40,6 +40,8 @@ spec: envFrom: - secretRef: name: richie-{{ secret_id }} - image: "{{ richie_image_name }}:{{ richie_image_tag }}" + # We point to a local registry image build for this "live" image (see + # ImageStream and BuildConfig templates) + image: "{{ internal_docker_registry }}/{{ project_name }}/richie:{{ richie_image_tag }}-live" command: ["python", "manage.py", "regenerate_indexes"] restartPolicy: Never