Skip to content

Commit b453d4a

Browse files
authored
Merge pull request #334 from kzys/fix-build
Fix BuildKite's race condition
2 parents 20161d1 + ff4933f commit b453d4a

File tree

5 files changed

+131
-89
lines changed

5 files changed

+131
-89
lines changed

.buildkite/pipeline.yml

Lines changed: 26 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,14 @@
1212
# permissions and limitations under the License.
1313
env:
1414
PATH: "/usr/lib/go-1.13/bin:/usr/bin"
15+
FC_TEST_DATA_PATH: "/tmp/buildkite_build_${BUILDKITE_BUILD_NUMBER}_testdata"
1516

1617
steps:
17-
- label: ':ec2: environment'
18+
- label: ':ec2: prepare environment'
1819
command:
1920
- uname -a
2021
- go version
22+
- "mkdir -p ${FC_TEST_DATA_PATH}"
2123
agents:
2224
queue: "${BUILDKITE_AGENT_META_DATA_QUEUE:-default}"
2325
distro: "${BUILDKITE_AGENT_META_DATA_DISTRO}"
@@ -40,18 +42,17 @@ steps:
4042
distro: "${BUILDKITE_AGENT_META_DATA_DISTRO}"
4143
hostname: "${BUILDKITE_AGENT_META_DATA_HOSTNAME}"
4244

45+
# Since make test-images mutates the source directory, it cannot be run with other steps.
46+
- wait
47+
4348
- label: ':linux: build docker images'
4449
commands:
45-
- 'make test-images'
46-
- 'buildkite-agent artifact upload testdata/firecracker-master'
47-
- 'buildkite-agent artifact upload testdata/jailer-master'
50+
- make test-images
4851
agents:
4952
queue: "${BUILDKITE_AGENT_META_DATA_QUEUE:-default}"
5053
distro: "${BUILDKITE_AGENT_META_DATA_DISTRO}"
5154
hostname: "${BUILDKITE_AGENT_META_DATA_HOSTNAME}"
5255

53-
# We use a "wait" step here, because Go's module logic freaks out when
54-
# multiple go builds are downloading to the same cache.
5556
- wait
5657

5758
- label: gofmt -s
@@ -68,19 +69,29 @@ steps:
6869
agents:
6970
queue: "${BUILDKITE_AGENT_META_DATA_QUEUE:-default}"
7071

