# Copyright (c) 2019-2022, NVIDIA CORPORATION.  All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

include:
  - .common-ci.yml

# Define the package build helpers
.multi-arch-build:
  before_script:
    - apk add --no-cache coreutils build-base sed git bash make
    - '[[ -n "${SKIP_QEMU_SETUP}" ]] || docker run --rm --privileged multiarch/qemu-user-static --reset -p yes -c yes'

.package-artifacts:
  variables:
    ARTIFACTS_NAME: "toolkit-container-${CI_PIPELINE_ID}"
    ARTIFACTS_ROOT: "toolkit-container-${CI_PIPELINE_ID}"
    DIST_DIR: ${CI_PROJECT_DIR}/${ARTIFACTS_ROOT}

.package-build:
  extends:
    - .multi-arch-build
    - .package-artifacts
  stage: package-build
  timeout: 3h
  script:
    - ./scripts/build-packages.sh ${DIST}-${ARCH}

  artifacts:
    name: ${ARTIFACTS_NAME}
    paths:
      - ${ARTIFACTS_ROOT}
  needs:
    - job: package-meta-packages
      artifacts: true

# Define the package build targets
package-meta-packages:
  extends:
    - .package-artifacts
  stage: package-build
  variables:
    SKIP_LIBNVIDIA_CONTAINER: "yes"
    SKIP_NVIDIA_CONTAINER_TOOLKIT: "yes"
  parallel:
    matrix:
      - PACKAGING: [deb, rpm]
  before_script:
    - apk add --no-cache coreutils build-base sed git bash make
  script:
    - ./scripts/build-packages.sh ${PACKAGING}
  artifacts:
    name: ${ARTIFACTS_NAME}
    paths:
      - ${ARTIFACTS_ROOT}

package-centos7-aarch64:
  extends:
    - .package-build
    - .dist-centos7
    - .arch-aarch64

package-centos7-x86_64:
  extends:
    - .package-build
    - .dist-centos7
    - .arch-x86_64

package-centos8-ppc64le:
  extends:
    - .package-build
    - .dist-centos8
    - .arch-ppc64le

package-ubuntu18.04-amd64:
  extends:
    - .package-build
    - .dist-ubuntu18.04
    - .arch-amd64

package-ubuntu18.04-arm64:
  extends:
    - .package-build
    - .dist-ubuntu18.04
    - .arch-arm64

package-ubuntu18.04-ppc64le:
  extends:
    - .package-build
    - .dist-ubuntu18.04
    - .arch-ppc64le

.buildx-setup:
  before_script:
    -  export BUILDX_VERSION=v0.6.3
    -  apk add --no-cache curl
    -  mkdir -p ~/.docker/cli-plugins
    -  curl -sSLo ~/.docker/cli-plugins/docker-buildx "https://github.com/docker/buildx/releases/download/${BUILDX_VERSION}/buildx-${BUILDX_VERSION}.linux-amd64"
    -  chmod a+x ~/.docker/cli-plugins/docker-buildx

    -  docker buildx create --use --platform=linux/amd64,linux/arm64

    -  '[[ -n "${SKIP_QEMU_SETUP}" ]] || docker run --rm --privileged multiarch/qemu-user-static --reset -p yes'

# Define the image build targets
.image-build:
  stage: image-build
  variables:
    IMAGE_NAME: "${CI_REGISTRY_IMAGE}/container-toolkit"
    VERSION: "${CI_COMMIT_SHORT_SHA}"
    PUSH_ON_BUILD: "true"
  before_script:
    - !reference [.buildx-setup, before_script]

    - apk add --no-cache bash make git
    - 'echo "Logging in to CI registry ${CI_REGISTRY}"'
    - docker login -u "${CI_REGISTRY_USER}" -p "${CI_REGISTRY_PASSWORD}" "${CI_REGISTRY}"
  script:
    - make -f deployments/container/Makefile build-${DIST}

image-ubi8:
  extends:
    - .image-build
    - .package-artifacts
    - .dist-ubi8
  needs:
    # Note: The ubi8 image uses the centos7 packages
    - package-centos7-aarch64
    - package-centos7-x86_64

image-ubuntu20.04:
  extends:
    - .image-build
    - .package-artifacts
    - .dist-ubuntu20.04
  needs:
    - package-ubuntu18.04-amd64
    - package-ubuntu18.04-arm64
    - job: package-ubuntu18.04-ppc64le
      optional: true

# The DIST=packaging target creates an image containing all built packages
image-packaging:
  extends:
    - .image-build
    - .package-artifacts
    - .dist-packaging
  needs:
    - job: package-ubuntu18.04-amd64
    - job: package-ubuntu18.04-arm64
    - job: package-amazonlinux2-aarch64
      optional: true
    - job: package-amazonlinux2-x86_64
      optional: true
    - job: package-centos7-aarch64
      optional: true
    - job: package-centos7-x86_64
      optional: true
    - job: package-centos8-ppc64le
      optional: true
    - job: package-debian10-amd64
      optional: true
    - job: package-opensuse-leap15.1-x86_64
      optional: true
    - job: package-ubuntu18.04-ppc64le
      optional: true

# Define publish test helpers
.test:docker:
  extends:
    - .integration
  variables:
    TEST_CASES: "docker"

.test:containerd:
  # TODO: The containerd tests fail due to issues with SIGHUP.
  # Until this is resolved with retry up to twice and allow failure here.
  retry: 2
  allow_failure: true
  extends:
    - .integration
  variables:
    TEST_CASES: "containerd"

.test:crio:
  extends:
    - .integration
  variables:
    TEST_CASES: "crio"

# Define the test targets
test-toolkit-ubuntu20.04:
  extends:
    - .test:toolkit
    - .dist-ubuntu20.04
  needs:
    - image-ubuntu20.04

test-containerd-ubuntu20.04:
  extends:
    - .test:containerd
    - .dist-ubuntu20.04
  needs:
    - image-ubuntu20.04

test-crio-ubuntu20.04:
  extends:
    - .test:crio
    - .dist-ubuntu20.04
  needs:
    - image-ubuntu20.04

test-docker-ubuntu20.04:
  extends:
    - .test:docker
    - .dist-ubuntu20.04
  needs:
    - image-ubuntu20.04