-
Notifications
You must be signed in to change notification settings - Fork 7
242 lines (224 loc) · 7.36 KB
/
build-test.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
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
# Copyright (C) 2021 ScyllaDB
name: Build & Test
on:
push:
# Restrict the branches to only those we want to promote from.
branches:
- 'master'
- 'v[0-9]+.[0-9]+'
# Act only on temporary tags, the final ones are created by manually promoting
# an existing candidate image, after it goes through QA. We need to be carefully
# to avoid overwriting those, building from the same sources may not result
# in the same image content that was tested, e.g. if a base image changed in the meantime.
tags:
- 'v[0-9]+.[0-9]+.[0-9]+-alpha.[0-9]+'
- 'v[0-9]+.[0-9]+.[0-9]+-beta.[0-9]+'
- 'v[0-9]+.[0-9]+.[0-9]+-rc.[0-9]+'
pull_request:
branches:
- '**'
types:
- opened
- edited
- reopened
- synchronize
env:
go_version: 1.21
GOPATH: ${{ github.workspace }}/go
git_repo_path: ${{ github.workspace }}/go/src/github.com/scylladb/k8s-local-volume-provisioner
image_repo_ref: docker.io/scylladb/k8s-local-volume-provisioner
retention_days: 7
defaults:
run:
shell: bash
working-directory: "./go/src/github.com/scylladb/k8s-local-volume-provisioner"
jobs:
verify:
name: Verify
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v3
with:
path: ${{ env.git_repo_path }}
- name: Setup go
uses: actions/setup-go@v3
with:
go-version: ${{ env.go_version }}
- name: Verify
run: make verify --warn-undefined-variables
verify-deps:
name: Verify dependencies
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v3
with:
path: ${{ env.git_repo_path }}
- name: Setup go
uses: actions/setup-go@v3
with:
go-version: ${{ env.go_version }}
- name: Verify dependencies
run: make verify-deps --warn-undefined-variables
build-and-test:
name: Build and test
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v3
with:
path: ${{ env.git_repo_path }}
fetch-depth: 0
- name: Setup git tags
if: ${{ startsWith(github.ref, 'refs/tags/') }}
run: ./hack/ci-detect-tags.sh
- name: Setup go
uses: actions/setup-go@v3
with:
go-version: ${{ env.go_version }}
- name: Build
run: make --warn-undefined-variables
- name: Make sure new unit tests aren't flaky
if: ${{ github.event_name == 'pull_request' }}
run: |
echo "GO_TEST_COUNT=-count=3" | tee -a ${GITHUB_ENV}
echo "GINKGO_TEST_COUNT=-repeat=3" | tee -a ${GITHUB_ENV}
- name: Test
run: make test --warn-undefined-variables
images:
name: Build images
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v3
with:
path: ${{ env.git_repo_path }}
fetch-depth: 0
- name: Setup git tags
if: ${{ startsWith(github.ref, 'refs/tags/') }}
run: ./hack/ci-detect-tags.sh
- name: Build image
run: |
set -euExo pipefail
shopt -s inherit_errexit
# Avoid podman permission error on Ubuntu 20.04 by using it as root, although it shouldn't be needed.
# Use --format=docker to support SHELL instruction in the Dockerfile. (SHELL didn't make it to OCI spec.)
sudo podman --cgroup-manager=cgroupfs build --format=docker --squash --network=none -f ./Dockerfile -t '${{ env.image_repo_ref }}:ci' .
sudo podman images '${{ env.image_repo_ref }}:ci'
sudo podman save '${{ env.image_repo_ref }}:ci' | lz4 - ~/driverimage.tar.lz4
- name: Upload image artifact
uses: actions/upload-artifact@v3
with:
name: driverimage.tar.lz4
path: ~/driverimage.tar.lz4
if-no-files-found: error
retention-days: ${{ env.retention_days }}
test-e2e-serial:
name: Test e2e serial
runs-on: ubuntu-22.04
needs: images
steps:
- uses: actions/checkout@v3
with:
path: ${{ env.git_repo_path }}
fetch-depth: 0
- name: Run e2e
uses: ./go/src/github.com/scylladb/k8s-local-volume-provisioner/.github/actions/run-e2e
with:
repositoryPath: ${{ env.git_repo_path }}
jobSuffix: "serial"
suite: "conformance/serial"
test-e2e-parallel:
name: Test e2e parallel
runs-on: ubuntu-22.04
needs: images
steps:
- uses: actions/checkout@v3
with:
path: ${{ env.git_repo_path }}
fetch-depth: 0 # also fetch tags
- name: Run e2e
uses: ./go/src/github.com/scylladb/k8s-local-volume-provisioner/.github/actions/run-e2e
with:
repositoryPath: ${{ env.git_repo_path }}
jobSuffix: "parallel"
suite: "conformance/parallel"
success:
name: All tests successfull
runs-on: ubuntu-22.04
needs:
- verify
- verify-deps
- build-and-test
- images
- test-e2e-serial
- test-e2e-parallel
steps:
- name: Always succeed
working-directory: .
run: true
promote:
name: Promote artifacts
runs-on: ubuntu-22.04
needs: [success]
if: ${{ github.event_name != 'pull_request' }}
steps:
- uses: actions/checkout@v3
with:
path: ${{ env.git_repo_path }}
fetch-depth: 0
- name: Setup git tags
if: ${{ startsWith(github.ref, 'refs/tags/') }}
run: ./hack/ci-detect-tags.sh
- name: Setup go
uses: actions/setup-go@v3
with:
go-version: ${{ env.go_version }}
- name: Determine promotion tag
run: |
set -euExo pipefail
shopt -s inherit_errexit
source ./hack/lib/tag-from-gh-ref.sh
CI_IMAGE_TAG=$( tag_from_gh_ref "${GITHUB_REF}" )
echo "CI_IMAGE_TAG=${CI_IMAGE_TAG}" | tee -a ${GITHUB_ENV}
- uses: actions/download-artifact@v3
with:
name: driverimage.tar.lz4
path: ~/
- name: Load image
run: |
set -euExo pipefail
shopt -s inherit_errexit
unlz4 ~/driverimage.tar.lz4 - | docker load
# docker looses the registry part on save/load
docker tag "$( echo "${image_repo_ref}:ci" | sed -E -e 's~[^/]+/(.*)~\1~' )" "${image_repo_ref}:ci"
docker images '${{ env.image_repo_ref }}:ci'
- name: Login to DockerHub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Promote image
run: |
set -euExo pipefail
shopt -s inherit_errexit
docker tag '${{ env.image_repo_ref }}:ci' '${{ env.image_repo_ref }}:${{ env.CI_IMAGE_TAG }}'
docker push '${{ env.image_repo_ref }}:${{ env.CI_IMAGE_TAG }}'
failure-notifications:
name: Failure notifications
runs-on: ubuntu-22.04
needs:
- success
- promote
if: ${{ failure() && github.event_name != 'pull_request' }}
steps:
- name: Report failures to Slack
if: ${{ always() }}
working-directory: .
run: |
# We have to avoid printing the secret to logs.
set -euExo pipefail
shopt -s inherit_errexit
curl -X POST -H 'Content-type: application/json' --data @<( cat <<-EOF
{
"text": ":warning: CI workflow \"${{ github.workflow }}\" triggered on \"${{ github.event_name }}\" event from ${{ github.ref }} (${{ github.sha }}) failed!\n:fire_extinguisher: See https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} for details.:fire:"
}
EOF
) '${{ secrets.SLACK_WEBHOOK_URL }}'