72+
- wait
73+
7174
- label: ':package: install'
75+
env:
76+
GOBIN: "$FC_TEST_DATA_PATH/bin"
7277
commands:
78+
# To use ${FC_TEST_DATA_PATH} as testdata/, all files in the original directory must be
79+
# copied to the new directory.
80+
- cp -r testdata/* ${FC_TEST_DATA_PATH}
7381
# Install tc-redirect-tap.
74-
- 'mkdir -p testdata/bin'
75-
- 'GOBIN=$(pwd)/testdata/bin go get github.com/awslabs/tc-redirect-tap/cmd/tc-redirect-tap'
82+
- 'go get github.com/awslabs/tc-redirect-tap/cmd/tc-redirect-tap'
7683
# Copy vmlinux and root-drive.img.
77-
- 'ln -s /var/lib/fc-ci/vmlinux.bin testdata/vmlinux'
78-
- 'ln -s /var/lib/fc-ci/rootfs.ext4 testdata/root-drive.img'
84+
- ln -s /var/lib/fc-ci/vmlinux.bin ${FC_TEST_DATA_PATH}/vmlinux
85+
- ln -s /var/lib/fc-ci/rootfs.ext4 ${FC_TEST_DATA_PATH}/root-drive.img
86+
# Download Firecracker and its jailer.
87+
- make deps
7988
agents:
8089
queue: "${BUILDKITE_AGENT_META_DATA_QUEUE:-default}"
8190
distro: "${BUILDKITE_AGENT_META_DATA_DISTRO}"
8291
hostname: "${BUILDKITE_AGENT_META_DATA_HOSTNAME}"
8392

93+
- wait
94+
8495
- label: 'build'
8596
commands:
8697
- 'make'
@@ -89,11 +100,8 @@ steps:
89100
distro: "${BUILDKITE_AGENT_META_DATA_DISTRO}"
90101
hostname: "${BUILDKITE_AGENT_META_DATA_HOSTNAME}"
91102

92-
93103
- label: ':hammer: tests'
94104
commands:
95-
- 'ln -s /var/lib/fc-ci/vmlinux.bin testdata/vmlinux'
96-
- 'ln -s /var/lib/fc-ci/rootfs.ext4 testdata/root-drive.img'
97105
- "FC_TEST_TAP=fc-test-tap${BUILDKITE_BUILD_NUMBER} make test EXTRAGOARGS='-v -count=1 -race' DISABLE_ROOT_TESTS=true"
98106
agents:
99107
queue: "${BUILDKITE_AGENT_META_DATA_QUEUE:-default}"
@@ -102,31 +110,18 @@ steps:
102110

103111
- label: ':hammer: root tests'
104112
commands:
105-
- 'ln -s /var/lib/fc-ci/vmlinux.bin testdata/vmlinux'
106-
- 'ln -s /var/lib/fc-ci/rootfs.ext4 testdata/root-drive.img'
107-
- 'mkdir -p $(pwd)/testdata/bin'
108-
- 'GOBIN=$(pwd)/testdata/bin go get github.com/awslabs/tc-redirect-tap/cmd/tc-redirect-tap'
109-
- "sudo PATH=$PATH FC_TEST_TAP=fc-root-tap${BUILDKITE_BUILD_NUMBER} make test EXTRAGOARGS='-v -count=1 -race' DISABLE_ROOT_TESTS="
113+
- "sudo PATH=$PATH FC_TEST_TAP=fc-root-tap${BUILDKITE_BUILD_NUMBER} FC_TEST_DATA_PATH=${FC_TEST_DATA_PATH} make test EXTRAGOARGS='-v -count=1 -race' DISABLE_ROOT_TESTS="
110114
agents:
111115
queue: "${BUILDKITE_AGENT_META_DATA_QUEUE:-default}"
112116
distro: "${BUILDKITE_AGENT_META_DATA_DISTRO}"
113117
hostname: "${BUILDKITE_AGENT_META_DATA_HOSTNAME}"
114118

115119
- label: ':hammer: test against firecracker master'
116120
env:
117-
FC_TEST_BIN: "testdata/firecracker-master"
121+
FC_TEST_BIN: "${FC_TEST_DATA_PATH}/firecracker-master"
122+
FC_TEST_JAILER_BIN: "${FC_TEST_DATA_PATH}/jailer-master"
118123
DOCKER_IMAGE_TAG: "$BUILDKITE_BUILD_NUMBER"
119-
FC_TEST_JAILER_BIN: "testdata/jailer-master"
120124
commands:
121-
- 'ln -s /var/lib/fc-ci/vmlinux.bin testdata/vmlinux'
122-
- 'ln -s /var/lib/fc-ci/rootfs.ext4 testdata/root-drive.img'
123-
- 'buildkite-agent artifact download testdata/firecracker-master .'
124-
- 'chmod +x testdata/firecracker-master'
125-
- 'buildkite-agent artifact download testdata/jailer-master .'
126-
- 'chmod +x testdata/jailer-master'
127-
# Install tc-redirect-tap.
128-
- 'mkdir -p testdata/bin'
129-
- 'GOBIN=$(pwd)/testdata/bin go get github.com/awslabs/tc-redirect-tap/cmd/tc-redirect-tap'
130125
- "sudo -E PATH=$PATH FC_TEST_TAP=fc-mst-tap${BUILDKITE_BUILD_NUMBER} make test EXTRAGOARGS='-v -count=1 -race' DISABLE_ROOT_TESTS="
131126
agents:
132127
queue: "${BUILDKITE_AGENT_META_DATA_QUEUE:-default}"
@@ -148,11 +143,12 @@ steps:
148143
- wait: ~
149144
continue_on_failure: true
150145

151-
- label: ':linux: cleanup taps'
146+
- label: ':linux: cleanup'
152147
commands:
153148
- 'sudo ip tuntap del fc-test-tap${BUILDKITE_BUILD_NUMBER} mode tap'
154149
- 'sudo ip tuntap del fc-root-tap${BUILDKITE_BUILD_NUMBER} mode tap'
155150
- 'sudo ip tuntap del fc-mst-tap${BUILDKITE_BUILD_NUMBER} mode tap'
151+
- 'sudo rm -fr ${FC_TEST_DATA_PATH}'
156152
agents:
157153
queue: "${BUILDKITE_AGENT_META_DATA_QUEUE:-default}"
158154
distro: "${BUILDKITE_AGENT_META_DATA_DISTRO}"

Makefile

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,12 @@ DISABLE_ROOT_TESTS?=1
1717
DOCKER_IMAGE_TAG?=latest
1818
EXTRAGOARGS:=
1919
FIRECRACKER_BUILDER_NAME=firecracker-builder
20-
FIRECRACKER_BIN=testdata/firecracker-master
21-
JAILER_BIN=testdata/jailer-master
2220
FIRECRACKER_TARGET?=x86_64-unknown-linux-musl
2321

22+
FC_TEST_DATA_PATH?=testdata
23+
FIRECRACKER_BIN=$(FC_TEST_DATA_PATH)/firecracker-master
24+
JAILER_BIN=$(FC_TEST_DATA_PATH)/jailer-master
25+
2426
UID = $(shell id -u)
2527
GID = $(shell id -g)
2628

@@ -29,7 +31,7 @@ arch=$(shell uname -m)
2931

3032
# The below files are needed and can be downloaded from the internet
3133
release_url=https://github.com/firecracker-microvm/firecracker/releases/download/$(firecracker_version)/firecracker-$(firecracker_version)-$(arch).tgz
32-
testdata_objects = testdata/vmlinux testdata/root-drive.img testdata/binaries testdata/jailer testdata/firecracker
34+
testdata_objects = $(FC_TEST_DATA_PATH)/vmlinux $(FC_TEST_DATA_PATH)/root-drive.img $(FC_TEST_DATA_PATH)/jailer $(FC_TEST_DATA_PATH)/firecracker
3335
testdata_dir = testdata/firecracker.tgz testdata/firecracker_spec-$(firecracker_version).yaml testdata/LICENSE testdata/NOTICE testdata/THIRD-PARTY
3436

3537
# --location is needed to follow redirects on github.com
@@ -39,10 +41,10 @@ all: build
3941

4042
test: all-tests
4143

42-
unit-tests: $(testdata_objects) check-kvm
44+
unit-tests: check-kvm $(testdata_objects)
4345
DISABLE_ROOT_TESTS=$(DISABLE_ROOT_TESTS) go test -short ./... $(EXTRAGOARGS)
4446

45-
all-tests: $(testdata_objects) check-kvm
47+
all-tests: check-kvm $(testdata_objects)
4648
DISABLE_ROOT_TESTS=$(DISABLE_ROOT_TESTS) go test ./... $(EXTRAGOARGS)
4749

4850
check-kvm:
@@ -60,19 +62,20 @@ distclean: clean
6062
rm -rfv $(testdata_dir)
6163
docker volume rm -f $(CARGO_CACHE_VOLUME_NAME)
6264

63-
testdata/vmlinux:
65+
deps: $(testdata_objects)
66+
67+
$(FC_TEST_DATA_PATH)/vmlinux:
6468
$(curl) -o $@ https://s3.amazonaws.com/spec.ccfc.min/img/quickstart_guide/$(arch)/kernels/vmlinux.bin
6569

66-
testdata/binaries:
67-
$(curl) -o testdata/firecracker.tgz ${release_url}
68-
tar -xvzf testdata/firecracker.tgz -C ./testdata
69-
mv testdata/firecracker-$(firecracker_version)-$(arch) testdata/firecracker
70-
mv testdata/jailer-$(firecracker_version)-$(arch) testdata/jailer
71-
chmod +x testdata/firecracker
72-
chmod +x testdata/jailer
73-
touch testdata/binaries
70+
$(FC_TEST_DATA_PATH)/firecracker $(FC_TEST_DATA_PATH)/jailer: $(FC_TEST_DATA_PATH)/fc.stamp
71+
72+
$(FC_TEST_DATA_PATH)/fc.stamp:
73+
$(curl) ${release_url} | tar -xvzf - -C $(FC_TEST_DATA_PATH)
74+
mv $(FC_TEST_DATA_PATH)/firecracker-$(firecracker_version)-$(arch) $(FC_TEST_DATA_PATH)/firecracker
75+
mv $(FC_TEST_DATA_PATH)/jailer-$(firecracker_version)-$(arch) $(FC_TEST_DATA_PATH)/jailer
76+
touch $@
7477

75-
testdata/root-drive.img:
78+
$(FC_TEST_DATA_PATH)/root-drive.img:
7679
$(curl) -o $@ https://s3.amazonaws.com/spec.ccfc.min/img/hello/fsfiles/hello-rootfs.ext4
7780

7881
tools/firecracker-builder-stamp: tools/docker/Dockerfile
@@ -109,4 +112,4 @@ firecracker-clean:
109112
cargo clean
110113
- rm $(FIRECRACKER_BIN) $(JAILER_BIN)
111114

112-
.PHONY: all generate clean distclean build test unit-tests all-tests check-kvm
115+
.PHONY: all generate clean distclean build test unit-tests all-tests check-kvm

firecracker_test.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package firecracker
22

33
import (
44
"context"
5-
"os"
65
"path/filepath"
76
"testing"
87
"time"
@@ -17,7 +16,8 @@ func TestClient(t *testing.T) {
1716
}
1817

1918
ctx := context.Background()
20-
socketpath := filepath.Join(testDataPath, "test.socket")
19+
socketpath, cleanup := makeSocketPath(t)
20+
defer cleanup()
2121

2222
cmd := VMCommandBuilder{}.
2323
WithBin(getFirecrackerBinaryPath()).
@@ -32,7 +32,6 @@ func TestClient(t *testing.T) {
3232
if err := cmd.Process.Kill(); err != nil {
3333
t.Errorf("failed to kill process: %v", err)
3434
}
35-
os.Remove(socketpath)
3635
}()
3736

3837
drive := &models.Drive{

0 commit comments

Comments
 (0)