Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion rockcraft/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
commands.ExpandExtensionsCommand,
],
),
CommandGroup("Lifecycle", [appcommands.RemoteBuild]),
CommandGroup("Lifecycle", [appcommands.TestCommand, appcommands.RemoteBuild]),
]


Expand Down
16 changes: 16 additions & 0 deletions snap/snapcraft.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -196,3 +196,19 @@ parts:
bin/chisel: libexec/rockcraft/chisel
stage:
- libexec/rockcraft/chisel

spread:
plugin: go
source: https://github.com/canonical/spread.git
source-commit: d6447c43754c8ca0741901e9db73d5fdb4d21c93 # 'main' as of 28-March-2025
build-snaps:
- go
build-attributes:
- enable-patchelf
build-environment:
- CGO_ENABLED: 0
- GOFLAGS: -trimpath -ldflags=-w -ldflags=-s
organize:
bin/spread: libexec/rockcraft/craft.spread
stage:
- libexec/rockcraft/
20 changes: 20 additions & 0 deletions tests/spread/rockcraft/craft-test/rockcraft.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
name: craft-test
base: ubuntu@24.04
version: "0.1"
summary: A project used to test 'rockcraft test'
description: |
A project used to test 'rockcraft test'.
platforms:
amd64:

parts:
hello:
plugin: nil
stage-packages: [hello]

services:
hello:
override: merge
command: /usr/bin/hello -g "hello from craft-test rock"
startup: enabled
on-success: shutdown
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
summary: test the 'craft-test' project

execute: |
# Load the rock into docker
ROCK=$(ls $PROJECT_PATH/craft-test*.rock)
sudo rockcraft.skopeo --insecure-policy copy "oci-archive:$ROCK" docker-daemon:craft-test:latest

# Run a container
docker run --rm craft-test:latest -v | MATCH "\[hello\] hello from craft-test rock"

restore: |
docker image rm --force craft-test
25 changes: 25 additions & 0 deletions tests/spread/rockcraft/craft-test/spread.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
project: craft-test

backends:
craft:
systems:
- ubuntu-22.04:
workers: 1

suites:
spread-tests/:
summary: basic tests

prepare: |
sudo snap install docker

# For 'rockcraft.skopeo'
sudo snap install --classic rockcraft

# Wait for docker daemon to come online
sudo apt install --yes retry
retry --times=10 --delay 2 -- docker run hello-world

restore: |
# Other tests use 'retry' from snapd-testing-tools
sudo apt remove --yes retry
195 changes: 195 additions & 0 deletions tests/spread/rockcraft/craft-test/spread/.extension
Original file line number Diff line number Diff line change
@@ -0,0 +1,195 @@
#!/bin/bash

usage() {
echo "usage: $(basename "$0") [command]"
echo "valid commands:"
echo " allocate Create a backend instance to run tests on"
echo " discard Destroy a backend instance used to run tests"
echo " backend-prepare Set up the system to run tests"
echo " backend-restore Restore the system after the tests ran"
echo " backend-prepare-each Prepare the system before each test"
echo " backend-restore-each Restore the system after each test run"
}

prepare() {
case "$SPREAD_SYSTEM" in
fedora*)
dnf update -y
dnf install -y snapd
while ! snap install snapd; do
echo "waiting for snapd..."
sleep 2
done
;;
debian*)
apt update
apt install -y snapd
while ! snap install snapd; do
echo "waiting for snapd..."
sleep 2
done
;;
ubuntu*)
apt update
;;
esac

snap wait system seed.loaded
snap refresh --hold

if systemctl is-enabled unattended-upgades.service; then
systemctl stop unattended-upgrades.service
systemctl mask unattended-upgrades.service
fi
}

restore() {
case "$SPREAD_SYSTEM" in
ubuntu* | debian*)
apt autoremove -y --purge
;;
esac

rm -Rf "$PROJECT_PATH"
mkdir -p "$PROJECT_PATH"
}

prepare_each() {
true
}

restore_each() {
true
}

