stages:
  - test
  - build
  - upload
  - release

variables:
  PACKAGE_ENDPOINT: "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/"
  ALPINE_DEPS: "make gcc git scdoc musl-dev linux-headers openssl-dev zlib-dev lua5.3-dev lua5.3-lzlib cmocka-dev python3-dev"
  ALPINE_STATIC_DEPS: "zlib-static openssl-libs-static"

.test:alpine:
  stage: test
  image:
    name: alpine
  script:
    - apk add -u meson $ALPINE_DEPS $ALPINE_JOB_DEPS $ALPINE_STATIC_DEPS zstd-dev zstd-static
    - meson setup --auto-features=enabled build
    - ninja -C build
    - meson setup build-static -Dc_link_args=-static -Ddefault_library=static -Dprefer_static=true
    - ninja -C build-static src/apk
    - meson test -C build
  artifacts:
    reports:
      junit: build/**/*.junit.xml

test:alpine:x86_64:
  extends: .test:alpine
  variables:
    ALPINE_JOB_DEPS: "shellcheck"
  tags:
    - docker-alpine
    - x86_64

test:alpine:x86:
  extends: .test:alpine
  image:
    entrypoint: ["linux32", "sh", "-c"]
    docker:
      platform: linux/i386
  tags:
    - docker-alpine
    - x86

test:alpine-alt-config:
  image: alpine
  stage: test
  script:
    - apk add -u meson $ALPINE_DEPS
    - meson setup build -Durl_backend=wget -Dzstd=false
    - ninja -C build
  tags:
    - docker-alpine
    - x86_64

test:alpine-muon:
  image: alpine:edge
  stage: test
  script:
    - echo https://dl-cdn.alpinelinux.org/alpine/edge/testing >> /etc/apk/repositories
    - apk add -u muon $ALPINE_DEPS $ALPINE_STATIC_DEPS zstd-dev zstd-static
    - muon setup build
    - ninja -C build
    - muon setup -Dc_link_args="-static" -Dprefer_static=true -Ddefault_library=static build-static
    - ninja -C build-static src/apk
  tags:
    - docker-alpine
    - x86_64

test:alpine-legacy:
  stage: test
  image:
    name: alpine
  script:
    - apk add -u $ALPINE_DEPS zstd-dev
    - make -j$(nproc) check
  tags:
    - docker-alpine
    - x86_64

test:debian:
  image: debian
  stage: test
  script:
    - apt-get update
    - apt-get install -y make gcc git libssl-dev zlib1g-dev libzstd-dev lua5.3-dev lua5.2 lua-zlib-dev sudo meson
    - unlink /bin/sh
    - ln -s /bin/bash /bin/sh
    - meson setup build
    - ninja -C build
  tags:
    - docker-alpine
    - x86_64

build-static:
  stage: build
  image: alpinelinux/build-base:latest-$ARCH
  script:
    - abuild-apk add -u $ALPINE_DEPS $ALPINE_STATIC_DEPS zstd-dev zstd-static
    - make -j$(nproc) static
    - install -s -m0755 src/apk.static src/apk.static-$ARCH
  parallel:
    matrix:
      - ARCH:
        - x86_64
        - x86
        - armv7
        - armhf
        - aarch64
        - s390x
        - ppc64le
        - riscv64
  artifacts:
    paths:
      - src/apk.static-*
  tags:
    - docker-alpine
    - $ARCH

make-release:
  stage: release
  image: registry.gitlab.com/gitlab-org/release-cli:latest
  script:
    - |-
      apk add curl
      for artifact in src/apk.static-*; do
        ! [ -f "$artifact" ] && { echo "No artifacts found"; exit 1; }
        ARCH=${artifact#*-}
        echo "Uploading binary for $ARCH"
        curl --fail -H "JOB-TOKEN: $CI_JOB_TOKEN" -T "$artifact" -o /dev/null ${PACKAGE_ENDPOINT}/$CI_COMMIT_TAG/$ARCH/apk.static
        done
    - echo "Making a release"
  release:
    name: $CI_COMMIT_TAG
    description: "Release $CI_COMMIT_TAG"
    tag_name: $CI_COMMIT_TAG
    ref: $CI_COMMIT_TAG
    assets:
      links:
        - name: apk.static (x86_64)
          url: $PACKAGE_ENDPOINT/$CI_COMMIT_TAG/x86_64/apk.static
        - name: apk.static (x86)
          url: $PACKAGE_ENDPOINT/$CI_COMMIT_TAG/x86/apk.static
        - name: apk.static (armv7)
          url: $PACKAGE_ENDPOINT/$CI_COMMIT_TAG/armv7/apk.static
        - name: apk.static (armhf)
          url: $PACKAGE_ENDPOINT/$CI_COMMIT_TAG/armhf/apk.static
        - name: apk.static (aarch64)
          url: $PACKAGE_ENDPOINT/$CI_COMMIT_TAG/aarch64/apk.static
        - name: apk.static (s390x)
          url: $PACKAGE_ENDPOINT/$CI_COMMIT_TAG/s390x/apk.static
        - name: apk.static (ppc64le)
          url: $PACKAGE_ENDPOINT/$CI_COMMIT_TAG/ppc64le/apk.static
        - name: apk.static (riscv64)
          url: $PACKAGE_ENDPOINT/$CI_COMMIT_TAG/riscv64/apk.static
  rules:
    - if: $CI_COMMIT_TAG
  tags:
    - docker-alpine
    - x86_64