include:
    - project: 'steam/steam-ci-pipeline'
      file: '/steam-gitlab-ci-common.yml'

variables:
    STEAM_CI_USE_BINARIES_FROM: build
    STEAM_CI_DEPENDENCIES: >-
        debhelper
        glslang-tools
        gtk-doc-tools
        libelf-dev
        libegl1-mesa-dev
        libgl1-mesa-dev
        libgles2-mesa-dev
        libglib2.0-dev
        libglib2.0-doc
        libjson-glib-dev
        libtheora-dev
        libva-dev
        libvdpau-dev
        libvulkan-dev
        libx11-dev
        libxau-dev
        libxcb1-dev
        libxcomposite-dev
        locales
        meson
        pandoc
        python3
        python3.5
        zlib1g

    IMAGES_DOWNLOAD_URL: ''
    IMAGES_DOWNLOAD_CREDENTIAL: ''

    DEBIAN_FRONTEND: noninteractive

    SCOUT_DOCKER_REGISTRY: registry.gitlab.steamos.cloud
    SCOUT_DOCKER_IMAGE: steamrt/scout/sdk:beta
    SCOUT_I386_DOCKER_IMAGE: steamrt/scout/sdk/i386:beta
    SCOUT_APT_SOURCES_FILE: ''
    DEVEL_DOCKER_REGISTRY: ''
    DEVEL_DOCKER_IMAGE: ''
    # Set non-empty to allow
    CI_ALLOW_MISSING_SOURCES: ''

    # Work around _srt_rm_rf behaving oddly on overlayfs:
    # we use FTW_MOUNT to make sure we won't accidentally traverse
    # between filesystems, but on overlayfs files can appear to be on
    # different devices
    STEAM_CI_TMPDIR: "${CI_PROJECT_DIR}/debian/tmpdir"

    BUILD_IMAGE: '${SCOUT_DOCKER_REGISTRY}/${SCOUT_DOCKER_IMAGE}'

    # These need to be configured in
    # https://gitlab.steamos.cloud/groups/steamrt/-/settings/ci_cd
    # Hostname of the machine that receives pressure-vessel releases
    PRESSURE_VESSEL_CI_UPLOAD_HOST: ''
    # Create a File variable with the public key(s) of P_V_CI_UPLOAD_HOST,
    # in the usual ~/.ssh/known_hosts format:
    # upload-host.example ssh-rsa AAA...
    # upload-host.example ecdsa-sha2-nistp256 AAA...
    # upload-host.example ssh-ed25519 AAA...
    PRESSURE_VESSEL_CI_UPLOAD_HOST_SSH_PUBLIC_KEYS_FILE: ''
    # Path on P_V_CI_UPLOAD_HOST: /srv/VHOST/www/pressure-vessel/snapshots
    PRESSURE_VESSEL_CI_UPLOAD_PATH: ''
    # Path on P_V_CI_UPLOAD_HOST: /srv/.../dbgsym/pressure-vessel
    PRESSURE_VESSEL_CI_UPLOAD_DBGSYM_PATH: ''
    # Similar path on P_V_CI_UPLOAD_HOST for unreleased test-builds
    PRESSURE_VESSEL_CI_UPLOAD_PLAYGROUND_PATH: ''
    PRESSURE_VESSEL_CI_UPLOAD_PLAYGROUND_DBGSYM_PATH: ''
    # User to log in on P_V_CI_UPLOAD_HOST
    PRESSURE_VESSEL_CI_UPLOAD_USER: ''
    # Create a File variable with a private key authorized for P_V_CI_UPLOAD_USER
    PRESSURE_VESSEL_CI_UPLOAD_SSH_PRIVATE_KEY_FILE: ''

workflow:
    rules:
        - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
          when: never
        - if: '$CI_COMMIT_BRANCH == "master" && $CI_PIPELINE_SOURCE == "push"'
          when: never
        - when: always

stages:
    - build
    - relocatable-install
    - deploy
    - test

package:
    extends: .build_package
    variables:
        BUILD_IMAGE: '${SCOUT_DOCKER_REGISTRY}/${SCOUT_DOCKER_IMAGE}'
        DEB_BUILD_SNAPSHOT_RELEASE_TAGS: 'yes'
        STEAM_CI_DEB_BUILD: full    # debuild --build=full, aka -F
        STEAM_CI_INSTALL_SCRIPT: |
            apt-get -y install pkg-create-dbgsym
            chmod -R a+rX,og-w .
            umask 022

