Skip to content

Commit aa97886

Browse files
authored
Merge pull request #488 from fangn2/fix-build
Fix CI build by using pre-built rootfs image
2 parents dc8f6de + f90c580 commit aa97886

File tree

5 files changed

+50
-65
lines changed

5 files changed

+50
-65
lines changed

.buildkite/pipeline.yml

+5-6
Original file line numberDiff line numberDiff line change
@@ -61,11 +61,9 @@ steps:
6161
# Copy vmlinux and root-drive.img.
6262
- ln -s /var/lib/fc-ci/vmlinux.bin ${FC_TEST_DATA_PATH}/vmlinux
6363
- ln -s /var/lib/fc-ci/rootfs.ext4 ${FC_TEST_DATA_PATH}/root-drive.img
64-
# Download Firecracker and its jailer.
65-
- make deps
66-
# Build a rootfs with SSH enabled.
67-
- sudo -E FC_TEST_DATA_PATH=${FC_TEST_DATA_PATH} make ${FC_TEST_DATA_PATH}/root-drive-ssh-key
68-
- sudo chown $USER ${FC_TEST_DATA_PATH}/root-drive-ssh-key ${FC_TEST_DATA_PATH}/root-drive-with-ssh.img
64+
# Download Firecracker and its jailer
65+
# Download pre-built rootfs with SSH enabled and its ssh key.
66+
- make deps
6967
agents:
7068
queue: "${BUILDKITE_AGENT_META_DATA_QUEUE:-default}"
7169
distro: "${BUILDKITE_AGENT_META_DATA_DISTRO}"
@@ -90,6 +88,7 @@ steps:
9088

9189
- label: ':book: examples'
9290
commands:
91+
# Copy those deps from install step to save time re-downloading
9392
- cp ${FC_TEST_DATA_PATH}/root-drive-ssh-key ${FC_TEST_DATA_PATH}/root-drive-with-ssh.img ${FC_TEST_DATA_PATH}/vmlinux examples/cmd/snapshotting
9493
- cd examples/cmd/snapshotting
9594
- make all
@@ -112,7 +111,7 @@ steps:
112111
commands:
113112
- export FC_TEST_TAP=fc-root-tap${BUILDKITE_BUILD_NUMBER}
114113
- export FC_TEST_DATA_PATH=${FC_TEST_DATA_PATH}
115-
- make test EXTRAGOARGS="-exec 'sudo -E' -count=1 -race" DISABLE_ROOT_TESTS=
114+
- make test EXTRAGOARGS="-exec 'sudo -E' -v -count=1 -race" DISABLE_ROOT_TESTS=
116115
agents:
117116
queue: "${BUILDKITE_AGENT_META_DATA_QUEUE:-default}"
118117
distro: "${BUILDKITE_AGENT_META_DATA_DISTRO}"

Makefile

+20-25
Original file line numberDiff line numberDiff line change
@@ -34,25 +34,21 @@ firecracker_version=v1.0.0
3434
release_url=https://github.com/firecracker-microvm/firecracker/releases/download/$(firecracker_version)/firecracker-$(firecracker_version)-$(arch).tgz
3535

3636
testdata_objects = \
37-
$(FC_TEST_DATA_PATH)/vmlinux \
38-
$(FC_TEST_DATA_PATH)/root-drive.img \
39-
$(FC_TEST_DATA_PATH)/jailer \
4037
$(FC_TEST_DATA_PATH)/firecracker \
38+
$(FC_TEST_BIN_PATH)/host-local \
39+
$(FC_TEST_DATA_PATH)/jailer \
4140
$(FC_TEST_DATA_PATH)/ltag \
4241
$(FC_TEST_BIN_PATH)/ptp \
43-
$(FC_TEST_BIN_PATH)/host-local \
42+
$(FC_TEST_DATA_PATH)/root-drive.img \
43+
$(FC_TEST_DATA_PATH)/root-drive-with-ssh.img \
44+
$(FC_TEST_DATA_PATH)/root-drive-ssh-key \
4445
$(FC_TEST_BIN_PATH)/static \
45-
$(FC_TEST_BIN_PATH)/tc-redirect-tap
46-
47-
# Enable pulling of artifacts from S3 instead of building
48-
# TODO: https://github.com/firecracker-microvm/firecracker-go-sdk/issues/418
49-
ifeq ($(GID), 0)
50-
testdata_objects += $(FC_TEST_DATA_PATH)/root-drive-with-ssh.img $(FC_TEST_DATA_PATH)/root-drive-ssh-key
51-
endif
46+
$(FC_TEST_BIN_PATH)/tc-redirect-tap \
47+
$(FC_TEST_DATA_PATH)/vmlinux
5248

