variables: DOCKER_REPOSITORY: mendersoftware/mender-convert S3_BUCKET_NAME: mender-convert-images # These variables are present elsewhere in the repository too. Make sure to # search for and change them too. MENDER_ARTIFACT_VERSION: master MENDER_CLIENT_VERSION: latest MENDER_ADDON_CONNECT_VERSION: latest MENDER_ADDON_CONFIGURE_VERSION: latest ## Auto-update RASPBIAN_URL: "https://downloads.raspberrypi.org/raspios_lite_armhf/images/raspios_lite_armhf-2022-09-26/2022-09-22-raspios-bullseye-armhf-lite.img.xz" RASPBIAN_NAME: 2022-09-22-raspios-bullseye-armhf-lite # Which version of mender-convert to use in published image name. Normally # empty, in which case the branch or tag name will be used, but this variable # is available so that it's possible to make small build fixes on an already # tagged version. MENDER_CONVERT_PUBLISH_VERSION: "" # Whether to run acceptance tests TEST_MENDER_CONVERT: "true" # Whether to publish packages automatically - they can always be published manually PUBLISH_MENDER_CONVERT_AUTOMATIC: "false" TESTS_IN_PARALLEL_CLIENT_ACCEPTANCE: "4" DEBIAN_FRONTEND: noninteractive # Docker dind configuration. # To use dind, make sure gitlab-runner's configuration # has a common mount for /certs (i.e. runners.docker.volumes) directory # and that the dind service name is always docker (default hostname). DOCKER_HOST: "tcp://docker:2376" DOCKER_CERT_PATH: "/certs/client" DOCKER_TLS_VERIFY: "1" DOCKER_TLS_CERTDIR: "/certs" # Ubuntu distribution to use in test_acceptance jobs # Jammy Jellyfish is Ubuntu 22.04 ACC_TESTS_UBUNTU_DISTRO: "jammy" include: - project: 'Northern.tech/Mender/mendertesting' file: '.gitlab-ci-check-commits.yml' - project: 'Northern.tech/Mender/mendertesting' file: '.gitlab-ci-check-license.yml' - project: 'Northern.tech/Mender/mendertesting' file: '.gitlab-ci-github-status-updates.yml' - project: 'Northern.tech/Mender/mendertesting' file: '.gitlab-ci-check-shell-format.yml' stages: - test - build - convert - flash - test_acceptance - publish test:check-commits: only: variables: - '$TEST_MENDER_CONVERT == "true"' test:check-license: rules: - if: '$TEST_MENDER_CONVERT == "true"' test:check-shell-formatting: rules: - if: '$TEST_MENDER_CONVERT == "true"' before_script: - SHELL_SCRIPTS=$(find mender-convert* modules configs scripts -type f -not -name "*.md" -not -path "scripts/linkbot/*" -not -wholename "scripts/test/*") build: stage: build needs: [] image: docker:git services: - docker:20.10.21-dind script: - IMAGE_NAME=$DOCKER_REPOSITORY:pr ./docker-build --build-arg MENDER_ARTIFACT_VERSION=${MENDER_ARTIFACT_VERSION} - docker save $DOCKER_REPOSITORY:pr > image.tar artifacts: expire_in: 2w paths: - image.tar .template_convert_raspbian: &convert_raspbian stage: convert needs: - job: build artifacts: true image: ubuntu:22.04 services: - docker:dind tags: - mender-qa-worker-generic before_script: - apt update && apt install -yy bash wget xz-utils awscli docker.io curl - export IMAGE_NAME=$DOCKER_REPOSITORY:pr - docker load -i image.tar - mkdir -p input - cd input - wget -q ${RASPBIAN_URL} - unxz ${RASPBIAN_NAME}.img.xz - cd .. - eval "$(curl https://raw.githubusercontent.com/mendersoftware/mendertesting/master/mender-ci-common.sh)" script: - env MENDER_ARTIFACT_NAME=${RASPBIAN_NAME}-mender ./docker-mender-convert --disk-image input/${RASPBIAN_NAME}.img --config configs/${RASPBERRYPI_PLATFORM}_config --config configs/images/raspberrypi_raspbian_config # Collect artifacts. - mv deploy ${RASPBERRYPI_PLATFORM} - tar czf ${RASPBERRYPI_PLATFORM}.tar.gz ${RASPBERRYPI_PLATFORM} # Upload to temporary S3 bucket - mender_ci_save_tmp_artifact ${RASPBERRYPI_PLATFORM}.tar.gz artifacts: paths: - checksums convert_raspbian_raspberrypi3: <<: *convert_raspbian variables: RASPBERRYPI_PLATFORM: raspberrypi3 convert_raspbian_raspberrypi4: <<: *convert_raspbian variables: RASPBERRYPI_PLATFORM: raspberrypi4 .bash_helpers: &bash_helpers | # Bash function to check if the string is a final tag function is_final_tag () { version="$1" [[ "${version}" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] && return 0 || return $? } # Bash function to check if the string is a build tag function is_build_tag () { version="$1" [[ "${version}" =~ ^[0-9]+\.[0-9]+\.[0-9]+-build[0-9]+$ ]] && return 0 || return $? } .template_test_acceptance: &test_acceptance stage: test_acceptance needs: - job: build artifacts: true image: ubuntu:${ACC_TESTS_UBUNTU_DISTRO} services: - docker:dind tags: - mender-qa-worker-mender-convert-tests timeout: 2h before_script: - *bash_helpers # Install dependencies - apt update - apt install -qyy bash wget git util-linux mtools python3 python3-pip gcc python3-dev libffi-dev liblzo2-dev libc-dev libssl-dev make sudo awscli unzip qemu-system-x86 ovmf curl docker.io s3cmd fdisk gnupg-agent # Python3 dependencies - python3 -m pip install -U pip - pip3 install --ignore-installed -r tests/requirements_py3.txt # Load image under test - export IMAGE_NAME=$DOCKER_REPOSITORY:pr - docker load -i image.tar # Set mender-image-tests submodule to correct version - git submodule update --init --recursive # Get mender-artifact for the tests - if is_final_tag "${MENDER_ARTIFACT_VERSION}" || is_build_tag "${MENDER_ARTIFACT_VERSION}"; then # Direct download from the pool - wget "https://downloads.mender.io/repos/debian/pool/main/m/mender-artifact/mender-artifact_${MENDER_ARTIFACT_VERSION}-1%2Bubuntu%2B${ACC_TESTS_UBUNTU_DISTRO}_amd64.deb" - dpkg --install mender-artifact_${MENDER_ARTIFACT_VERSION}-1+ubuntu+${ACC_TESTS_UBUNTU_DISTRO}_amd64.deb - rm mender-artifact_${MENDER_ARTIFACT_VERSION}-1+ubuntu+${ACC_TESTS_UBUNTU_DISTRO}_amd64.deb - else # Assume master and install from experimental repo - curl -fLsS https://downloads.mender.io/repos/debian/gpg | apt-key add - - echo "deb [arch=$(dpkg --print-architecture)] https://downloads.mender.io/repos/debian ubuntu/${ACC_TESTS_UBUNTU_DISTRO}/experimental main" > /etc/apt/sources.list.d/mender.list - apt-get update && apt-get install mender-artifact - fi # Prepare versions file for mender-convert - echo "MENDER_CLIENT_VERSION=${MENDER_CLIENT_VERSION}" > versions_override_config - echo "MENDER_ADDON_CONNECT_VERSION=${MENDER_ADDON_CONNECT_VERSION}" >> versions_override_config - echo "MENDER_ADDON_CONFIGURE_VERSION=${MENDER_ADDON_CONFIGURE_VERSION}" >> versions_override_config # Get Update Modules Artifact generators for the tests - if [ "${MENDER_CLIENT_VERSION}" = "latest" ]; then - mender_version=master - else - mender_version="${MENDER_CLIENT_VERSION}" - fi - curl -f -O https://raw.githubusercontent.com/mendersoftware/mender/${mender_version}/support/modules-artifact-gen/directory-artifact-gen - chmod ugo+x directory-artifact-gen - mv directory-artifact-gen /usr/bin/ - curl -f -O https://raw.githubusercontent.com/mendersoftware/mender/${mender_version}/support/modules-artifact-gen/single-file-artifact-gen - chmod ugo+x single-file-artifact-gen - mv single-file-artifact-gen /usr/bin/ artifacts: expire_in: 2w when: always paths: - results_*.xml - report_*.html reports: junit: results_*.xml rules: - if: '$TEST_MENDER_CONVERT == "true"' .template_test_acceptance_prebuilt_raspberrypi: &test_acceptance_prebuilt_raspberrypi <<: *test_acceptance script: - eval "$(curl https://raw.githubusercontent.com/mendersoftware/mendertesting/master/mender-ci-common.sh)" # Fetch artifacts from temporary S3 bucket - mender_ci_load_tmp_artifact ${RASPBERRYPI_PLATFORM}.tar.gz - tar xzf ${RASPBERRYPI_PLATFORM}.tar.gz - mv ${RASPBERRYPI_PLATFORM} deploy # Extract converted Raspbian artifacts - unxz deploy/${RASPBIAN_NAME}-${RASPBERRYPI_PLATFORM}-mender.img.xz - ./scripts/test/run-tests.sh --prebuilt-image raspberrypi ${RASPBIAN_NAME}-${RASPBERRYPI_PLATFORM}-mender -- -n $TESTS_IN_PARALLEL_CLIENT_ACCEPTANCE test_acceptance_prebuilt_raspberrypi3: <<: *test_acceptance_prebuilt_raspberrypi needs: - job: build artifacts: true - job: convert_raspbian_raspberrypi3 artifacts: true variables: RASPBERRYPI_PLATFORM: raspberrypi3 test_acceptance_prebuilt_raspberrypi4: <<: *test_acceptance_prebuilt_raspberrypi needs: - job: build artifacts: true - job: convert_raspbian_raspberrypi4 artifacts: true variables: RASPBERRYPI_PLATFORM: raspberrypi4 test_acceptance_ubuntu_qemux86_64: <<: *test_acceptance script: - mkdir -p input/config - cp versions_override_config input/config/versions_override_config - ./scripts/test/run-tests.sh --config input/config/versions_override_config --only ubuntu-qemux86-64 -- -n $TESTS_IN_PARALLEL_CLIENT_ACCEPTANCE test_acceptance_ubuntu_qemux86_64_no_grub_d: <<: *test_acceptance script: - mkdir -p input/config - cp versions_override_config input/config/versions_override_config - ./scripts/test/run-tests.sh --config input/config/versions_override_config --only ubuntu-qemux86-64-no-grub-d -- -n $TESTS_IN_PARALLEL_CLIENT_ACCEPTANCE test_acceptance_debian_qemux86_64: <<: *test_acceptance script: - mkdir -p input/config - cp versions_override_config input/config/versions_override_config - ./scripts/test/run-tests.sh --config input/config/versions_override_config --only debian-qemux86-64 -- -n $TESTS_IN_PARALLEL_CLIENT_ACCEPTANCE test_acceptance_raspberrypi: <<: *test_acceptance script: - mkdir -p input/config - cp versions_override_config input/config/versions_override_config - ./scripts/test/run-tests.sh --config input/config/versions_override_config --only raspberrypi3 -- -n $TESTS_IN_PARALLEL_CLIENT_ACCEPTANCE test_acceptance_beaglebone: <<: *test_acceptance script: - mkdir -p input/config - cp versions_override_config input/config/versions_override_config - ./scripts/test/run-tests.sh --config input/config/versions_override_config --only beaglebone -- -n $TESTS_IN_PARALLEL_CLIENT_ACCEPTANCE test_acceptance_ubuntu_raspberrypi3: <<: *test_acceptance script: - mkdir -p input/config - cp versions_override_config input/config/versions_override_config - ./scripts/test/run-tests.sh --config input/config/versions_override_config --only ubuntu-raspberrypi3 -- -n $TESTS_IN_PARALLEL_CLIENT_ACCEPTANCE .template:publish:s3: stage: publish image: debian:buster before_script: - apt update && apt install -yyq awscli curl - eval "$(curl https://raw.githubusercontent.com/mendersoftware/mendertesting/master/mender-ci-common.sh)" # Fetch artifacts from temporary S3 bucket - for RASPBERRYPI_PLATFORM in raspberrypi3 raspberrypi4; do - mender_ci_load_tmp_artifact ${RASPBERRYPI_PLATFORM}.tar.gz - tar xzf ${RASPBERRYPI_PLATFORM}.tar.gz - done script: - IMAGE_VERSION=${MENDER_CONVERT_PUBLISH_VERSION:-${CI_COMMIT_REF_NAME}} - for RASPBERRYPI_PLATFORM in raspberrypi3 raspberrypi4; do - PUBLISH_NAME=${RASPBIAN_NAME}-${RASPBERRYPI_PLATFORM}-mender-convert-${IMAGE_VERSION}.img.xz - echo "Publishing ${PUBLISH_NAME} version to S3" - aws s3 cp ${RASPBERRYPI_PLATFORM}/${RASPBIAN_NAME}-${RASPBERRYPI_PLATFORM}-mender.img.xz s3://$S3_BUCKET_NAME/${RASPBIAN_NAME}/arm/${PUBLISH_NAME} - aws s3api put-object-acl --acl public-read --bucket $S3_BUCKET_NAME --key ${RASPBIAN_NAME}/arm/${PUBLISH_NAME} - PUBLISH_NAME=${RASPBIAN_NAME}-${RASPBERRYPI_PLATFORM}-mender-convert-${IMAGE_VERSION}.mender - echo "Publishing ${PUBLISH_NAME} version to S3" - aws s3 cp ${RASPBERRYPI_PLATFORM}/${RASPBIAN_NAME}-${RASPBERRYPI_PLATFORM}-mender.mender s3://$S3_BUCKET_NAME/${RASPBIAN_NAME}/arm/${PUBLISH_NAME} - aws s3api put-object-acl --acl public-read --bucket $S3_BUCKET_NAME --key ${RASPBIAN_NAME}/arm/${PUBLISH_NAME} - done .template:publish:docker-image: stage: publish tags: - docker image: docker services: - name: docker:20.10.21-dind alias: docker command: ["--mtu=1440"] # https://gitlab.com/gitlab-com/gl-infra/production/-/issues/5590 before_script: - docker login -u $DOCKER_HUB_USERNAME -p $DOCKER_HUB_PASSWORD - docker load -i image.tar script: - IMAGE_VERSION=${MENDER_CONVERT_PUBLISH_VERSION:-${CI_COMMIT_REF_NAME}} - docker tag $DOCKER_REPOSITORY:pr $DOCKER_REPOSITORY:$IMAGE_VERSION - docker push $DOCKER_REPOSITORY:$IMAGE_VERSION - echo "PUBLISH_IMAGE_DIGEST=$(docker inspect --format='{{index .RepoDigests 0}}' $DOCKER_REPOSITORY:$IMAGE_VERSION)" >> publish.env artifacts: reports: dotenv: publish.env publish:s3:manual: when: manual extends: .template:publish:s3 publish:s3:automatic: rules: - if: '$PUBLISH_MENDER_CONVERT_AUTOMATIC == "true"' extends: .template:publish:s3 publish:docker-image:manual: when: manual extends: .template:publish:docker-image publish:docker-image:automatic: rules: - if: '$CI_COMMIT_BRANCH =~ /^(master|staging|production|feature-.+|[0-9]+\.[0-9]+\.([0-9]+|x))$/' extends: .template:publish:docker-image #################### # Hardware testing # #################### test:hardware:convert: <<: *convert_raspbian variables: RASPBERRYPI_PLATFORM: raspberrypi4 when: manual stage: convert script: # Convert the image for the hardware tester - env MENDER_ARTIFACT_NAME=${RASPBIAN_NAME}-mender ./docker-mender-convert --disk-image input/${RASPBIAN_NAME}.img --config configs/${RASPBERRYPI_PLATFORM}_config --config configs/images/raspberrypi_raspbian_config --config configs/testing/hardware-testing --overlay tests/ssh-public-key-overlay # Collect artifacts. - mv deploy ${RASPBERRYPI_PLATFORM} - tar czf ${RASPBERRYPI_PLATFORM}.tar.gz ${RASPBERRYPI_PLATFORM} # Upload to temporary S3 bucket - mender_ci_save_tmp_artifact ${RASPBERRYPI_PLATFORM}.tar.gz artifacts: paths: - checksums test:hardware:flash: needs: - job: test:hardware:convert artifacts: true variables: RASPBERRYPI_PLATFORM: raspberrypi4 tags: - hw stage: flash script: - eval "$(curl https://raw.githubusercontent.com/mendersoftware/mendertesting/master/mender-ci-common.sh)" # Fetch artifacts from temporary S3 bucket - mender_ci_load_tmp_artifact ${RASPBERRYPI_PLATFORM}.tar.gz # Flash and boot the device under test - slave-control mode flash - tar -xvzf ${RASPBERRYPI_PLATFORM}.tar.gz --wildcards --no-anchored '*.img' --to-stdout | dd of=/dev/sdmux bs=8M - slave-control mode test test:hardware:acceptance: <<: *test_acceptance variables: RASPBERRYPI_PLATFORM: raspberrypi4 stage: test_acceptance needs: [] needs: - job: build artifacts: true - job: test:hardware:convert artifacts: true - job: test:hardware:flash script: # Fetch artifacts from temporary S3 bucket - eval "$(curl https://raw.githubusercontent.com/mendersoftware/mendertesting/master/mender-ci-common.sh)" - mender_ci_load_tmp_artifact ${RASPBERRYPI_PLATFORM}.tar.gz # Extract the configuration - tar xzf ${RASPBERRYPI_PLATFORM}.tar.gz - mv ${RASPBERRYPI_PLATFORM} deploy # Run the tests - ./scripts/test/run-tests.sh --prebuilt-image raspberrypi4 "${RASPBIAN_NAME}-${RASPBERRYPI_PLATFORM}-mender -- --hardware-testing --host ${SSH_JUMP_HOST_IP}:${SSH_JUMP_HOST_PORT} mender-image-tests -k 'not test_network_based_image_update and not test_image_update_broken_kernel'" -n 1