package:i386:
    extends: .build_package
    variables:
        BUILD_IMAGE: '${SCOUT_DOCKER_REGISTRY}/${SCOUT_I386_DOCKER_IMAGE}'
        DEB_BUILD_SNAPSHOT_RELEASE_TAGS: 'yes'
        STEAM_CI_DEB_BUILD: any     # debuild --build=any, aka -B
        STEAM_CI_INSTALL_SCRIPT: |
            apt-get -y install pkg-create-dbgsym

build:devel:
    stage: build
    tags:
        - docker
        - linux
    rules:
        - if: '$DEVEL_DOCKER_REGISTRY != "" && $DEVEL_DOCKER_IMAGE != ""'
    image: "${DEVEL_DOCKER_REGISTRY}/${DEVEL_DOCKER_IMAGE}"
    script:
        - |
            set -eux

            mkdir -p -m700 "${STEAM_CI_TMPDIR}"
            export TMPDIR="${STEAM_CI_TMPDIR}"

            mkdir -p _build
            meson \
                -Dman=true \
                --werror \
                _build/devel
            ninja -C _build/devel
            ninja -C _build/devel install
            meson test --verbose -C _build/devel

    artifacts:
        paths:
            - _build/devel/meson-logs/*.txt
        when: always

build:clang:
    stage: build
    tags:
        - docker
        - linux
    rules:
        - if: '$DEVEL_DOCKER_REGISTRY != "" && $DEVEL_DOCKER_IMAGE != ""'
    image: "${DEVEL_DOCKER_REGISTRY}/${DEVEL_DOCKER_IMAGE}"
    script:
        - |
            set -eux

            apt-get -y --no-install-recommends install \
            clang \
            clang-tools \
            ${NULL+}

            mkdir -p -m700 "${STEAM_CI_TMPDIR}"
            export TMPDIR="${STEAM_CI_TMPDIR}"

            export CC=clang
            export CXX=clang++

            meson \
                -Db_lundef=false \
                -Db_sanitize=address,undefined \
                --werror \
                _build/clang-asan
            ninja -C _build/clang-asan
            ninja -C _build/clang-asan install
            meson test --verbose -C _build/clang-asan

    artifacts:
        paths:
            - _build/clang-asan/meson-logs/*.txt
        when: always

.prepare_scout: &prepare_scout
    - |
        set -eux

        if [ -n "${SCOUT_APT_SOURCES_FILE}" ]; then
            cp "${SCOUT_APT_SOURCES_FILE}" /etc/apt/sources.list
            echo >> /etc/apt/sources.list

            if [ -n "${STEAM_CI_EXTRA_APT_SOURCES-}" ]; then
              echo "${STEAM_CI_EXTRA_APT_SOURCES}" | while read -r first rest; do
                if [ "x$first" = xboth ]; then
                  echo "deb $rest" >> /etc/apt/sources.list
                  echo "deb-src $rest" >> /etc/apt/sources.list
                else
                  echo "$first $rest" >> /etc/apt/sources.list
                fi
              done
            fi

            apt-get -y update
        fi

        # We need up-to-date packages for the relocatable install to
        # be able to get its source code
        apt-get -y dist-upgrade

        # g++ 4.6 is too old (see also debian/rules)
        export CC=gcc-4.8
        export CXX=g++-4.8

        mkdir -p -m700 "${STEAM_CI_TMPDIR}"
        export TMPDIR="${STEAM_CI_TMPDIR}"

        mkdir -p _build/scout

relocatable-install:production:
    stage: relocatable-install
    needs:
        - package
        - package:i386
    tags:
        - docker
        - linux
    image: "${SCOUT_DOCKER_REGISTRY}/${SCOUT_DOCKER_IMAGE}"
    script:
        - *prepare_scout
        - |
            apt-get -y --no-install-recommends install \
            bubblewrap \
            libglib2.0-dev:amd64 \
            libglib2.0-dev:i386 \
            libxau-dev:amd64 \
            libxau-dev:i386 \
            meson \
            waffle-utils-multiarch:amd64 \
            waffle-utils-multiarch:i386 \
            ${NULL+}

            dpkg -i \
            debian/tmp/artifacts/build/*_amd64.*deb \
            debian/tmp/artifacts/build/libsteam-runtime-tools-0-0-dbgsym_*_i386.*deb \
            debian/tmp/artifacts/build/libsteam-runtime-tools-0-0_*_i386.deb \
            debian/tmp/artifacts/build/libsteam-runtime-tools-0-dev_*_i386.deb \
            debian/tmp/artifacts/build/libsteam-runtime-tools-0-helpers-dbgsym_*_i386.*deb \
            debian/tmp/artifacts/build/libsteam-runtime-tools-0-helpers_*_i386.deb \
            debian/tmp/artifacts/build/libsteam-runtime-tools-0-relocatable-libs_*_i386.deb \
            debian/tmp/artifacts/build/pressure-vessel-libs-i386_*_i386.deb \
            ${NULL+}

            rm -fr _build/production/relocatable-install
            mkdir -p _build/production
            /usr/lib/pressure-vessel/relocatable/bin/pressure-vessel-build-relocatable-install \
              --output _build/production/relocatable-install \
              --archive "$(pwd)/_build/production" \
              --no-archive-versions \
              ${CI_ALLOW_MISSING_SOURCES:+--allow-missing-sources} \
              ${NULL+}
            prove -epython3.5 -v ./tests/pressure-vessel/relocatable-install.py :: \
              "$(pwd)/_build/production/relocatable-install"
    artifacts:
        paths:
            - _build/production/pressure-vessel-bin.tar.gz
            - _build/production/pressure-vessel-bin+src.tar.gz
        when: on_success

.test_dependencies: &test_dependencies
    - |
        set -eux

        dpkg --add-architecture i386
        apt-get -y update
        apt-get -y upgrade
        apt-get -y --no-install-recommends install \
        libc6-i386 \
        libgl1-mesa-dri:i386 \
        time \
        ${NULL+}

.test_template:
    needs:
        - relocatable-install:production
    stage: test
    tags:
        - docker
        - linux
    variables:
        STEAM_CI_DEPENDENCIES: >-
            libgl1-mesa-dri
            locales
            python3
    artifacts:
        paths:
            - _build/artifacts
        when: always

test:debian-10:
    extends: .test_template
    image: debian:buster-slim
    script:
        - *test_dependencies
        - ./tests/pressure-vessel/prepare-test-depots.sh
        - |
            set -eux

            export AUTOPKGTEST_ARTIFACTS="$(pwd)/_build/artifacts"
            export PRESSURE_VESSEL_TEST_CONTAINERS="$(pwd)/_build/depot"
            python3 tests/pressure-vessel/containers.py

test:ubuntu-18.04:
    extends: .test_template
    image: ubuntu:18.04
    script:
        - *test_dependencies
        - ./tests/pressure-vessel/prepare-test-depots.sh
        - |
            set -eux

            export AUTOPKGTEST_ARTIFACTS="$(pwd)/_build/artifacts"
            export PRESSURE_VESSEL_TEST_CONTAINERS="$(pwd)/_build/depot"
            python3 tests/pressure-vessel/containers.py

test:ubuntu-20.04:
    extends: .test_template
    image: ubuntu:20.04
    script:
        - *test_dependencies
        - ./tests/pressure-vessel/prepare-test-depots.sh
        - |
            set -eux

            export AUTOPKGTEST_ARTIFACTS="$(pwd)/_build/artifacts"
            export PRESSURE_VESSEL_TEST_CONTAINERS="$(pwd)/_build/depot"
            python3 tests/pressure-vessel/containers.py

test:archlinux:
    extends: .test_template
    image: archlinux:latest
    # Do not use the global before_script because it is only for Debian based
    # distros
    before_script:
        - |
            set -eux

            # Enable multilib repository
            echo -e "\n[multilib]\nInclude = /etc/pacman.d/mirrorlist" >> /etc/pacman.conf

            pacman -Syu --needed --noconfirm --noprogressbar \
            base-devel \
            git \
            lib32-glibc \
            lib32-mesa \
            python \
            python-chardet \
            python-six \
            python-tappy \
            sudo \
            ${NULL+}

            tempdir="$(mktemp -d)"
            git clone --branch debian/buster https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.steamos.cloud/packaging/python-debian.git "$tempdir/python-debian"
            export PYTHONPATH="$tempdir/python-debian/lib"

    script:
        - ./tests/pressure-vessel/prepare-test-depots.sh
        - |
            set -eux

            export AUTOPKGTEST_ARTIFACTS="$(pwd)/_build/artifacts"
            export PRESSURE_VESSEL_TEST_CONTAINERS="$(pwd)/_build/depot"
            python3 tests/pressure-vessel/containers.py

autopkgtest:
    stage: test
    extends: .autopkgtest
    needs:
        - package
        - package:i386
    variables:
        STEAM_CI_INSTALL_SCRIPT: |
            # We need up-to-date packages for the relocatable install to
            # be able to get its source code
            apt-get -y dist-upgrade

            # Install the packages under test. We're not too worried about
            # minimal dependencies here
            dpkg -i \
            debian/tmp/artifacts/build/libsteam-runtime-tools-0-0_*.deb \
            debian/tmp/artifacts/build/libsteam-runtime-tools-0-0-dbgsym_*_*.*deb \
            debian/tmp/artifacts/build/libsteam-runtime-tools-0-dev_*.deb \
            debian/tmp/artifacts/build/libsteam-runtime-tools-0-helpers_*.deb \
            debian/tmp/artifacts/build/libsteam-runtime-tools-0-helpers-dbgsym_*_*.*deb \
            debian/tmp/artifacts/build/libsteam-runtime-tools-0-tests_*_amd64.deb \
            debian/tmp/artifacts/build/pressure-vessel-relocatable_*_amd64.deb \
            debian/tmp/artifacts/build/pressure-vessel-relocatable-dbgsym_*_amd64.*deb \
            debian/tmp/artifacts/build/pressure-vessel-libs*.deb \
            debian/tmp/artifacts/build/steam-runtime-tools-bin_*_amd64.deb \
            debian/tmp/artifacts/build/steam-runtime-tools-bin-dbgsym_*_amd64.*deb \
            ${NULL+}
            apt-get -y -f install

deploy:
    stage: deploy
    tags:
        - docker
        - linux
    needs:
        - package
        - package:i386
        - relocatable-install:production
    rules:
        - if: '$DEVEL_DOCKER_REGISTRY == ""'
          when: never
        - if: '$DEVEL_DOCKER_IMAGE == ""'
          when: never
        - if: '$PRESSURE_VESSEL_CI_UPLOAD_HOST == ""'
          when: never
        - if: '$PRESSURE_VESSEL_CI_UPLOAD_HOST_SSH_PUBLIC_KEYS_FILE == ""'
          when: never
        - if: '$CI_COMMIT_TAG && $PRESSURE_VESSEL_CI_UPLOAD_PATH == ""'
          when: never
        - if: >-
            $PRESSURE_VESSEL_CI_UPLOAD_PATH == ""
            && $PRESSURE_VESSEL_CI_UPLOAD_PLAYGROUND_PATH == ""
          when: never
        - if: '$PRESSURE_VESSEL_CI_UPLOAD_USER == ""'
          when: never
        - if: '$PRESSURE_VESSEL_CI_UPLOAD_SSH_PRIVATE_KEY_FILE == ""'
          when: never
        - if: '$CI_COMMIT_TAG'
          when: always
        # To debug changes to this CI step, change this to when: always
        # or when: manual, and push to a protected branch
        - when: never
    image: "${DEVEL_DOCKER_REGISTRY}/${DEVEL_DOCKER_IMAGE}"
    variables:
        STEAM_CI_DEPENDENCIES: >-
            openssh-client
    script:
        - |
            if ! [ -f "$PRESSURE_VESSEL_CI_UPLOAD_HOST_SSH_PUBLIC_KEYS_FILE" ]; then
                echo "P_V_CI_UPLOAD_HOST_SSH_PUBLIC_KEYS_FILE must be of type File" >&2
                exit 1
            fi
            if ! [ -f "$PRESSURE_VESSEL_CI_UPLOAD_SSH_PRIVATE_KEY_FILE" ]; then
                echo "P_V_CI_UPLOAD_SSH_PRIVATE_KEY_FILE must be of type File" >&2
                exit 1
            fi
            chmod 0600 "$PRESSURE_VESSEL_CI_UPLOAD_SSH_PRIVATE_KEY_FILE"

            if [ -n "${CI_COMMIT_TAG-}" ]; then
                path="$PRESSURE_VESSEL_CI_UPLOAD_PATH"
                dbgsym_path="$PRESSURE_VESSEL_CI_UPLOAD_DBGSYM_PATH"
            else
                path="$PRESSURE_VESSEL_CI_UPLOAD_PLAYGROUND_PATH"
                dbgsym_path="$PRESSURE_VESSEL_CI_UPLOAD_PLAYGROUND_DBGSYM_PATH"
            fi

            ./pressure-vessel/upload-artifacts.py \
            --host="$PRESSURE_VESSEL_CI_UPLOAD_HOST" \
            --path="$path" \
            --dbgsym-path="$dbgsym_path" \
            --login="$PRESSURE_VESSEL_CI_UPLOAD_USER" \
            --ssh-known-hosts="$PRESSURE_VESSEL_CI_UPLOAD_HOST_SSH_PUBLIC_KEYS_FILE" \
            --ssh-private-key="$PRESSURE_VESSEL_CI_UPLOAD_SSH_PRIVATE_KEY_FILE" \
            ${NULL+}

reuse:
    stage: test
    tags:
        - docker
        - linux
    needs: []
    image:
        name: fsfe/reuse:latest
        entrypoint: [""]
    before_script: []
    script:
        - reuse lint

# vim:set sw=4 sts=4 et: