-
Notifications
You must be signed in to change notification settings - Fork 2
193 lines (174 loc) · 5.77 KB
/
build_test_push.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
name: Build, Test & Push
on:
push:
branches:
- '**' # all branches
schedule:
- cron: '22 2 * * 1,3,5' # every monday, wednesday, friday - at 02:00h
workflow_dispatch:
inputs:
build:
description: "Run build steps? (yes/no)"
type: boolean
required: true
default: true
jobs:
flagTestBuild:
# Generate condition: if file/s changed involve changes on the image, or trigger is cron: test & build jobs must run
name: "Conditional: run test & build jobs"
runs-on: ubuntu-latest
outputs:
flag: ${{ env.flag }}
steps:
# Setup
- name: Checkout
uses: actions/checkout@master
with:
fetch-depth: 0
# Perform validation
- name: Verify if any of the image-involved files changed
id: changed-files
uses: tj-actions/changed-files@v11.5
with:
files: |
.dockerignore
Dockerfile
images.json
tools/**
scripts/**
- name: Set flag for triggering test & build jobs
if: ${{ steps.changed-files.outputs.any_changed == 'true' || github.event_name == 'schedule' || github.event.inputs.build == 'true' }}
run: echo "flag=true" >> $GITHUB_ENV
testBuild:
# Run "build" tests
name: Test (build)
runs-on: ubuntu-latest
if: ${{ needs.flagTestBuild.outputs.flag == 'true' }}
needs:
- flagTestBuild
steps:
# Setup
- name: Checkout
uses: actions/checkout@master
with:
fetch-depth: 1
- name: Setup Python
uses: actions/setup-python@master
with:
python-version: "3.8"
architecture: "x64"
- name: Install test requirements
run: make test-install-requirements
# Test
- name: Test "build"
run: make test-build
imagesMatrix:
# Parse and set the images matrix to be used by following jobs
name: Parse & Set images matrix
runs-on: ubuntu-latest
if: ${{ needs.flagTestBuild.outputs.flag == 'true' }}
needs:
- flagTestBuild
outputs:
matrix: ${{ steps.set_matrix.outputs.matrix }}
steps:
# Setup
- name: Checkout
uses: actions/checkout@master
with:
fetch-depth: 1
- name: Load & Set matrix variable
id: set_matrix
run: |
echo "::set-output name=matrix::$(echo $(cat images.json) | sed 's/ //g' )"
testNoBuild:
# Run "no-build" tests (pre-building image for linux/amd64)
name: "[${{ matrix.image.fromImage }}] Test (no-build)"
runs-on: ubuntu-latest
if: ${{ needs.flagTestBuild.outputs.flag == 'true' }}
needs:
- flagTestBuild
- testBuild
- imagesMatrix
strategy:
fail-fast: false
matrix:
image: ${{ fromJson(needs.imagesMatrix.outputs.matrix) }}
steps:
# Setup
- name: Checkout
uses: actions/checkout@master
with:
fetch-depth: 1
- name: Setup Python
uses: actions/setup-python@master
with:
python-version: "3.8"
architecture: "x64"
- name: Install test requirements
run: make test-install-requirements
- name: Set environment variables
run: |
echo "fromImage=${{ matrix.image.fromImage }}" >> $GITHUB_ENV
echo "toImage=python-git-app:${{ matrix.image.toTag }}" >> $GITHUB_ENV
# Build
- name: Docker cache
uses: satackey/action-docker-layer-caching@v0.0.11
continue-on-error: true
with:
key: "DockerPythonGitApp-docker-cache-${{ env.fromImage }}-{hash}"
restore-keys: "DockerPythonGitApp-docker-cache-${{ env.fromImage }}"
- name: Build
run: make build FROM_IMAGE=${{ env.fromImage }} TO_IMAGE=${{ env.toImage }}
- name: Test "no-build" (arch=default)
run: make test-nobuild FROM_IMAGE=${{ env.toImage }}
buildPush:
# Build and push to DockerHub if current branch is "master"
name: "[${{ matrix.image.fromImage }} -> ${{ matrix.image.toTag }}] Build & Push (multiarch)"
runs-on: ubuntu-latest
if: ${{ needs.flagTestBuild.outputs.flag == 'true' }}
needs:
- flagTestBuild
- testBuild
- testNoBuild
- imagesMatrix
strategy:
fail-fast: false
matrix:
image: ${{ fromJson(needs.imagesMatrix.outputs.matrix) }}
steps:
# Setup
- name: Checkout
uses: actions/checkout@master
with:
fetch-depth: 1
- name: Install QEMU
uses: docker/setup-qemu-action@v1
- name: Install Docker Buildx
uses: docker/setup-buildx-action@v1
- name: Set environment variables
run: |
echo "fromImage=${{ matrix.image.fromImage }}" >> $GITHUB_ENV
echo "toTag=${{ matrix.image.toTag }}" >> $GITHUB_ENV
echo "arch=${{ matrix.image.arch }}" >> $GITHUB_ENV
echo "buildxPush=false" >> $GITHUB_ENV
- name: Set buildx push flag
if: github.ref == 'refs/heads/master'
run: |
echo "buildxPush=true" >> $GITHUB_ENV
# Docker login
- name: Login to DockerHub
if: ${{ env.buildxPush == 'true' }}
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKER_USER }}
password: ${{ secrets.DOCKER_PASS }}
# Build & push for all archs
- name: Docker cache
uses: satackey/action-docker-layer-caching@v0.0.11
continue-on-error: true
with:
key: "DockerPythonGitApp-docker-cache-${{ matrix.base_tag }}-{hash}"
restore-keys: "DockerPythonGitApp-docker-cache-${{ matrix.base_tag }}"
- name: Build & Push for all archs
run: make buildx FROM_IMAGE=${{ env.fromImage }} TO_TAG=${{ env.toTag }} BUILDX_PUSH=${{ env.buildxPush }} ARCH=${{ env.arch }}