allocate_lxdvm() {
name=$(echo "$SPREAD_SYSTEM" | tr '[:punct:]' -)
system=$(echo "$SPREAD_SYSTEM" | tr / -)
if [[ "$system" =~ ^ubuntu- ]]; then
image="ubuntu:${system#ubuntu-}"
else
image="images:$(echo "$system" | tr - /)"
fi

VM_NAME="${VM_NAME:-spread-${name}-${RANDOM}}"
DISK="${DISK:-20}"
CPU="${CPU:-4}"
MEM="${MEM:-8}"

lxc launch --vm \
"${image}" \
"${VM_NAME}" \
-c limits.cpu="${CPU}" \
-c limits.memory="${MEM}GiB" \
-d root,size="${DISK}GiB"

while ! lxc exec "${VM_NAME}" -- true &>/dev/null; do sleep 0.5; done
lxc exec "${VM_NAME}" -- sed -i 's/^\s*#\?\s*\(PermitRootLogin\|PasswordAuthentication\)\>.*/\1 yes/' /etc/ssh/sshd_config
lxc exec "${VM_NAME}" -- bash -c "if [ -d /etc/ssh/sshd_config.d ]; then echo -e 'PermitRootLogin yes\nPasswordAuthentication yes' > /etc/ssh/sshd_config.d/00-spread.conf; fi"
lxc exec "${VM_NAME}" -- bash -c "echo root:${SPREAD_PASSWORD} | sudo chpasswd || true"

# Print the instance address to stdout
ADDR=""
while [ -z "$ADDR" ]; do ADDR=$(lxc ls -f csv | grep "^${VM_NAME}" | cut -d"," -f3 | cut -d" " -f1); done
echo "$ADDR" 1>&3
}

discard_lxdvm() {
instance_name="$(lxc ls -f csv | sed ':a;N;$!ba;s/(docker0)\n/(docker0) /' | grep "$SPREAD_SYSTEM_ADDRESS " | cut -f1 -d",")"
lxc delete -f "$instance_name"
}

allocate_ci() {
if [ -z "$CI" ]; then
echo "This backend is intended to be used only in CI systems."
exit 1
fi
sudo sed -i 's/^\s*#\?\s*\(PermitRootLogin\|PasswordAuthentication\)\>.*/\1 yes/' /etc/ssh/sshd_config
if [ -d /etc/ssh/sshd_config.d ]; then echo -e 'PermitRootLogin yes\nPasswordAuthentication yes' | sudo tee /etc/ssh/sshd_config.d/00-spread.conf; fi
sudo systemctl daemon-reload
sudo systemctl restart ssh

echo "root:${SPREAD_PASSWORD}" | sudo chpasswd || true

# Print the instance address to stdout
echo localhost >&3
}

discard_ci() {
true
}

allocate() {
exec 3>&1
exec 1>&2

case "$1" in
lxd-vm)
allocate_lxdvm
;;
ci)
allocate_ci
;;
*)
echo "unsupported backend $1" 2>&1
;;
esac
}

discard() {
case "$1" in
lxd-vm)
discard_lxdvm
;;
ci)
discard_ci
;;
*)
echo "unsupported backend $1" 2>&1
;;
esac
}

set -e

while getopts "" o; do
case "${o}" in
*)
usage
exit 1
;;
esac
done
shift $((OPTIND - 1))

CMD="$1"
PARM="$2"

if [ -z "$CMD" ]; then
usage
exit 0
fi

case "$CMD" in
allocate)
allocate "$PARM"
;;
discard)
discard "$PARM"
;;
backend-prepare)
prepare
;;
backend-restore)
restore
;;
backend-prepare-each)
prepare_each
;;
backend-restore-each)
restore_each
;;
*)
echo "unknown command $CMD" >&2
;;
esac
7 changes: 7 additions & 0 deletions tests/spread/rockcraft/craft-test/task.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
summary: Test 'rockcraft test'

environment:
CI: "1"

execute: |
rockcraft test -v 2>&1 | MATCH "Successful tasks: 1"
Loading