|
1 | 1 | --- |
2 | 2 | # commands to build an image |
3 | | -# |
| 3 | +- name: check if image is a tag and check environment |
| 4 | + tags: deploy |
| 5 | + set_fact: |
| 6 | + is_image_tag: '{{ git_branch | match("^v([0-9]+)\.([0-9]+)\.([0-9]+)$") }}' |
| 7 | + is_production_delta: '{{ node_env is defined and node_env=="production-delta" }}' |
| 8 | + |
4 | 9 | - name: Ensure Tag Deploy For Prod |
5 | 10 | tags: deploy |
6 | | - when: node_env is defined and node_env=="production-delta" and not git_branch | match("^v([0-9]+)\.([0-9]+)\.([0-9]+)$") |
7 | | - fail: msg="only tag can be deployed on prod not {{ git_branch }}" |
| 11 | + when: (is_production_delta and not is_image_tag) |
| 12 | + fail: msg="only tag can be deployed on prod not {{ container_tag }}" |
| 13 | + |
| 14 | +- name: set if is image tag and production delta |
| 15 | + tags: deploy |
| 16 | + set_fact: |
| 17 | + is_prod_and_tag: "{{ is_image_tag and is_production_delta }}" |
| 18 | + |
| 19 | +- name: query registry for tag |
| 20 | + tags: deploy |
| 21 | + uri: |
| 22 | + # Overwrite the name of the image repository (`runnable-angular`, big-poppa-http) with `repository_name` |
| 23 | + url: https://quay.io/api/v1/repository/runnable/{{ repository_name | default(name) }}/tag/?limit=1&specificTag={{ container_tag }} |
| 24 | + method: GET |
| 25 | + headers: |
| 26 | + Authorization: 'Bearer QB9UzzNhwClqMgRyMgNGrSGLdUYZPJLJALdcpKRa' |
| 27 | + register: currently_built_tags |
| 28 | + |
| 29 | +- name: set number of images built |
| 30 | + tags: deploy |
| 31 | + set_fact: |
| 32 | + no_images_found: "{{ currently_built_tags|json_query('json.tags')|length == 0 }}" |
| 33 | + |
| 34 | +- name: set number of images built |
| 35 | + tags: deploy |
| 36 | + set_fact: |
| 37 | + # Only build the image if no images are found |
| 38 | + # Use built images in staging/gamma unless forced |
| 39 | + build_image: '{{ no_images_found or (force_image_push is defined and force_image_push) }}' |
| 40 | + # Only push the image if on prod environment |
| 41 | + # Also, only push image if and no images are found or image push is forced |
| 42 | + # Use `-e "force_push_image=true"` in the command line to force image push |
| 43 | + push_image: '{{ is_prod_and_tag and (no_images_found or (force_image_push is defined and force_image_push)) }}' |
| 44 | + |
| 45 | +- name: debug |
| 46 | + debug: |
| 47 | + msg: 'build_image: {{ build_image }}, push_image: {{ push_image }}, no_images_found: {{ no_images_found }}, is_prod_and_tag: {{ is_prod_and_tag }}' |
8 | 48 |
|
9 | 49 | - name: create build folder |
10 | 50 | become: true |
| 51 | + when: build_image |
11 | 52 | file: |
12 | 53 | path: "{{ build_dir }}/{{ name }}" |
13 | 54 | state: directory |
14 | 55 |
|
15 | 56 | - name: pull the git repository |
16 | 57 | tags: deploy |
| 58 | + when: build_image |
17 | 59 | become: true |
18 | 60 | git: |
19 | 61 | repo: "{{ repo }}" |
20 | 62 | dest: "{{ build_dir }}/{{ name }}/repo" |
21 | | - version: "{{ git_branch }}" |
| 63 | + version: "{{ container_tag }}" |
22 | 64 | update: yes |
23 | 65 | accept_hostkey: yes |
24 | 66 | force: yes |
25 | 67 |
|
26 | 68 | - name: get new tags from remote |
27 | 69 | tags: deploy |
| 70 | + when: build_image |
28 | 71 | become: true |
29 | 72 | shell: "git fetch --tags" |
30 | 73 | args: |
31 | 74 | chdir: "{{ build_dir }}/{{ name }}/repo" |
32 | 75 |
|
33 | 76 | - name: get latest tag name |
34 | 77 | tags: deploy |
| 78 | + when: build_image |
35 | 79 | become: true |
36 | 80 | shell: "git describe --tags `git rev-list --tags --max-count=1`" |
37 | 81 | args: |
|
40 | 84 |
|
41 | 85 | - name: ensure latest tag is deployed |
42 | 86 | tags: deploy |
43 | | - fail: msg="Cannot deploy -{{ git_branch }}- because latest is -{{latest_tag.stdout}}-. Bypass with `-t i_am_deploying_an_old_tag`" |
44 | | - when: (node_env is not defined or node_env is defined and node_env=="production-delta") and |
45 | | - (latest_tag.stdout != git_branch and i_am_deploying_an_old_tag is not defined) |
| 87 | + fail: msg="Cannot deploy {{ container_tag}} because latest is {{latest_tag.stdout}}. Bypass with `-t i_am_deploying_an_old_tag`" |
| 88 | + when: build_image and is_production_delta and (latest_tag.stdout != container_tag and i_am_deploying_an_old_tag is not defined) |
46 | 89 |
|
47 | 90 | - name: copy dockerfile to build folder |
48 | 91 | tags: deploy |
| 92 | + when: build_image |
49 | 93 | become: true |
50 | 94 | template: |
51 | 95 | src: "{{ dockerfile }}" |
52 | 96 | dest: "{{ build_dir }}/{{ name }}" |
53 | 97 |
|
54 | 98 | - name: copy .dockerignore file into build folder |
55 | 99 | tags: deploy |
| 100 | + when: build_image |
56 | 101 | become: true |
57 | 102 | template: |
58 | 103 | src: ".dockerignore" |
59 | 104 | dest: "{{ build_dir }}/{{ name }}" |
60 | 105 |
|
61 | 106 | - name: copy secrets into build dir |
62 | 107 | tags: [ deploy ] |
| 108 | + when: build_image |
63 | 109 | become: true |
64 | 110 | copy: |
65 | 111 | src=./secrets/docker-client/{{ file_name_item }} |
|
75 | 121 |
|
76 | 122 | - name: build docker image and tag |
77 | 123 | tags: deploy |
| 124 | + when: build_image |
78 | 125 | become: yes |
79 | 126 | command: docker build {{ build_args | default("") }} --tag="{{ container_image }}:{{ container_tag }}" "{{ build_dir }}/{{ name }}" |
80 | 127 |
|
81 | 128 | - name: remove secrets from build dir |
82 | 129 | tags: [ deploy ] |
| 130 | + when: build_image |
83 | 131 | become: true |
84 | 132 | file: |
85 | 133 | path: "{{ build_dir }}/{{ name }}/{{ file_name_item }}" |
|
90 | 138 | loop_control: |
91 | 139 | loop_var: file_name_item |
92 | 140 |
|
93 | | -- name: set whether image will be pushed |
94 | | - when: git_branch | match("^v([0-9]+)\.([0-9]+)\.([0-9]+)$") and ((node_env is defined and node_env=='production-delta') or force_push_image) |
95 | | - set_fact: |
96 | | - push_image: true |
97 | | - |
98 | | -- name: login to docker hub |
| 141 | +- name: login to registry |
| 142 | + tags: deploy |
99 | 143 | become: yes |
100 | | - when: push_image is defined |
101 | | - command: docker login -u {{ docker_hub_username }} -p {{ docker_hub_password }} |
| 144 | + when: build_image and push_image |
| 145 | + command: docker login -u {{ registry_username }} -p {{ registry_token }} {{ registry_host }} |
102 | 146 |
|
103 | 147 | - name: push docker image |
| 148 | + tags: deploy |
104 | 149 | become: yes |
105 | | - when: push_image is defined |
| 150 | + when: build_image and push_image |
106 | 151 | command: docker push {{ container_image }}:{{ container_tag }} |
107 | 152 |
|
108 | | -- name: logout of docker hub |
| 153 | +- name: logout of registry |
| 154 | + tags: deploy |
109 | 155 | become: yes |
110 | | - when: push_image is defined |
| 156 | + when: build_image and push_image |
111 | 157 | command: docker logout |
0 commit comments