github: make use of LXD's actions/lp-snap-build in build job #2176
Workflow file for this run
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
name: Tests | |
on: | |
schedule: | |
- cron: '0 0 * * 0' # Weekly on Sunday at 00:00 UTC | |
push: | |
branches: | |
- main | |
pull_request: | |
workflow_dispatch: | |
env: | |
CGO_CFLAGS: -I/home/runner/go/deps/dqlite/include/ | |
CGO_LDFLAGS: -L/home/runner/go/deps/dqlite/.libs/ | |
LD_LIBRARY_PATH: /home/runner/go/deps/dqlite/.libs/ | |
CGO_LDFLAGS_ALLOW: (-Wl,-wrap,pthread_create)|(-Wl,-z,now) | |
GOCOVERDIR: ${{ ( github.event_name == 'workflow_dispatch' || github.event_name == 'schedule' ) && '/home/runner/work/microcloud/microcloud/cover' || '' }} | |
permissions: | |
contents: read | |
concurrency: | |
group: ${{ github.workflow }}-${{ github.ref }} | |
cancel-in-progress: true | |
defaults: | |
run: | |
# Make sure bash is always invoked with `-eo pipefail` | |
# https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsshell | |
shell: bash | |
jobs: | |
changes: | |
name: Changes | |
runs-on: ubuntu-22.04 | |
outputs: | |
except_docs: ${{ steps.filter.outputs.except_docs }} | |
steps: | |
- name: Checkout | |
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | |
- name: Check for changes | |
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2 | |
id: filter | |
with: | |
filters: | | |
except_docs: | |
# Match all changes except 'doc/**'. | |
# If no files outside of 'doc/**' are changed except_docs is set to 'false'. | |
- '!(doc/**)' | |
code-tests: | |
name: Code | |
runs-on: ubuntu-22.04 | |
needs: [changes] | |
if: ${{ needs.changes.outputs.except_docs == 'true' }} | |
steps: | |
- name: Checkout | |
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | |
with: | |
# A non-shallow clone is needed for the Differential ShellCheck | |
fetch-depth: 0 | |
- name: Install Go | |
uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0 | |
with: | |
go-version-file: 'go.mod' | |
- name: Check compatibility with min Go version | |
run: | | |
set -eux | |
GOMIN="$(sed -n 's/^GOMIN=\([0-9.]\+\)$/\1/p' Makefile)" | |
go mod tidy -go="${GOMIN}" | |
- name: Dependency Review | |
uses: actions/dependency-review-action@3b139cfc5fae8b618d3eae3675e383bb1769c019 # v4.5.0 | |
if: github.event_name == 'pull_request' | |
- id: ShellCheck | |
name: Differential ShellCheck | |
uses: redhat-plumbers-in-action/differential-shellcheck@cc6721c45a8800cc666de45493545a07a638d121 # v5.4.0 | |
with: | |
token: ${{ secrets.GITHUB_TOKEN }} | |
strict-check-on-push: true | |
if: github.event_name == 'pull_request' | |
- name: Upload artifact with ShellCheck defects in SARIF format | |
uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 | |
with: | |
name: Differential ShellCheck SARIF | |
path: ${{ steps.ShellCheck.outputs.sarif }} | |
if: github.event_name == 'pull_request' | |
- name: Install dependencies | |
run: | | |
sudo apt-get update | |
sudo apt-get install --no-install-recommends -y pkg-config autoconf automake libtool make libuv1-dev libsqlite3-dev liblz4-dev | |
- name: Build | |
run: | | |
make deps | |
make build-test | |
- name: Run static analysis | |
run: make check-static | |
- name: Make GOCOVERDIR | |
run: mkdir -p "${GOCOVERDIR}" | |
if: env.GOCOVERDIR != '' | |
- name: Unit tests | |
run: | | |
set -eux | |
make check-unit | |
- name: Upload coverage data | |
uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 | |
with: | |
name: coverage-unit | |
path: ${{env.GOCOVERDIR}} | |
if: env.GOCOVERDIR != '' | |
- name: Upload system test dependencies | |
uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 | |
with: | |
name: system-test-deps | |
path: | | |
/home/runner/go/bin/microcloud | |
/home/runner/go/bin/microcloudd | |
/home/runner/go/bin/dqlite | |
retention-days: 1 | |
system-tests: | |
env: | |
DEBUG: "1" | |
SKIP_VM_LAUNCH: "1" | |
SNAPSHOT_RESTORE: "1" | |
name: System | |
runs-on: ubuntu-22.04 | |
needs: code-tests | |
strategy: | |
fail-fast: false | |
matrix: | |
# Test suites that will be combined with the set versions. | |
# Define this first in the matrix so that it's readable | |
# after GitHub as formed the name for the respective check. | |
suite: | |
- "add" | |
- "instances" | |
- "basic" | |
- "recover" | |
- "interactive" | |
- "mismatch" | |
- "preseed" | |
# Set of versions to use for the matrix tests. | |
os: ["24.04"] | |
microceph: ["latest/edge"] | |
microovn: ["latest/edge"] | |
lxd: ["5.21/edge"] | |
microcloud: ["latest/edge"] | |
# Additional test suites that will get included using a different set of versions. | |
include: | |
# Upgrade MicroCloud from 1 to 2 on 22.04 using MicroCeph reef | |
- suite: "upgrade" | |
os: "22.04" | |
microceph: "reef/stable" | |
microovn: "22.03/stable" | |
lxd: "5.21/stable" | |
microcloud: "1/stable" | |
# Upgrade MicroCloud from 1 to 2 on 24.04 using MicroCeph reef | |
- suite: "upgrade" | |
os: "24.04" | |
lxd: "5.21/stable" | |
microceph: "reef/stable" | |
microovn: "22.03/stable" | |
microcloud: "1/stable" | |
# Upgrade MicroCloud from 1 to 2 on 22.04 using MicroCeph quincy | |
- suite: "upgrade" | |
os: "22.04" | |
microceph: "quincy/stable" | |
microovn: "22.03/stable" | |
lxd: "5.21/stable" | |
microcloud: "1/stable" | |
# Upgrade MicroCloud from 1 to 2 on 24.04 using MicroCeph quincy | |
- suite: "upgrade" | |
os: "24.04" | |
lxd: "5.21/stable" | |
microceph: "quincy/stable" | |
microovn: "22.03/stable" | |
microcloud: "1/stable" | |
steps: | |
- name: Performance tuning | |
uses: canonical/lxd/.github/actions/tune-disk-performance@main | |
- name: Reclaim some space | |
uses: canonical/lxd/.github/actions/reclaim-disk-space@main | |
- name: Reclaim some memory | |
run: | | |
set -eux | |
free -mt | |
sudo systemctl stop dpkg-db-backup.timer e2scrub_all.timer fstrim.timer logrotate.timer man-db.timer motd-news.timer phpsessionclean.timer update-notifier-download.timer update-notifier-motd.timer | |
sudo systemctl stop iscsid.socket multipathd.socket | |
sudo systemctl stop cron.service irqbalance.service mono-xsp4.service multipathd.service networkd-dispatcher.service php8.1-fpm.service | |
free -mt | |
- name: Disable Docker | |
uses: canonical/lxd/.github/actions/disable-docker@main | |
- name: "Disable br_netfilter" | |
run: | | |
# When br_netfilter is enabled, the multicast traffic that passes the native LXD bridge | |
# will get masqueraded too which breaks the multicast discovery. | |
sudo rmmod br_netfilter | |
- name: Checkout | |
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | |
- name: Install Go | |
uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0 | |
with: | |
go-version-file: 'go.mod' | |
- name: Install dependencies | |
run: | | |
sudo add-apt-repository ppa:dqlite/dev -y --no-update | |
sudo apt-get update | |
sudo apt-get install --no-install-recommends -y libdqlite-dev pkg-config | |
- name: Download system test dependencies | |
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 | |
with: | |
name: system-test-deps | |
merge-multiple: true | |
path: /home/runner/go/bin | |
- name: Make GOCOVERDIR | |
run: mkdir -p "${GOCOVERDIR}" | |
if: env.GOCOVERDIR != '' | |
- name: Sideload debug binaries | |
run: | | |
set -eux | |
# Binaries to sideload | |
export MICROCLOUD_DEBUG_PATH=~/go/bin/microcloud | |
export MICROCLOUDD_DEBUG_PATH=~/go/bin/microcloudd | |
echo "MICROCLOUD_DEBUG_PATH=${MICROCLOUD_DEBUG_PATH}" >> "${GITHUB_ENV}" | |
echo "MICROCLOUDD_DEBUG_PATH=${MICROCLOUDD_DEBUG_PATH}" >> "${GITHUB_ENV}" | |
- name: Strip debug binaries | |
if: env.GOCOVERDIR == '' | |
run: | | |
set -eux | |
strip -s "${MICROCLOUD_DEBUG_PATH}" "${MICROCLOUDD_DEBUG_PATH}" | |
- name: "Free up the ephemeral disk" | |
run: | | |
set -eux | |
if ! mountpoint --quiet /mnt; then | |
echo "INFO: no ephemeral disk mounted on /mnt" | |
mount | |
exit 0 | |
fi | |
# If the rootfs and the ephemeral part are on the same physical disk, giving the whole | |
# disk to microceph would wipe our rootfs. Since it is pretty rare for GitHub Action | |
# runners to have a single disk, we immediately bail rather than trying to gracefully | |
# handle it. Once snapd releases with https://github.com/snapcore/snapd/pull/13150, | |
# we will be able to stop worrying about that special case. | |
if [ "$(stat -c '%d' /)" = "$(stat -c '%d' /mnt)" ]; then | |
echo "FAIL: rootfs and ephemeral part on the same disk, aborting" | |
lsblk | |
blkid | |
sudo fdisk -l | |
exit 1 | |
fi | |
# Free-up the ephemeral disk to use it as storage device for LXD. | |
sudo swapoff /mnt/swapfile | |
ephemeral_disk="$(findmnt --noheadings --output SOURCE --target /mnt | sed 's/[0-9]\+$//')" | |
sudo umount /mnt | |
sudo wipefs -a "${ephemeral_disk}" | |
export TEST_STORAGE_SOURCE="${ephemeral_disk}" | |
echo "TEST_STORAGE_SOURCE=${TEST_STORAGE_SOURCE}" >> "${GITHUB_ENV}" | |
- name: "Setup host LXD" | |
run: | | |
set -eux | |
sudo snap install lxd --channel 5.21/edge || sudo snap refresh lxd --channel 5.21/edge | |
sudo lxd init --auto --storage-backend=zfs | |
# Save cached images into the (compressed) zpool | |
sudo lxc storage volume create default images | |
sudo lxc config set storage.images_volume=default/images | |
- name: "Prepare for system tests" | |
run: | | |
set -eux | |
chmod +x ~ | |
export BASE_OS="${{ matrix.os }}" | |
export LXD_SNAP_CHANNEL="${{ matrix.lxd }}" | |
export MICROCEPH_SNAP_CHANNEL="${{ matrix.microceph }}" | |
export MICROOVN_SNAP_CHANNEL="${{ matrix.microovn }}" | |
export MICROCLOUD_SNAP_CHANNEL="${{ matrix.microcloud }}" | |
cd test | |
sudo --preserve-env=GOCOVERDIR,DEBUG,GITHUB_ACTIONS,MICROCLOUD_DEBUG_PATH,MICROCLOUDD_DEBUG_PATH,SKIP_VM_LAUNCH,SNAPSHOT_RESTORE,TEST_STORAGE_SOURCE,TESTBED_READY,BASE_OS,LXD_SNAP_CHANNEL,MICROCEPH_SNAP_CHANNEL,MICROOVN_SNAP_CHANNEL,MICROCLOUD_SNAP_CHANNEL ./main.sh setup | |
echo "TESTBED_READY=1" >> "${GITHUB_ENV}" | |
echo "BASE_OS=${BASE_OS}" >> "${GITHUB_ENV}" | |
echo "LXD_SNAP_CHANNEL=${LXD_SNAP_CHANNEL}" >> "${GITHUB_ENV}" | |
echo "MICROCEPH_SNAP_CHANNEL=${MICROCEPH_SNAP_CHANNEL}" >> "${GITHUB_ENV}" | |
echo "MICROOVN_SNAP_CHANNEL=${MICROOVN_SNAP_CHANNEL}" >> "${GITHUB_ENV}" | |
echo "MICROCLOUD_SNAP_CHANNEL=${MICROCLOUD_SNAP_CHANNEL}" >> "${GITHUB_ENV}" | |
- name: "Run system tests (${{ matrix.suite }})" | |
run: | | |
set -eux | |
chmod +x ~ | |
cd test | |
sudo --preserve-env=GOCOVERDIR,DEBUG,GITHUB_ACTIONS,MICROCLOUD_DEBUG_PATH,MICROCLOUDD_DEBUG_PATH,SKIP_VM_LAUNCH,SNAPSHOT_RESTORE,TEST_STORAGE_SOURCE,TESTBED_READY,BASE_OS,LXD_SNAP_CHANNEL,MICROCEPH_SNAP_CHANNEL,MICROOVN_SNAP_CHANNEL,MICROCLOUD_SNAP_CHANNEL ./main.sh ${{ matrix.suite }} | |
echo "TIMESTAMP=$(date +%Y%m%d_%H%M%S_%N)" >> "${GITHUB_ENV}" | |
- name: Upload coverage data | |
uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 | |
with: | |
name: coverage-${{ matrix.suite }}-${{ env.TIMESTAMP }} | |
path: ${{ env.GOCOVERDIR }} | |
if: env.GOCOVERDIR != '' | |
tics: | |
name: Tiobe TICS | |
runs-on: ubuntu-22.04 | |
needs: system-tests | |
if: ${{ ( github.event_name == 'workflow_dispatch' || github.event_name == 'schedule' ) && github.ref_name == 'main' && github.repository == 'canonical/microcloud' }} | |
steps: | |
- name: Checkout | |
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | |
- name: Install Go | |
uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0 | |
with: | |
go-version: 1.23.x | |
- name: Download coverage data | |
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 | |
with: | |
pattern: coverage-* | |
path: ${{env.GOCOVERDIR}} | |
merge-multiple: true | |
- name: Extract coverage data | |
run: | | |
find ${{ env.GOCOVERDIR }}/micro*/cover/ -type f -exec mv {} ${{ env.GOCOVERDIR }} \; | |
rm -rf ${{ env.GOCOVERDIR }}/micro* | |
ls -la ${{ env.GOCOVERDIR }} | |
- name: Download system test dependencies | |
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 | |
with: | |
name: system-test-deps | |
merge-multiple: true | |
path: /home/runner/go/bin | |
- name: Install dependencies | |
run: | | |
go install github.com/axw/gocov/gocov@latest | |
go install github.com/AlekSi/gocov-xml@latest | |
go install honnef.co/go/tools/cmd/staticcheck@latest | |
- name: Convert coverage files | |
run: | | |
go tool covdata textfmt -i="${GOCOVERDIR}" -o "${GOCOVERDIR}"/coverage.out | |
gocov convert "${GOCOVERDIR}"/coverage.out > "${GOCOVERDIR}"/coverage.json | |
gocov-xml < "${GOCOVERDIR}"/coverage.json > "${GOCOVERDIR}"/coverage-go.xml | |
go tool covdata percent -i="${GOCOVERDIR}" | |
- name: Run TICS | |
uses: tiobe/tics-github-action@88cb795a736d2ca885753bec6ed2c8b03e3f892f # v3.3.0 | |
with: | |
mode: qserver | |
project: microcloud | |
viewerUrl: https://canonical.tiobe.com/tiobeweb/TICS/api/cfg?name=default | |
branchdir: ${{ github.workspace }} | |
ticsAuthToken: ${{ secrets.TICS_AUTH_TOKEN }} | |
installTics: true | |
calc: ALL | |
tmpdir: /tmp/tics | |
doc-tests: | |
name: Documentation | |
uses: canonical/documentation-workflows/.github/workflows/documentation-checks.yaml@main | |
with: | |
working-directory: './doc' | |
makefile: 'Makefile' | |
snap: | |
name: Trigger snap edge build | |
runs-on: ubuntu-22.04 | |
needs: [code-tests, system-tests, doc-tests] | |
if: ${{ github.repository == 'canonical/microcloud' && github.event_name == 'push' && github.actor != 'dependabot[bot]' }} | |
env: | |
SSH_AUTH_SOCK: /tmp/ssh_agent.sock | |
PACKAGE: "microcloud" | |
REPO: "git+ssh://[email protected]/~microcloud-snap/microcloud" | |
BRANCH: >- | |
${{ fromJson('{ | |
"main": "latest-edge", | |
"v2-edge": "v2-edge", | |
"v1-edge": "v1-edge", | |
}')[github.ref_name] }} | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | |
- uses: canonical/lxd/.github/actions/lp-snap-build@main | |
with: | |
ssh-key: "${{ secrets.LAUNCHPAD_LXD_BOT_KEY}}" | |
- name: Trigger Launchpad snap build | |
run: | | |
set -eux | |
echo "${PATH}" | |
localRev="$(git rev-parse HEAD)" | |
cd ~/"${PACKAGE}-pkg-snap-lp" | |
lxd-snapcraft -package "${PACKAGE}" -set-version "git-${localRev:0:7}" -set-source-commit "${localRev}" | |
git add --all | |
git commit --all --quiet -s --allow-empty -m "Automatic upstream build (${BRANCH})" -m "Upstream commit: ${localRev}" | |
git show | |
git push --quiet |