5349
testdata_dir = testdata/firecracker.tgz testdata/firecracker_spec-$(firecracker_version).yaml testdata/LICENSE testdata/NOTICE testdata/THIRD-PARTY
5450

55-
# --location is needed to follow redirects on github.com
51+
# --location is needed to follow redirects
5652
curl = curl --location
5753

5854
GO_VERSION = $(shell go version | cut -c 14- | cut -d' ' -f1 | cut -d'.' -f1,2)
@@ -96,26 +92,23 @@ $(FC_TEST_DATA_PATH)/vmlinux:
9692

9793
$(FC_TEST_DATA_PATH)/firecracker $(FC_TEST_DATA_PATH)/jailer: $(FC_TEST_DATA_PATH)/fc.stamp
9894

95+
# Download the pinned release version of firecracker and jailer version from github
9996
$(FC_TEST_DATA_PATH)/fc.stamp:
10097
$(curl) ${release_url} | tar -xvzf - -C $(FC_TEST_DATA_PATH)
10198
mv $(FC_TEST_DATA_PATH)/release-$(firecracker_version)-$(arch)/firecracker-$(firecracker_version)-$(arch) $(FC_TEST_DATA_PATH)/firecracker
10299
mv $(FC_TEST_DATA_PATH)/release-$(firecracker_version)-$(arch)/jailer-$(firecracker_version)-$(arch) $(FC_TEST_DATA_PATH)/jailer
100+
rm -rf $(FC_TEST_DATA_PATH)/release-$(firecracker_version)-$(arch)
103101
touch $@
104102

105103
$(FC_TEST_DATA_PATH)/root-drive.img:
106104
$(curl) -o $@ https://s3.amazonaws.com/spec.ccfc.min/img/hello/fsfiles/hello-rootfs.ext4
107105

106+
# Download pre-built rootfs image and its ssh key from S3
107+
# TODO: Change the pre-built rootfs to ubuntu 22.04 once firecracker team has it in the public S3 bucket
108+
# Currently the S3 bucket only has ubuntu 18.04 image
108109
$(FC_TEST_DATA_PATH)/root-drive-ssh-key $(FC_TEST_DATA_PATH)/root-drive-with-ssh.img:
109-
# Need root to move ssh key to testdata location
110-
ifeq ($(GID), 0)
111-
$(MAKE) $(FIRECRACKER_DIR)
112-
$(FIRECRACKER_DIR)/tools/devtool build_rootfs -m $(FC_TEST_DATA_PATH)/mnt
113-
cp $(FIRECRACKER_DIR)/build/rootfs/bionic.rootfs.ext4 $(FC_TEST_DATA_PATH)/root-drive-with-ssh.img
114-
cp $(FIRECRACKER_DIR)/build/rootfs/ssh/id_rsa $(FC_TEST_DATA_PATH)/root-drive-ssh-key
115-
rm -rf $(FIRECRACKER_DIR)
116-
else
117-
$(error unable to place ssh key without root permissions)
118-
endif
110+
$(curl) -o $(FC_TEST_DATA_PATH)/root-drive-with-ssh.img https://s3.amazonaws.com/spec.ccfc.min/ci-artifacts/disks/$(arch)/ubuntu-18.04.ext4
111+
$(curl) -o $(FC_TEST_DATA_PATH)/root-drive-ssh-key https://s3.amazonaws.com/spec.ccfc.min/ci-artifacts/disks/$(arch)/ubuntu-18.04.id_rsa
119112

