forked from containers/bootc
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Move install tests shell script into Rust
A few things going on here: - Rewrite logic from shell script into Rust (using xshell, so it's still convenient to fork commands) - Make the test logic take an externally-built container image instead of using a `-v bootc:/usr/bin/bootc` bind mount - Build the container image using our stock hack/Containerfile in Github Actions instead of building for c9s in GHA - This all hence starts to make the logic reusable outside of Github Actions too; the container build is a known standard thing. Signed-off-by: Colin Walters <[email protected]>
- Loading branch information
Showing
10 changed files
with
320 additions
and
92 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -68,26 +68,6 @@ jobs: | |
with: | ||
name: bootc.tar.zst | ||
path: target/bootc.tar.zst | ||
build-c9s: | ||
if: ${{ !contains(github.event.pull_request.labels.*.name, 'control/skip-ci') }} | ||
runs-on: ubuntu-latest | ||
container: quay.io/centos/centos:stream9 | ||
steps: | ||
- run: dnf -y install git-core | ||
- uses: actions/checkout@v4 | ||
- name: Install deps | ||
run: ./ci/installdeps.sh | ||
- name: Cache Dependencies | ||
uses: Swatinem/rust-cache@v2 | ||
with: | ||
key: "build-c9s" | ||
- name: Build | ||
run: make test-bin-archive | ||
- name: Upload binary | ||
uses: actions/upload-artifact@v4 | ||
with: | ||
name: bootc-c9s.tar.zst | ||
path: target/bootc.tar.zst | ||
cargo-deny: | ||
runs-on: ubuntu-latest | ||
steps: | ||
|
@@ -127,78 +107,24 @@ jobs: | |
run: sudo tar -C / -xvf bootc.tar.zst | ||
- name: Integration tests | ||
run: bootc internal-tests run-container-integration | ||
privtest-alongside: | ||
install-tests: | ||
if: ${{ !contains(github.event.pull_request.labels.*.name, 'control/skip-ci') }} | ||
name: "Test install-alongside" | ||
needs: [build-c9s] | ||
runs-on: ubuntu-latest | ||
name: "Test install" | ||
# For a not-ancient podman | ||
runs-on: ubuntu-24.04 | ||
steps: | ||
- name: Checkout repository | ||
uses: actions/checkout@v4 | ||
- name: Ensure host skopeo is disabled | ||
run: sudo rm -f /bin/skopeo /usr/bin/skopeo | ||
- name: Download | ||
uses: actions/download-artifact@v4 | ||
with: | ||
name: bootc-c9s.tar.zst | ||
- name: Install | ||
run: tar -xvf bootc.tar.zst | ||
- name: Integration tests | ||
run: | | ||
set -xeuo pipefail | ||
image=quay.io/centos-bootc/centos-bootc-dev:stream9 | ||
echo 'ssh-ed25519 ABC0123 [email protected]' > test_authorized_keys | ||
sudo podman run --rm --privileged -v ./test_authorized_keys:/test_authorized_keys --env RUST_LOG=debug -v /:/target -v /var/lib/containers:/var/lib/containers -v ./usr/bin/bootc:/usr/bin/bootc --pid=host --security-opt label=disable \ | ||
${image} bootc install to-filesystem --acknowledge-destructive \ | ||
--karg=foo=bar --disable-selinux --replace=alongside --root-ssh-authorized-keys=/test_authorized_keys /target | ||
ls -al /boot/loader/ | ||
sudo grep foo=bar /boot/loader/entries/*.conf | ||
grep authorized_keys /ostree/deploy/default/deploy/*/etc/tmpfiles.d/bootc-root-ssh.conf | ||
# TODO fix https://github.com/containers/bootc/pull/137 | ||
sudo chattr -i /ostree/deploy/default/deploy/* | ||
sudo rm /ostree/deploy/default -rf | ||
sudo podman run --rm --privileged --env RUST_LOG=debug -v /:/target -v /var/lib/containers:/var/lib/containers -v ./usr/bin/bootc:/usr/bin/bootc --pid=host --security-opt label=disable \ | ||
${image} bootc install to-existing-root --acknowledge-destructive | ||
sudo podman run --rm --privileged -v /:/target -v ./usr/bin/bootc:/usr/bin/bootc --pid=host --security-opt label=disable ${image} bootc internal-tests verify-selinux /target/ostree --warn | ||
install-to-existing-root: | ||
if: ${{ !contains(github.event.pull_request.labels.*.name, 'control/skip-ci') }} | ||
name: "Test install-to-existing-root" | ||
needs: [build-c9s] | ||
runs-on: ubuntu-latest | ||
steps: | ||
- name: Download | ||
uses: actions/download-artifact@v4 | ||
with: | ||
name: bootc-c9s.tar.zst | ||
- name: Install | ||
run: tar -xvf bootc.tar.zst | ||
- name: Integration tests | ||
run: | | ||
set -xeuo pipefail | ||
# We should be able to install to-existing-root with no install config, | ||
# so we bind mount an empty directory over /usr/lib/bootc/install. | ||
empty=$(mktemp -d) | ||
image=quay.io/centos-bootc/centos-bootc-dev:stream9 | ||
sudo podman run --rm --privileged --env RUST_LOG=debug -v /:/target -v /var/lib/containers:/var/lib/containers -v ./usr/bin/bootc:/usr/bin/bootc -v ${empty}:/usr/lib/bootc/install --pid=host --security-opt label=disable \ | ||
${image} bootc install to-existing-root | ||
install-to-loopback: | ||
if: ${{ !contains(github.event.pull_request.labels.*.name, 'control/skip-ci') }} | ||
name: "Test install to-disk --via-loopback" | ||
needs: [build-c9s] | ||
runs-on: ubuntu-latest | ||
steps: | ||
- name: Download | ||
uses: actions/download-artifact@v4 | ||
with: | ||
name: bootc-c9s.tar.zst | ||
- name: Install | ||
run: tar -xvf bootc.tar.zst | ||
- name: Integration tests | ||
run: | | ||
set -xeuo pipefail | ||
image=quay.io/centos-bootc/centos-bootc-dev:stream9 | ||
tmpdisk=$(mktemp -p /var/tmp) | ||
truncate -s 20G ${tmpdisk} | ||
sudo podman run --rm --privileged --env RUST_LOG=debug -v /dev:/dev -v /:/target -v /var/lib/containers:/var/lib/containers -v ./usr/bin/bootc:/usr/bin/bootc --pid=host --security-opt label=disable \ | ||
-v ${tmpdisk}:/disk ${image} bootc install to-disk --via-loopback /disk | ||
set -xeu | ||
sudo podman build -t localhost/bootc -f hack/Containerfile . | ||
# Nondestructive but privileged tests | ||
cargo run -p tests-integration host-privileged localhost/bootc | ||
# Finally the install-alongside suite | ||
cargo run -p tests-integration install-alongside localhost/bootc | ||
docs: | ||
if: ${{ contains(github.event.pull_request.labels.*.name, 'documentation') }} | ||
runs-on: ubuntu-latest | ||
|
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
# Our integration tests | ||
[package] | ||
name = "tests-integration" | ||
version = "0.1.0" | ||
license = "MIT OR Apache-2.0" | ||
edition = "2021" | ||
publish = false | ||
|
||
[[bin]] | ||
name = "tests-integration" | ||
path = "src/tests-integration.rs" | ||
|
||
[dependencies] | ||
anyhow = "1.0.82" | ||
camino = "1.1.6" | ||
cap-std-ext = "4" | ||
clap = { version= "4.5.4", features = ["derive","cargo"] } | ||
fn-error-context = "0.2.1" | ||
libtest-mimic = "0.7.3" | ||
tempfile = "3.10.1" | ||
xshell = { version = "0.2.6" } |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
# Integration tests crate | ||
|
||
This crate holds integration tests (as distinct from the regular | ||
Rust unit tests run as part of `cargo test`). | ||
|
||
## `install-alongside` | ||
|
||
This suite is destructive, executing the bootc `install to-existing-root` | ||
style flow using the host root. | ||
|
||
## `host-privileged` | ||
|
||
This suite assumes privileges, but is nondestructive. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
use anyhow::Result; | ||
use fn_error_context::context; | ||
use libtest_mimic::Trial; | ||
use xshell::cmd; | ||
|
||
/// Tests that require real root (e.g. CAP_SYS_ADMIN) to do things like | ||
/// create loopback devices, but are *not* destructive. At the current time | ||
/// these tests are defined to reference a bootc container image. | ||
#[context("Hostpriv tests")] | ||
pub(crate) fn run_hostpriv(image: &str, testargs: libtest_mimic::Arguments) -> Result<()> { | ||
// Just leak the image name so we get a static reference as required by the test framework | ||
let image: &'static str = String::from(image).leak(); | ||
let base_args = super::install::BASE_ARGS; | ||
|
||
let tests = [Trial::test("loopback install", move || { | ||
let sh = &xshell::Shell::new()?; | ||
let size = 10 * 1000 * 1000 * 1000; | ||
let mut tmpdisk = tempfile::NamedTempFile::new_in("/var/tmp")?; | ||
tmpdisk.as_file_mut().set_len(size)?; | ||
let tmpdisk = tmpdisk.into_temp_path(); | ||
let tmpdisk = tmpdisk.to_str().unwrap(); | ||
cmd!(sh, "sudo {base_args...} -v {tmpdisk}:/disk {image} bootc install to-disk --via-loopback --skip-fetch-check /disk").run()?; | ||
Ok(()) | ||
})]; | ||
|
||
libtest_mimic::run(&testargs, tests.into()).exit() | ||
} |
Oops, something went wrong.