Bump docker/metadata-action from 4 to 5 #154
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: Build and Test | |
on: | |
pull_request: | |
jobs: | |
generate-matrix: | |
runs-on: ubuntu-latest | |
outputs: | |
build_matrix: ${{ steps.matrix.outputs.build_matrix }} | |
docker_test_matrix: ${{ steps.matrix.outputs.docker_test_matrix }} | |
podman_test_matrix: ${{ steps.matrix.outputs.podman_test_matrix }} | |
steps: | |
- name: Generate Build Matrix | |
id: matrix | |
run: | | |
PLATFORMS=(linux/386 linux/amd64 linux/arm/v7 linux/arm64 linux/ppc64le) # linux/s390x) | |
BASES=(core core18 core20 core22) | |
BUILD_MATRIX= | |
DOCKER_TEST_MATRIX= | |
PODMAN_TEST_MATRIX= | |
for base in ${BASES[@]}; do | |
channel=latest/stable | |
runner=ubuntu-latest | |
case $base in | |
core) | |
os=xenial | |
channel=4.x/stable | |
experimenal=true | |
runner=ubuntu-20.04 | |
;; | |
core18) | |
os=bionic | |
channel=5.x/stable | |
;; | |
core20) | |
os=focal | |
;; | |
core22) | |
os=jammy | |
;; | |
esac | |
for platform in ${PLATFORMS[@]}; do | |
[ "$platform" = "linux/386" ] && [ "$base" != "core" ] && [ "$base" != "core18" ] && continue | |
[ "$platform" = "linux/s390" ] && ( [ "$base" = "core" ] || [ "$base" = "core18" ] ) && continue | |
experimental=false | |
[ "$platform" = "linux/s390" ] && experimental=true | |
BUILD_MATRIX="${BUILD_MATRIX:+$BUILD_MATRIX,}{\"platform\":\"$platform\",\"base\":{\"snap\":\"$base\",\"os\":\"$os\"},\"experimental\":\"$experimental\"}" | |
DOCKER_TEST_MATRIX="${DOCKER_TEST_MATRIX:+$DOCKER_TEST_MATRIX,}{\"platform\":\"$platform\",\"channel\":\"$channel\",\"base\":\"$base\",\"runner\":\"$runner\",\"experimental\":$experimental}" | |
done | |
PODMAN_TEST_MATRIX="${PODMAN_TEST_MATRIX:+$PODMAN_TEST_MATRIX,}{\"platform\":\"linux/amd64\",\"channel\":\"$channel\",\"base\":\"$base\",\"runner\":\"$runner\"}" | |
done | |
echo "build_matrix={\"include\":[$BUILD_MATRIX]}" >> $GITHUB_OUTPUT | |
echo "docker_test_matrix={\"include\":[$DOCKER_TEST_MATRIX]}" >> $GITHUB_OUTPUT | |
echo "podman_test_matrix={\"include\":[$PODMAN_TEST_MATRIX]}" >> $GITHUB_OUTPUT | |
build: | |
name: Build PR | |
runs-on: ubuntu-latest | |
needs: generate-matrix | |
strategy: | |
matrix: ${{ fromJson(needs.generate-matrix.outputs.build_matrix) }} | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v4 | |
- name: Set up QEMU | |
uses: docker/setup-qemu-action@v3 | |
- name: Set up Docker Buildx | |
uses: docker/setup-buildx-action@v3 | |
- name: Build | |
uses: docker/build-push-action@v6 | |
with: | |
context: . | |
file: ./Dockerfile | |
platforms: ${{ matrix.platform }} | |
tags: test-image | |
push: false | |
outputs: type=docker,dest=test-image.tar | |
build-args: | |
BASE_OS=${{ matrix.base.os }} | |
- name: Save container image | |
id: save_image | |
run: | | |
echo image_name="$(echo "${{matrix.base.snap}}-${{matrix.platform}}.tar" | sed 's|/|_|g')" >> $GITHUB_OUTPUT | |
- uses: actions/upload-artifact@v4 | |
with: | |
name: ${{ steps.save_image.outputs.image_name }} | |
path: ./test-image.tar | |
test-build-snap-docker: | |
name: Test Build Snap with Docker | |
runs-on: ${{matrix.runner}} | |
needs: [ generate-matrix, build ] | |
continue-on-error: ${{ matrix.experimental }} | |
strategy: | |
matrix: ${{ fromJson(needs.generate-matrix.outputs.docker_test_matrix) }} | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v4 | |
- name: Set up QEMU | |
uses: docker/setup-qemu-action@v3 | |
- name: Set up Docker Buildx | |
uses: docker/setup-buildx-action@v3 | |
- name: Enable Docker experimental | |
run: | | |
echo '{"experimental": true}' | sudo tee /etc/docker/daemon.json > /dev/null | |
sudo systemctl restart docker | |
- name: Load container image | |
id: load_image | |
run: | | |
echo image_name="$(echo "${{matrix.base}}-${{matrix.platform}}.tar" | sed 's|/|_|g')" >> $GITHUB_OUTPUT | |
- uses: actions/download-artifact@v4 | |
with: | |
name: ${{ steps.load_image.outputs.image_name }} | |
path: ./artifacts | |
- name: Test build a Snap | |
id: build | |
run: | | |
docker image load -i ./artifacts/test-image.tar | |
docker run --rm --tty --privileged \ | |
--platform "${{ matrix.platform }}" \ | |
--env USE_SNAPCRAFT_CHANNEL="${{ matrix.channel }}" \ | |
--volume "$GITHUB_WORKSPACE/tests/${{ matrix.base }}":"/data" \ | |
--workdir "/data" \ | |
test-image snapcraft | |
test-build-snap-podman: | |
name: Test Build Snap with Podman | |
runs-on: ${{matrix.runner}} | |
needs: [ generate-matrix, build ] | |
continue-on-error: true | |
strategy: | |
matrix: ${{ fromJson(needs.generate-matrix.outputs.podman_test_matrix) }} | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v4 | |
- name: Load container image | |
id: load_image | |
run: | | |
echo image_name="$(echo "${{matrix.base}}-${{matrix.platform}}.tar" | sed 's|/|_|g')" >> $GITHUB_OUTPUT | |
- uses: actions/download-artifact@v4 | |
with: | |
name: ${{ steps.load_image.outputs.image_name }} | |
path: ./artifacts | |
- name: Test build a Snap | |
id: build | |
run: | | |
sudo podman image load -i ./artifacts/test-image.tar | |
sudo podman run --rm --tty --privileged --systemd always \ | |
--env USE_SNAPCRAFT_CHANNEL="${{ matrix.channel }}" \ | |
--volume "$GITHUB_WORKSPACE/tests/${{ matrix.base }}":"/data" \ | |
--workdir "/data" \ | |
localhost/latest snapcraft | |
test-set-channel-docker: | |
name: Test Set Channel with Docker | |
runs-on: ${{matrix.runner}} | |
needs: [ generate-matrix, build ] | |
continue-on-error: ${{ matrix.experimental }} | |
strategy: | |
matrix: ${{ fromJson(needs.generate-matrix.outputs.docker_test_matrix) }} | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v4 | |
- name: Set up QEMU | |
uses: docker/setup-qemu-action@v3 | |
- name: Set up Docker Buildx | |
uses: docker/setup-buildx-action@v3 | |
- name: Enable Docker experimental | |
run: | | |
echo '{"experimental": true}' | sudo tee /etc/docker/daemon.json > /dev/null | |
sudo systemctl restart docker | |
- name: Load container image | |
id: load_image | |
run: | | |
echo image_name="$(echo "${{matrix.base}}-${{matrix.platform}}.tar" | sed 's|/|_|g')" >> $GITHUB_OUTPUT | |
- uses: actions/download-artifact@v4 | |
with: | |
name: ${{ steps.load_image.outputs.image_name }} | |
path: ./artifacts | |
- name: Test changing channel | |
run: | | |
docker image load -i ./artifacts/test-image.tar | |
USE_SNAPCRAFT_CHANNEL="$(echo -n ${{ matrix.channel }} | sed -e 's/stable/candidate/')" | |
echo ::group | |
docker run --rm --tty --privileged \ | |
--platform "${{ matrix.platform }}" \ | |
--env USE_SNAPCRAFT_CHANNEL="$USE_SNAPCRAFT_CHANNEL" \ | |
test-image snap info snapcraft --color=never 2>&1 | tee output.txt | |
echo ::endgroup | |
CHANNEL="$(cat output.txt | \ | |
tr '\r\n' '\n' | \ | |
awk 'BEGIN { FS = ":" }; /^tracking:/ { gsub(/ /, "", $2); print $2 }' | |
)" | |
echo "Snapcraft channel in use: $CHANNEL" | |
[ -n "$CHANNEL" ] && [ "$CHANNEL" = "$USE_SNAPCRAFT_CHANNEL" ] | |
test-set-channel-podman: | |
name: Test Set Channel with Podman | |
runs-on: ${{matrix.runner}} | |
needs: [ generate-matrix, build ] | |
continue-on-error: true | |
strategy: | |
matrix: ${{ fromJson(needs.generate-matrix.outputs.podman_test_matrix) }} | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v4 | |
- name: Load container image | |
id: load_image | |
run: | | |
echo image_name="$(echo "${{matrix.base}}-${{matrix.platform}}.tar" | sed 's|/|_|g')" >> $GITHUB_OUTPUT | |
- uses: actions/download-artifact@v4 | |
with: | |
name: ${{ steps.load_image.outputs.image_name }} | |
path: ./artifacts | |
- name: Test changing channel | |
run: | | |
sudo podman image load -i ./artifacts/test-image.tar | |
USE_SNAPCRAFT_CHANNEL="$(echo -n ${{ matrix.channel }} | sed -e 's/stable/candidate/')" | |
echo ::group | |
sudo podman run --rm --tty --privileged --systemd always \ | |
--env USE_SNAPCRAFT_CHANNEL="$USE_SNAPCRAFT_CHANNEL" \ | |
localhost/latest snap info snapcraft --color=never 2>&1 | tee output.txt | |
echo ::endgroup | |
CHANNEL="$(cat output.txt | \ | |
tr '\r\n' '\n' | \ | |
awk 'BEGIN { FS = ":" }; /^tracking:/ { gsub(/ /, "", $2); print $2 }' | |
)" | |
echo "Snapcraft channel in use: $CHANNEL" | |
[ -n "$CHANNEL" ] && [ "$CHANNEL" = "$USE_SNAPCRAFT_CHANNEL" ] | |
test-failure-docker: | |
name: Test Failures with Docker (expected) | |
runs-on: ${{matrix.runner}} | |
needs: [ generate-matrix, build ] | |
continue-on-error: ${{ matrix.experimental }} | |
strategy: | |
matrix: ${{ fromJson(needs.generate-matrix.outputs.docker_test_matrix) }} | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v4 | |
- name: Set up QEMU | |
uses: docker/setup-qemu-action@v3 | |
- name: Set up Docker Buildx | |
uses: docker/setup-buildx-action@v3 | |
- name: Enable Docker experimental | |
run: | | |
echo '{"experimental": true}' | sudo tee /etc/docker/daemon.json > /dev/null | |
sudo systemctl restart docker | |
- name: Load container image | |
id: load_image | |
run: | | |
echo image_name="$(echo "${{matrix.base}}-${{matrix.platform}}.tar" | sed 's|/|_|g')" >> $GITHUB_OUTPUT | |
- uses: actions/download-artifact@v4 | |
with: | |
name: ${{ steps.load_image.outputs.image_name }} | |
path: ./artifacts | |
- name: Test failure to build a Snap | |
id: build | |
run: | | |
docker image load -i ./artifacts/test-image.tar | |
sed -Ei 's/command: bin\/hello/command: bin\/does-not-exist/' tests/${{ matrix.base }}/snap/snapcraft.yaml | |
if docker run --rm --tty --privileged \ | |
--platform "${{ matrix.platform }}" \ | |
--env USE_SNAPCRAFT_CHANNEL="${{ matrix.channel }}" \ | |
--volume "$GITHUB_WORKSPACE/tests/${{ matrix.base }}":"/data" \ | |
--workdir "/data" \ | |
test-image snapcraft | |
then | |
echo "Snapcraft build should have failed" | |
exit 1 | |
fi | |
test-failure-podman: | |
name: Test Failures with Podman (expected) | |
runs-on: ${{matrix.runner}} | |
needs: [ generate-matrix, build ] | |
continue-on-error: true | |
strategy: | |
matrix: ${{ fromJson(needs.generate-matrix.outputs.podman_test_matrix) }} | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v4 | |
- name: Load container image | |
id: load_image | |
run: | | |
echo image_name="$(echo "${{matrix.base}}-${{matrix.platform}}.tar" | sed 's|/|_|g')" >> $GITHUB_OUTPUT | |
- uses: actions/download-artifact@v4 | |
with: | |
name: ${{ steps.load_image.outputs.image_name }} | |
path: ./artifacts | |
- name: Test failure to build a Snap | |
id: build | |
run: | | |
sudo podman image load -i ./artifacts/test-image.tar | |
sed -Ei 's/command: bin\/hello/command: bin\/does-not-exist/' tests/${{ matrix.base }}/snap/snapcraft.yaml | |
if sudo podman run --rm --tty --privileged --systemd always \ | |
--env USE_SNAPCRAFT_CHANNEL="${{ matrix.channel }}" \ | |
--volume "$GITHUB_WORKSPACE/tests/${{ matrix.base }}":"/data" \ | |
--workdir "/data" \ | |
localhost/latest snapcraft | |
then | |
echo "Snapcraft build should have failed" | |
exit 1 | |
fi |