120113
$(FC_TEST_BIN_PATH)/ptp:
121114
$(call install_go,github.com/containernetworking/plugins/plugins/main/ptp,v1.1.1)
@@ -132,12 +125,14 @@ $(FC_TEST_BIN_PATH)/tc-redirect-tap:
132125
$(FC_TEST_DATA_PATH)/ltag:
133126
$(call install_go,github.com/kunalkushwaha/ltag,v0.2.3)
134127

135-
$(FIRECRACKER_DIR):
136-
- git clone https://github.com/firecracker-microvm/firecracker.git $(FIRECRACKER_DIR)
137-
128+
# test-images builds firecracker and jailer from main branch of firecracker
129+
# to test against HEAD of firecracker
138130
.PHONY: test-images
139131
test-images: $(FIRECRACKER_BIN) $(JAILER_BIN)
140132

133+
$(FIRECRACKER_DIR):
134+
- git clone https://github.com/firecracker-microvm/firecracker.git $(FIRECRACKER_DIR)
135+
141136
$(FIRECRACKER_BIN) $(JAILER_BIN): $(FIRECRACKER_DIR)
142137
$(FIRECRACKER_DIR)/tools/devtool -y build --release
143138
cp $(FIRECRACKER_DIR)/build/cargo_target/$(FIRECRACKER_TARGET)/release/firecracker $(FIRECRACKER_BIN)

examples/cmd/snapshotting/Makefile

+14-10
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ PWD=$(shell pwd)
2121
GOBIN=$(PWD)/bin
2222
FC_TEST_DATA_PATH?=$(PWD)
2323

24+
# --location is needed to follow redirects on github.com
25+
curl = curl --location
26+
2427
GO_VERSION = $(shell go version | cut -c 14- | cut -d' ' -f1 | cut -d'.' -f1,2)
2528
ifeq ($(GO_VERSION), $(filter $(GO_VERSION),1.14 1.15))
2629
define install_go
@@ -50,28 +53,29 @@ bin/host-local: bin
5053
$(call install_go,github.com/containernetworking/plugins/plugins/ipam/host-local,v1.1.1)
5154

5255
vmlinux:
53-
curl --location -o vmlinux https://s3.amazonaws.com/spec.ccfc.min/img/quickstart_guide/${ARCH}/kernels/vmlinux.bin
56+
$(curl) -o vmlinux https://s3.amazonaws.com/spec.ccfc.min/img/quickstart_guide/${ARCH}/kernels/vmlinux.bin
5457

5558
firecracker:
56-
curl -L ${RELEASE_URL}/download/${VER}/firecracker-${VER}-${ARCH}.tgz | tar -xz
59+
$(curl) ${RELEASE_URL}/download/${VER}/firecracker-${VER}-${ARCH}.tgz | tar -xz
5760
mv release-${VER}-${ARCH}/firecracker-${VER}-${ARCH} firecracker
5861
rm -rf release-${VER}-${ARCH}
5962

