From 440c0f230ae7358e890bf2e045b8df18079c3082 Mon Sep 17 00:00:00 2001 From: George Boukeas Date: Mon, 7 Oct 2024 10:00:21 +0100 Subject: [PATCH] [CHECKBOX-1447] Github workflow for promoting beta to candidate (Infra) (#1284) * [CHECKBOX-1447] feat: Add workflow for promoting beta to candidate * [CHECKBOX-1447] fix: include branch when using composite action * [CHECKBOX-1447] update promotion workflow * [CHECKBOX-1447] fix: correct conditional for Checkbox version * [CHECKBOX-1447] Download installer from main tools branch * chore: update Checkbox promotion workflow to latest scriptlets * fix: exit from `test_cmds` with Checkbox's exit status * feat: Use job template instead of inline job definition * fix: rename template to avoid it being treated as a workflow * fix: use quotes when using matrix values for environment variables * fix: appropriate name and branch * chore: path no longer necessary for calling `fetch_manifest` * feat: retrieve auxillary launcher fragments from Checkbox repo * Expand matrix of promo job (infra) (#1388) * Expand canary matrix for candidate promotion * Temporarily remove `--no-wait` from snap install * Fix debian install step * Use/maintain a single scriptlet branch --------- Co-authored-by: George Boukeas * fix: remove erroneous matrix entry * fix: use `wait_for_snap_change_id` when installing Checkbox from snap * fix: wait for global (instead of specific) snap changes * chore: remove `push` trigger for promotion workflow --------- Co-authored-by: Massimiliano --- .../checkbox-promote-beta-to-candidate.yml | 82 +++++++++++++++++++ .../job.template | 79 ++++++++++++++++++ .../resources/manifest.conf | 12 +++ .../resources/testplan.conf | 13 +++ 4 files changed, 186 insertions(+) create mode 100644 .github/workflows/checkbox-promote-beta-to-candidate.yml create mode 100644 .github/workflows/checkbox-promote-beta-to-candidate/job.template create mode 100644 .github/workflows/checkbox-promote-beta-to-candidate/resources/manifest.conf create mode 100644 .github/workflows/checkbox-promote-beta-to-candidate/resources/testplan.conf diff --git a/.github/workflows/checkbox-promote-beta-to-candidate.yml b/.github/workflows/checkbox-promote-beta-to-candidate.yml new file mode 100644 index 0000000000..1a09937056 --- /dev/null +++ b/.github/workflows/checkbox-promote-beta-to-candidate.yml @@ -0,0 +1,82 @@ +name: Promote Checkbox beta to candidate +on: + workflow_dispatch: + +jobs: + checkbox-promotion-beta-to-candidate-test: + runs-on: [self-hosted, testflinger] + strategy: + fail-fast: false + matrix: + include: + - queue: 201712-26047 + data_source: "distro: xenial" + checkbox_runtime: checkbox16 + checkbox_track: uc16 + + - queue: 201712-26047 + data_source: "distro: focal" + checkbox_runtime: checkbox20 + checkbox_track: uc20 + + - queue: 201712-26047 + data_source: "distro: bionic" + + - queue: 202203-30061 + data_source: "distro: jammy" + checkbox_runtime: checkbox22 + checkbox_track: uc22 + + - queue: 202203-30061 + data_source: "distro: jammy" + + - queue: 202012-28526 + data_source: "distro: noble" + checkbox_runtime: checkbox24 + checkbox_track: uc24 + + - queue: 202012-28526 + data_source: "distro: noble" + + - queue: 202201-29865 + data_source: "distro: bionic" + checkbox_runtime: checkbox18 + checkbox_track: uc18 + + - queue: 202201-29865 + data_source: "distro: focal" + + - queue: rpi4b + data_source: "url: http://cdimage.ubuntu.com/ubuntu-core/22/dangerous-stable/current/ubuntu-core-22-arm64+raspi.img.xz" + checkbox_runtime: checkbox22 + checkbox_track: uc22 + + - queue: rpi4b + data_source: "url: http://cdimage.ubuntu.com/ubuntu-core/22/dangerous-stable/current/ubuntu-core-22-armhf+raspi.img.xz" + checkbox_runtime: checkbox22 + checkbox_track: uc22 + steps: + - name: Checkout checkbox monorepo + uses: actions/checkout@v4 + + - name: Create job file (by instantiating template) + id: create-job + run: | + JOB_PATH=${{ github.workspace }}/job.yaml + # instantiate job template with input values + INPUT_QUEUE="${{ matrix.queue }}" \ + INPUT_DATA_SOURCE="${{ matrix.data_source }}" \ + INPUT_CHECKBOX_RUNTIME="${{ matrix.checkbox_runtime }}" \ + INPUT_CHECKBOX_TRACK="${{ matrix.checkbox_track }}" \ + INPUT_RESOURCES_PATH="${{ github.workspace }}/.github/workflows/checkbox-promote-beta-to-candidate/resources" \ + envsubst '$INPUT_QUEUE $INPUT_DATA_SOURCE $INPUT_CHECKBOX_RUNTIME $INPUT_CHECKBOX_TRACK $INPUT_RESOURCES_PATH' \ + < $GITHUB_WORKSPACE/.github/workflows/checkbox-promote-beta-to-candidate/job.template \ + > $JOB_PATH + # return path for instantiated job file + echo "job=$JOB_PATH" >> $GITHUB_OUTPUT + + - name: Submit job + uses: canonical/testflinger/.github/actions/submit@main + with: + poll: true + job-path: ${{ steps.create-job.outputs.job }} diff --git a/.github/workflows/checkbox-promote-beta-to-candidate/job.template b/.github/workflows/checkbox-promote-beta-to-candidate/job.template new file mode 100644 index 0000000000..700c024f81 --- /dev/null +++ b/.github/workflows/checkbox-promote-beta-to-candidate/job.template @@ -0,0 +1,79 @@ +job_queue: $INPUT_QUEUE +global_timeout: 3600 +output_timeout: 1800 +provision_data: + $INPUT_DATA_SOURCE +test_data: + attachments: + - local: "$INPUT_RESOURCES_PATH/manifest.conf" + agent: "resources/manifest.conf" + - local: "$INPUT_RESOURCES_PATH/testplan.conf" + agent: "resources/testplan.conf" + test_cmds: | + #!/usr/bin/env bash + + set -x + + # input arguments + CHECKBOX_RUNTIME=$INPUT_CHECKBOX_RUNTIME + CHECKBOX_TRACK=$INPUT_CHECKBOX_TRACK + + # flag to indicate how Checkbox is installed on the device (snap or deb) + [ -n "$CHECKBOX_RUNTIME" ] && [ -n "$CHECKBOX_TRACK" ] && SNAP_FLAG="true" || SNAP_FLAG="false" + + # constants + CHANNEL=beta + TOOLS_PATH=tools + + # retrieve all scripts/tools necessary from a repo + curl -Ls -o install_tools.sh https://raw.githubusercontent.com/canonical/hwcert-jenkins-tools/CERTTF-337-scriptlets-sru/install_tools.sh + source install_tools.sh $TOOLS_PATH --branch CERTTF-337-scriptlets-sru + + # ensure device is available before continuing + wait_for_ssh + + # install checkbox runtime on device (snap or deb) + if [[ "$SNAP_FLAG" == "true" ]]; then + echo "Installing checkbox runtime on device (from snap)" + CHANGE_ID=$(_run sudo snap install $CHECKBOX_RUNTIME --no-wait --channel=latest/$CHANNEL) + wait_for_snap_changes + CHANGE_ID=$(_run sudo snap install checkbox --devmode --channel=$CHECKBOX_TRACK/$CHANNEL) + wait_for_snap_changes + # list all the installed snaps to facilitate debugging + _run snap list + CHECKBOX_CLI_CMD="checkbox.checkbox-cli" + else + echo "Installing checkbox runtime on device (from deb package)" + _run sudo add-apt-repository -y ppa:checkbox-dev/$CHANNEL + _run install_packages checkbox-ng python3-checkbox-ng checkbox-provider-base checkbox-provider-resource checkbox-provider-sru fswebcam obexftp wmctrl iperf mesa-utils vim pastebinit fwts xorg-dev gir1.2-clutter-1.0 + # list installed checkbox-related packages to facilitate debugging + _run "apt list --installed | grep checkbox" + CHECKBOX_CLI_CMD="checkbox-cli" + fi + + check_for_checkbox_service --debug || exit 1 + + # sync Checkbox version between agent and device + CHECKBOX_VERSION=$(_run $CHECKBOX_CLI_CMD --version) + [ -z "$CHECKBOX_VERSION" ] && echo "Error: Unable to retrieve Checkbox version from device" && exit 1 + echo "Installing checkbox $CHECKBOX_VERSION on agent container from source" + install_checkbox_agent_source $CHECKBOX_VERSION $TOOLS_PATH + + # retrieve manifest + RESOURCES_PATH=attachments/test/resources + MANIFEST_FILE=manifest.conf + fetch_manifest --manifest_file manifest.conf $CID $HEXR_DEVICE_SECURE_ID + if [ $? -ne 0 ]; then + echo "Using default manifest" + MANIFEST_FILE=$RESOURCES_PATH/manifest.conf + fi + # create checkbox launcher + stacker --output checkbox.conf $RESOURCES_PATH/testplan.conf $MANIFEST_FILE + + # run the canary test plan + PYTHONUNBUFFERED=1 checkbox-cli control $DEVICE_IP checkbox.conf + EXITCODE=$? + + # placeholder for gathering possible artifacts + + exit $EXITCODE diff --git a/.github/workflows/checkbox-promote-beta-to-candidate/resources/manifest.conf b/.github/workflows/checkbox-promote-beta-to-candidate/resources/manifest.conf new file mode 100644 index 0000000000..fbd1adecc6 --- /dev/null +++ b/.github/workflows/checkbox-promote-beta-to-candidate/resources/manifest.conf @@ -0,0 +1,12 @@ +[manifest] +com.canonical.certification::has_bt_smart = false +com.canonical.certification::has_camera = true +com.canonical.certification::has_card_reader = true +com.canonical.certification::has_ethernet_adapter = true +com.canonical.certification::has_thunderbolt = false +com.canonical.certification::has_thunderbolt3 = false +com.canonical.certification::has_touchscreen = false +com.canonical.certification::has_tpm2_chip = false +com.canonical.certification::has_usb_storage = true +com.canonical.certification::has_usb_type_c = false +com.canonical.certification::has_wlan_adapter = true \ No newline at end of file diff --git a/.github/workflows/checkbox-promote-beta-to-candidate/resources/testplan.conf b/.github/workflows/checkbox-promote-beta-to-candidate/resources/testplan.conf new file mode 100644 index 0000000000..b96e62bd7a --- /dev/null +++ b/.github/workflows/checkbox-promote-beta-to-candidate/resources/testplan.conf @@ -0,0 +1,13 @@ +[launcher] +launcher_version = 1 +stock_reports = certification + +[test plan] +unit = com.canonical.certification::canary +forced = yes + +[test selection] +forced = true + +[ui] +type = silent \ No newline at end of file