...
1---
2# We use Cirrus for CentOS (native) and Fedora (in Vagrant), because neither
3# CentOS nor Fedora is available on GHA natively, so the only option is VM.
4# In GHA, nested virtualization is only supported on macOS instances, which
5# are slow and flaky.
6
7# NOTE Cirrus execution environments lack a terminal, needed for
8# some integration tests. So we use `ssh -tt` command to fake a terminal.
9
10task:
11 timeout_in: 30m
12
13 env:
14 DEBIAN_FRONTEND: noninteractive
15 HOME: /root
16 # yamllint disable rule:key-duplicates
17 matrix:
18 DISTRO: fedora
19
20 name: vagrant DISTRO:$DISTRO
21
22 compute_engine_instance:
23 image_project: cirrus-images
24 image: family/docker-kvm
25 platform: linux
26 nested_virtualization: true
27 # CPU limit: `16 / NTASK`: see https://cirrus-ci.org/faq/#are-there-any-limits
28 cpu: 4
29 # Memory limit: `4GB * NCPU`
30 memory: 16G
31
32 host_info_script: |
33 uname -a
34 # -----
35 cat /etc/os-release
36 # -----
37 df -T
38 # -----
39 cat /proc/cpuinfo
40 install_libvirt_vagrant_script: |
41 curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
42 echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
43 sudo sed -i 's/^# deb-src/deb-src/' /etc/apt/sources.list
44 apt-get update
45 apt-get install -y libvirt-daemon libvirt-daemon-system vagrant
46 systemctl enable --now libvirtd
47 apt-get build-dep -y vagrant ruby-libvirt
48 apt-get install -y --no-install-recommends libxslt-dev libxml2-dev libvirt-dev ruby-bundler ruby-dev zlib1g-dev
49 vagrant plugin install vagrant-libvirt
50 vagrant_cache:
51 fingerprint_script: cat Vagrantfile.$DISTRO
52 folder: /root/.vagrant.d/boxes
53 vagrant_up_script: |
54 ln -sf Vagrantfile.$DISTRO Vagrantfile
55 # Retry if it fails (download.fedoraproject.org returns 404 sometimes)
56 vagrant up --no-tty || vagrant up --no-tty
57 mkdir -p -m 0700 /root/.ssh
58 vagrant ssh-config >> /root/.ssh/config
59 guest_info_script: |
60 ssh default 'sh -exc "uname -a && systemctl --version && df -T && cat /etc/os-release && go version"'
61 check_config_script: |
62 ssh default /vagrant/script/check-config.sh
63 unit_tests_script: |
64 ssh default 'sudo -i make -C /vagrant localunittest'
65 integration_systemd_script: |
66 ssh -tt default "sudo -i make -C /vagrant localintegration RUNC_USE_SYSTEMD=yes"
67 integration_fs_script: |
68 ssh -tt default "sudo -i make -C /vagrant localintegration"
69 integration_systemd_rootless_script: |
70 ssh -tt default "sudo -i make -C /vagrant localrootlessintegration RUNC_USE_SYSTEMD=yes"
71 integration_fs_rootless_script: |
72 ssh -tt default "sudo -i make -C /vagrant localrootlessintegration"
73
74task:
75 timeout_in: 30m
76
77 env:
78 HOME: /root
79 CIRRUS_WORKING_DIR: /home/runc
80 GO_VERSION: "1.20"
81 BATS_VERSION: "v1.9.0"
82 RPMS: gcc git iptables jq glibc-static libseccomp-devel make criu fuse-sshfs
83 # yamllint disable rule:key-duplicates
84 matrix:
85 DISTRO: centos-7
86 DISTRO: centos-stream-8
87 DISTRO: centos-stream-9
88
89 name: ci / $DISTRO
90
91 compute_engine_instance:
92 image_project: centos-cloud
93 image: family/$DISTRO
94 platform: linux
95 cpu: 4
96 memory: 8G
97
98 install_dependencies_script: |
99 case $DISTRO in
100 centos-7)
101 (cd /etc/yum.repos.d && curl -O https://copr.fedorainfracloud.org/coprs/adrian/criu-el7/repo/epel-7/adrian-criu-el7-epel-7.repo)
102 # EPEL is needed for jq and fuse-sshfs.
103 rpm -q epel-release || rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
104 # sysctl
105 echo "user.max_user_namespaces=15076" > /etc/sysctl.d/userns.conf
106 sysctl --system
107 ;;
108 centos-stream-8)
109 yum config-manager --set-enabled powertools # for glibc-static
110 ;;
111 centos-stream-9)
112 dnf config-manager --set-enabled crb # for glibc-static
113 dnf -y install epel-release epel-next-release # for fuse-sshfs
114 # Delegate all cgroup v2 controllers to rootless user via --systemd-cgroup.
115 # The default (since systemd v252) is "pids memory cpu".
116 mkdir -p /etc/systemd/system/user@.service.d
117 printf "[Service]\nDelegate=yes\n" > /etc/systemd/system/user@.service.d/delegate.conf
118 systemctl daemon-reload
119 ;;
120 esac
121 # Work around dnf mirror failures by retrying a few times.
122 for i in $(seq 0 2); do
123 sleep $i
124 yum install -y $RPMS && break
125 done
126 [ $? -eq 0 ] # fail if yum failed
127
128 # Double check that all rpms were installed (yum from CentOS 7
129 # does not exit with an error if some packages were not found).
130 # Use --whatprovides since some packages are renamed.
131 rpm -q --whatprovides $RPMS
132 # install Go
133 PREFIX="https://go.dev/dl/"
134 # Find out the latest minor release URL.
135 eval $(curl -fsSL "${PREFIX}?mode=json" | jq -r --arg Ver "$GO_VERSION" '.[] | select(.version | startswith("go\($Ver)")) | .files[] | select(.os == "linux" and .arch == "amd64" and .kind == "archive") | "filename=\"" + .filename + "\""')
136 curl -fsSL "$PREFIX$filename" | tar Cxz /usr/local
137 # install bats
138 cd /tmp
139 git clone https://github.com/bats-core/bats-core
140 cd bats-core
141 git checkout $BATS_VERSION
142 ./install.sh /usr/local
143 cd -
144 # Add a user for rootless tests
145 useradd -u2000 -m -d/home/rootless -s/bin/bash rootless
146 # Allow root and rootless itself to execute `ssh rootless@localhost` in tests/rootless.sh
147 ssh-keygen -t ecdsa -N "" -f /root/rootless.key
148 mkdir -m 0700 -p /home/rootless/.ssh
149 cp /root/rootless.key /home/rootless/.ssh/id_ecdsa
150 cat /root/rootless.key.pub >> /home/rootless/.ssh/authorized_keys
151 chown -R rootless.rootless /home/rootless
152 # set PATH
153 echo 'export PATH=/usr/local/go/bin:/usr/local/bin:$PATH' >> /root/.bashrc
154 # Setup ssh localhost for terminal emulation (script -e did not work)
155 ssh-keygen -t ed25519 -f /root/.ssh/id_ed25519 -N ""
156 cat /root/.ssh/id_ed25519.pub >> /root/.ssh/authorized_keys
157 chmod 400 /root/.ssh/authorized_keys
158 ssh-keyscan localhost >> /root/.ssh/known_hosts
159 echo -e "Host localhost\n\tStrictHostKeyChecking no\t\nIdentityFile /root/.ssh/id_ed25519\n" >> /root/.ssh/config
160 sed -e "s,PermitRootLogin.*,PermitRootLogin prohibit-password,g" -i /etc/ssh/sshd_config
161 systemctl restart sshd
162 host_info_script: |
163 uname -a
164 # -----
165 /usr/local/go/bin/go version
166 # -----
167 systemctl --version
168 # -----
169 cat /etc/os-release
170 # -----
171 df -T
172 # -----
173 cat /proc/cpuinfo
174 check_config_script: |
175 /home/runc/script/check-config.sh
176 unit_tests_script: |
177 ssh -tt localhost "make -C /home/runc localunittest"
178 integration_systemd_script: |
179 ssh -tt localhost "make -C /home/runc localintegration RUNC_USE_SYSTEMD=yes"
180 integration_fs_script: |
181 ssh -tt localhost "make -C /home/runc localintegration"
182 integration_systemd_rootless_script: |
183 case $DISTRO in
184 centos-7|centos-stream-8)
185 echo "SKIP: integration_systemd_rootless_script requires cgroup v2"
186 ;;
187 *)
188 ssh -tt localhost "make -C /home/runc localrootlessintegration RUNC_USE_SYSTEMD=yes"
189 esac
190 integration_fs_rootless_script: |
191 case $DISTRO in
192 centos-7)
193 echo "SKIP: FIXME: integration_fs_rootless_script is skipped because of EPERM on writing cgroup.procs"
194 ;;
195 *)
196 ssh -tt localhost "make -C /home/runc localrootlessintegration"
197 ;;
198 esac
View as plain text