63+
# Use rootfs and ssh key pre-built from S3 following firecracker getting-started guide
64+
# https://github.com/firecracker-microvm/firecracker/blob/main/docs/getting-started.md
65+
# TODO: Change the pre-built rootfs to ubuntu 22.04 once firecracker team has that in the public S3 bucket
66+
# Currently the S3 bucket only has ubuntu 18.04 image
6067
root-drive-with-ssh.img root-drive-ssh-key:
61-
- mkdir temp
62-
- git clone https://github.com/firecracker-microvm/firecracker temp
63-
temp/tools/devtool build_rootfs
64-
cp temp/build/rootfs/bionic.rootfs.ext4 root-drive-with-ssh.img
65-
cp temp/build/rootfs/ssh/id_rsa root-drive-ssh-key
66-
rm -rf temp
67-
68+
$(curl) -o root-drive-with-ssh.img https://s3.amazonaws.com/spec.ccfc.min/ci-artifacts/disks/${ARCH}/ubuntu-18.04.ext4
69+
$(curl) -o root-drive-ssh-key https://s3.amazonaws.com/spec.ccfc.min/ci-artifacts/disks/${ARCH}/ubuntu-18.04.id_rsa
70+
71+
6872
snapshot-example:
6973
go build -o $@
7074

7175
run: snapshot-example
7276
./snapshot-example
7377

7478
clean:
75-
rm -rf bin firecracker root-drive-ssh-key root-drive-with-ssh.img vmlinux
79+
rm -rf bin firecracker root-drive-ssh-key root-drive-with-ssh.img snapshot-example vmlinux
7680

7781
.PHONY: all clean plugins run

examples/cmd/snapshotting/README.md

+3-18
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ This test requires both KVM and root access.
99
Run this test by first running
1010

1111
```
12-
sudo -E env PATH=$PATH make all
12+
make all
1313
```
1414

1515
followed by
@@ -18,7 +18,7 @@ followed by
1818
sudo -E env PATH=$PATH go run example_demo.go
1919
```
2020

21-
Alternatively, to do both of the above,
21+
or,
2222
```
2323
sudo -E env PATH=$PATH make run
2424
```
@@ -62,20 +62,5 @@ Pressing enter resumes execution of the program.
6262
You can remove dependencies via a simple `make clean`.
6363

6464
```
65-
sudo make clean
66-
```
67-
68-
## Issues
69-
70-
You may encounter an issue where the image does not build properly. This is often indicated via the following near the end of terminal output:
71-
72-
```
73-
umount: /firecracker/build/rootfs/mnt: not mounted.
74-
```
75-
76-
This is due to an issue in Firecracker's devtool command used to dynamically create an image. Fixing this is often as simple as rerunning the command.
77-
78-
```
79-
sudo rm -rf root-drive-with-ssh.img root-drive-ssh-key
80-
sudo make image
65+
make clean
8166
```

examples/cmd/snapshotting/example_demo.go

+8-6
Original file line numberDiff line numberDiff line change
@@ -89,9 +89,9 @@ func createNewConfig(socketPath string, opts ...configOpt) sdk.Config {
8989
SocketPath: socketPath,
9090
KernelImagePath: kernelImagePath,
9191
MachineCfg: models.MachineConfiguration{
92-
VcpuCount: &vcpuCount,
93-
MemSizeMib: &memSizeMib,
94-
Smt: &smt,
92+
VcpuCount: &vcpuCount,
93+
MemSizeMib: &memSizeMib,
94+
Smt: &smt,
9595
},
9696
Drives: []models.Drive{
9797
{
@@ -412,13 +412,15 @@ func main() {
412412
defer os.Remove(tempdir)
413413
socketPath := filepath.Join(tempdir, "snapshotssh")
414414

415-
err = os.Mkdir("snapshotssh", 0777)
415+
snapshotsshPath := filepath.Join(dir, "snapshotssh")
416+
err = os.Mkdir(snapshotsshPath, 0777)
416417
if err != nil && !errors.Is(err, os.ErrExist) {
417418
log.Fatal(err)
418419
}
420+
defer os.RemoveAll(snapshotsshPath)
419421

420-
snapPath := filepath.Join(dir, "snapshotssh/SnapFile")
421-
memPath := filepath.Join(dir, "snapshotssh/MemFile")
422+
snapPath := filepath.Join(snapshotsshPath, "SnapFile")
423+
memPath := filepath.Join(snapshotsshPath, "MemFile")
422424

423425
ctx := context.Background()
424426

0 commit comments

Comments
 (0)