-
Notifications
You must be signed in to change notification settings - Fork 431
250 lines (225 loc) · 9.08 KB
/
e2e.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
243
244
245
246
247
248
249
250
name: E2E CI
on:
release:
types: [created]
pull_request:
types: [opened, synchronize, reopened, edited]
branches:
- main
paths:
- "**.go"
- "!**_test.go" # exclude test files to ignore unit test changes
- "test/**" # include test files in e2e again
- "!**.md"
- "Dockerfile.release"
- ".github/workflows/e2e.yaml"
- "charts/**"
- "manifests/**"
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
env:
IMAGE_NAME: ghcr.io/${{ github.repository }}-ci:PR${{ github.event.number }}
VCLUSTER_SUFFIX: vcluster
VCLUSTER_NAME: vcluster
VCLUSTER_NAMESPACE: vcluster
jobs:
build-and-push-syncer-image:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v3
with:
fetch-depth: 0
- run: git fetch --force --tags
- name: Set up Go
uses: actions/setup-go@v4
with:
cache: false
go-version: "1.21"
- name: Setup Just
uses: extractions/setup-just@v1
- name: Setup Syft
uses: anchore/sbom-action/[email protected]
# - name: Setup GoReleaser
# uses: goreleaser/goreleaser-action@v4
# with:
# install-only: true
# version: nightly
- name: Setup GoReleaser nightly from source
run: go install github.com/goreleaser/goreleaser@962429de067b3f6cde8d377beaf3194b3b258075
- name: Build and save syncer image
run: |
set -x
TELEMETRY_PRIVATE_KEY="" goreleaser build --single-target --snapshot --id vcluster --clean --output ./vcluster
docker build -t ${{ env.IMAGE_NAME }} -f Dockerfile.release --build-arg TARGETARCH=amd64 --build-arg TARGETOS=linux .
docker save -o vcluster_syncer ${{ env.IMAGE_NAME }}
- name: Upload syncer image to artifact
uses: actions/upload-artifact@v3
with:
name: vcluster_syncer
path: ./vcluster_syncer
retention-days: 7
build-vcluster-cli:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v3
with:
fetch-depth: 0
- run: git fetch --force --tags
- name: Set up Go
uses: actions/setup-go@v4
with:
go-version: "1.21"
cache: false
- name: Setup Just
uses: extractions/setup-just@v1
- name: Setup Syft
uses: anchore/sbom-action/[email protected]
# - name: Setup GoReleaser
# uses: goreleaser/goreleaser-action@v4
# with:
# install-only: true
# version: nightly
- name: Setup GoReleaser nightly from source
run: go install github.com/goreleaser/goreleaser@962429de067b3f6cde8d377beaf3194b3b258075
- name: Build vcluster cli
run: |
set -x
TELEMETRY_PRIVATE_KEY="" goreleaser build --single-target --snapshot --id vcluster-cli --clean --output ./vcluster
- name: Upload vcluster cli to artifact
uses: actions/upload-artifact@v3
with:
name: vcluster
path: ./vcluster
retention-days: 7
get-testsuites-dir:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v3
- id: set-paths-matrix
run: |
set -x
sudo apt-get install -y jq
paths=$(ls -d ./test/e2e*)
echo "matrix=$(printf '%s\n' "${paths}" | jq -R . | jq -cs .)" >> "$GITHUB_OUTPUT"
outputs:
matrix: ${{ steps.set-paths-matrix.outputs.matrix }}
e2e-tests:
name: Execute test suites
needs: [build-and-push-syncer-image, build-vcluster-cli, get-testsuites-dir]
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
distribution: ["k3s", "k8s", "k0s", "eks"]
test-suite-path: ${{fromJson(needs.get-testsuites-dir.outputs.matrix)}}
multinamespace-mode: ["false", "true"]
exclude:
- distribution: "eks"
test-suite-path: "./test/e2e_scheduler"
- distribution: "k8s"
multinamespace-mode: "true"
- distribution: "k0s"
multinamespace-mode: "true"
- distribution: "eks"
multinamespace-mode: "true"
- distribution: "k3s"
multinamespace-mode: "true"
test-suite-path: "./test/e2e_target_namespace"
- distribution: "k3s"
multinamespace-mode: "true"
test-suite-path: "./test/e2e_isolation_mode"
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Set up Go
uses: actions/setup-go@v4
with:
go-version: "1.21"
cache: false
- name: Set up kind k8s cluster
uses: engineerd/[email protected]
with:
version: "v0.20.0"
image: kindest/node:v1.27.3
- name: Testing kind cluster set-up
run: |
set -x
kubectl cluster-info
kubectl get pods -n kube-system
echo "kubectl config current-context:" $(kubectl config current-context)
echo "KUBECONFIG env var:" ${KUBECONFIG}
- name: Download vcluster cli
uses: actions/download-artifact@v3
with:
name: vcluster
- name: Download syncer image
uses: actions/download-artifact@v3
with:
name: vcluster_syncer
# - name: Setup upterm session for debugging
# uses: lhotari/action-upterm@v1
- name: Create vcluster
id: create-vcluster
run: |
set -x
MULTINS_VALUES=""
if [ ${{ matrix.multinamespace-mode }} == "true" ]; then
MULTINS_VALUES="-f ./test/multins_values.yaml"
fi
sudo apt-get install -y sed
sed -i "s|REPLACE_IMAGE_NAME|${{ env.IMAGE_NAME }}|g" ${{ matrix.test-suite-path }}/../commonValues.yaml
kind load image-archive vcluster_syncer
chmod +x vcluster && sudo mv vcluster /usr/bin
vcluster create ${{ env.VCLUSTER_SUFFIX }} -n ${{ env.VCLUSTER_NAMESPACE }} \
--create-namespace \
--debug \
--connect=false \
--distro=${{ matrix.distribution }} \
--local-chart-dir ./charts/${{ matrix.distribution }} \
-f ./test/commonValues.yaml \
-f ${{ matrix.test-suite-path }}/values.yaml \
$MULTINS_VALUES
continue-on-error: true
- name: Wait until vcluster is ready
id: wait-until-vcluster-is-ready
if: steps.create-vcluster.outcome == 'success'
run: |
set -x
kubectl wait --for=condition=ready pod -l app=${{ env.VCLUSTER_SUFFIX }} -n ${{ env.VCLUSTER_NAMESPACE }} --timeout=300s
continue-on-error: true
- name: Collect deployment information in case vcluster fails to start
if: steps.wait-until-vcluster-is-ready.outcome != 'success'
run: |
set -x
kubectl get pods -o yaml -n ${{ env.VCLUSTER_NAMESPACE }}
echo "======================================================================================================================"
kubectl get events -n ${{ env.VCLUSTER_NAMESPACE }} --sort-by='.lastTimestamp'
echo "======================================================================================================================"
kubectl logs -l app=${{ env.VCLUSTER_SUFFIX }} -n ${{ env.VCLUSTER_NAMESPACE }} -c syncer --tail=500
echo "======================================================================================================================"
kubectl describe pods -n ${{ env.VCLUSTER_NAMESPACE }}
exit 1
# Skips NetworkPolicy tests because they require network plugin with support (e.g. Calico)
- name: Execute e2e tests
id: execute-e2e-tests
working-directory: ${{ matrix.test-suite-path }}
run: |
set -x
VCLUSTER_SUFFIX=${{ env.VCLUSTER_SUFFIX }} VCLUSTER_NAME=${{ env.VCLUSTER_NAME }} VCLUSTER_NAMESPACE=${{ env.VCLUSTER_NAMESPACE }} MULTINAMESPACE_MODE=${{ matrix.multinamespace-mode }} go test -v -ginkgo.v -ginkgo.skip='.*NetworkPolicy.*' -ginkgo.fail-fast
continue-on-error: true
- name: Print logs if e2e tests fail
if: steps.execute-e2e-tests.outcome == 'failure'
run: |
set -x
kubectl get pods -o yaml -n ${{ env.VCLUSTER_NAMESPACE }}
echo "======================================================================================================================"
kubectl get events -n ${{ env.VCLUSTER_NAMESPACE }} --sort-by='.lastTimestamp'
echo "======================================================================================================================"
kubectl logs -l app=${{ env.VCLUSTER_SUFFIX }} -n ${{ env.VCLUSTER_NAMESPACE }} -c syncer --tail=500
echo "======================================================================================================================"
kubectl describe pods -n ${{ env.VCLUSTER_NAMESPACE }}
exit 1