---
kind: pipeline
name: amd64

platform:
  os: linux
  arch: amd64

trigger:
  event:
    exclude:
    - cron
    - pull_request

clone:
  retries: 3

steps:
- name: build
  image: rancher/dapper:v0.6.0
  secrets: [ AWS_SECRET_ACCESS_KEY-k3s-ci-uploader, AWS_ACCESS_KEY_ID-k3s-ci-uploader, unprivileged_github_token ]
  environment:
    GITHUB_TOKEN:
      from_secret: unprivileged_github_token
    AWS_SECRET_ACCESS_KEY:
      from_secret: AWS_SECRET_ACCESS_KEY-k3s-ci-uploader
    AWS_ACCESS_KEY_ID:
      from_secret: AWS_ACCESS_KEY_ID-k3s-ci-uploader
  commands:
  - dapper ci
  - echo "${DRONE_TAG}-amd64" | sed -e 's/+/-/g' >.tags
  volumes:
  - name: docker
    path: /var/run/docker.sock

- name: fossa
  image: rancher/drone-fossa:latest
  failure: ignore
  settings:
    api_key:
      from_secret: FOSSA_API_KEY
  when:
    instance:
      - drone-publish.k3s.io
    ref:
      include:
        - "refs/heads/main"
        - "refs/heads/release-*"
    event:
      - push
      - tag

- name: test
  image: rancher/dapper:v0.6.0
  secrets: [ AWS_SECRET_ACCESS_KEY-k3s-ci-uploader, AWS_ACCESS_KEY_ID-k3s-ci-uploader ]
  environment:
    ENABLE_REGISTRY: 'true'
    AWS_SECRET_ACCESS_KEY:
      from_secret: AWS_SECRET_ACCESS_KEY-k3s-ci-uploader
    AWS_ACCESS_KEY_ID:
      from_secret: AWS_ACCESS_KEY_ID-k3s-ci-uploader
  commands:
  - docker build --target test-k3s -t k3s:test-${DRONE_STAGE_ARCH}-${DRONE_COMMIT} -f Dockerfile.test .
  - >
    docker run -i -e REPO -e TAG -e DRONE_TAG -e DRONE_BUILD_EVENT -e IMAGE_NAME -e AWS_SECRET_ACCESS_KEY -e AWS_ACCESS_KEY_ID -e SONOBUOY_VERSION -e ENABLE_REGISTRY
    -v /var/run/docker.sock:/var/run/docker.sock --privileged --network host -v /tmp:/tmp k3s:test-${DRONE_STAGE_ARCH}-${DRONE_COMMIT}
  volumes:
  - name: docker
    path: /var/run/docker.sock
  when:
    instance:
    - drone-publish.k3s.io
    ref:
    - refs/tags/*
    event:
    - tag

volumes:
- name: docker
  host:
    path: /var/run/docker.sock

---
kind: pipeline
name: conformance

platform:
  os: linux
  arch: amd64

trigger:
  event:
  - cron
  cron:
  - nightly

steps:
- name: build
  image: rancher/dapper:v0.6.0
  commands:
  - dapper ci
  - echo "${DRONE_TAG}-amd64" | sed -e 's/+/-/g' >.tags
  volumes:
  - name: docker
    path: /var/run/docker.sock

- name: test
  image: rancher/dapper:v0.6.0
  environment:
    ENABLE_REGISTRY: 'true'
  commands:
  - docker build --target test-k3s -t k3s:test-${DRONE_STAGE_ARCH}-${DRONE_COMMIT} -f Dockerfile.test .
  - >
    docker run -i -e REPO -e TAG -e DRONE_TAG -e DRONE_BUILD_EVENT -e IMAGE_NAME -e SONOBUOY_VERSION -e ENABLE_REGISTRY
    -v /var/run/docker.sock:/var/run/docker.sock --privileged --network host -v /tmp:/tmp k3s:test-${DRONE_STAGE_ARCH}-${DRONE_COMMIT}
  volumes:
  - name: docker
    path: /var/run/docker.sock

volumes:
- name: docker
  host:
    path: /var/run/docker.sock

---
kind: pipeline
name: arm64

platform:
  os: linux
  arch: arm64

trigger:
  event:
    exclude:
    - cron
    - pull_request

clone:
  retries: 3

steps:
- name: build
  image: rancher/dapper:v0.6.0
  secrets: [ AWS_SECRET_ACCESS_KEY-k3s-ci-uploader, AWS_ACCESS_KEY_ID-k3s-ci-uploader ]
  environment:
    AWS_SECRET_ACCESS_KEY:
      from_secret: AWS_SECRET_ACCESS_KEY-k3s-ci-uploader
    AWS_ACCESS_KEY_ID:
      from_secret: AWS_ACCESS_KEY_ID-k3s-ci-uploader
  commands:
  - dapper ci
  - echo "${DRONE_TAG}-arm64" | sed -e 's/+/-/g' >.tags
  volumes:
  - name: docker
    path: /var/run/docker.sock

- name: test
  image: rancher/dapper:v0.6.0
  secrets: [ AWS_SECRET_ACCESS_KEY-k3s-ci-uploader, AWS_ACCESS_KEY_ID-k3s-ci-uploader ]
  environment:
    ENABLE_REGISTRY: 'true'
    AWS_SECRET_ACCESS_KEY:
      from_secret: AWS_SECRET_ACCESS_KEY-k3s-ci-uploader
    AWS_ACCESS_KEY_ID:
      from_secret: AWS_ACCESS_KEY_ID-k3s-ci-uploader
  commands:
  - docker build --target test-k3s -t k3s:test-${DRONE_STAGE_ARCH}-${DRONE_COMMIT} -f Dockerfile.test .
  - >
    docker run -i -e REPO -e TAG -e DRONE_TAG -e DRONE_BUILD_EVENT -e IMAGE_NAME -e AWS_SECRET_ACCESS_KEY -e AWS_ACCESS_KEY_ID -e SONOBUOY_VERSION -e ENABLE_REGISTRY
    -v /var/run/docker.sock:/var/run/docker.sock --privileged --network host -v /tmp:/tmp k3s:test-${DRONE_STAGE_ARCH}-${DRONE_COMMIT}
  volumes:
  - name: docker
    path: /var/run/docker.sock
  when:
    instance:
    - drone-publish.k3s.io
    ref:
    - refs/tags/*
    event:
    - tag

volumes:
- name: docker
  host:
    path: /var/run/docker.sock

---
kind: pipeline
name: arm

platform:
  os: linux
  arch: arm

trigger:
  event:
    exclude:
    - cron

clone:
  retries: 3

steps:
- name: skipfiles
  image: plugins/git
  commands:
  - export NAME=$(test $DRONE_BUILD_EVENT = pull_request && echo remotes/origin/${DRONE_COMMIT_BRANCH:-main} || echo ${DRONE_COMMIT_SHA}~)
  - export DIFF=$(git --no-pager diff --name-only $NAME | grep -v -f .droneignore);
  - if [ -z "$DIFF" ]; then
        echo "All files in PR are on ignore list";
        exit 78;
    else
        echo "Some files in PR are not ignored, $DIFF";
    fi;
  when:
    event:
    - pull_request

- name: build
  # Keeping Dapper at v0.5.0 for armv7, as newer versions fails with
  # Bad system call on this architecture. xref:
  #
  # https://github.com/k3s-io/k3s/pull/8959#discussion_r1439736566
  # https://drone-pr.k3s.io/k3s-io/k3s/7922/3/3
  image: rancher/dapper:v0.5.0
  secrets: [ AWS_SECRET_ACCESS_KEY-k3s-ci-uploader, AWS_ACCESS_KEY_ID-k3s-ci-uploader ]
  environment:
    AWS_SECRET_ACCESS_KEY:
      from_secret: AWS_SECRET_ACCESS_KEY-k3s-ci-uploader
    AWS_ACCESS_KEY_ID:
      from_secret: AWS_ACCESS_KEY_ID-k3s-ci-uploader
  commands:
  - dapper ci
  - echo "${DRONE_TAG}-arm" | sed -e 's/+/-/g' >.tags
  volumes:
  - name: docker
    path: /var/run/docker.sock

- name: test
  # Refer to comment for arm/build.
  image: rancher/dapper:v0.5.0
  secrets: [ AWS_SECRET_ACCESS_KEY-k3s-ci-uploader, AWS_ACCESS_KEY_ID-k3s-ci-uploader ]
  environment:
    ENABLE_REGISTRY: 'true'
    AWS_SECRET_ACCESS_KEY:
      from_secret: AWS_SECRET_ACCESS_KEY-k3s-ci-uploader
    AWS_ACCESS_KEY_ID:
      from_secret: AWS_ACCESS_KEY_ID-k3s-ci-uploader
  commands:
  - docker build --target test-k3s -t k3s:test-${DRONE_STAGE_ARCH}-${DRONE_COMMIT} -f Dockerfile.test .
  - >
    docker run -i -e REPO -e TAG -e DRONE_TAG -e DRONE_BUILD_EVENT -e IMAGE_NAME -e AWS_SECRET_ACCESS_KEY -e AWS_ACCESS_KEY_ID -e SONOBUOY_VERSION -e ENABLE_REGISTRY
    -v /var/run/docker.sock:/var/run/docker.sock --privileged --network host -v /tmp:/tmp k3s:test-${DRONE_STAGE_ARCH}-${DRONE_COMMIT}
  volumes:
  - name: docker
    path: /var/run/docker.sock

volumes:
- name: docker
  host:
    path: /var/run/docker.sock

---
kind: pipeline
name: e2e
type: docker

platform:
  os: linux
  arch: amd64

clone:
  retries: 3

steps:
- name: skipfiles
  image: plugins/git
  commands:
  - export NAME=$(test $DRONE_BUILD_EVENT = pull_request && echo remotes/origin/${DRONE_COMMIT_BRANCH:-main} || echo ${DRONE_COMMIT_SHA}~)
  - export DIFF=$(git --no-pager diff --name-only $NAME | grep -v -f .droneignore);
  - if [ -z "$DIFF" ]; then
        echo "All files in PR are on ignore list";
        exit 78;
    else
        echo "Some files in PR are not ignored, $DIFF";
    fi;
  when:
    event:
    - push
    - pull_request

- name: build-e2e-image
  image: docker:25.0.5
  commands:
    - DOCKER_BUILDKIT=1 docker build --target test-e2e -t test-e2e -f Dockerfile.test .
    - apk add make git bash
    - GOCOVER=1 make local-binary
    - cp dist/artifacts/* /tmp/artifacts/
  volumes:
  - name: cache
    path: /tmp/artifacts
  - name: docker
    path: /var/run/docker.sock

- name: test-e2e-validatecluster
  depends_on:
    - build-e2e-image
  image: test-e2e
  pull: never
  resources:
    cpu: 6000
    memory: 10Gi
  environment:
    E2E_REGISTRY: 'true'
    E2E_GOCOVER: 'true'
  commands:
  - mkdir -p dist/artifacts
  - cp /tmp/artifacts/* dist/artifacts/
  # Cleanup VMs that are older than 2h. Happens if a previous test panics or is canceled
  - tests/e2e/scripts/cleanup_vms.sh
  - tests/e2e/scripts/drone_registries.sh
  - |
    cd tests/e2e/validatecluster
    ../scripts/cleanup_vms.sh 'validatecluster_([0-9]+)_(server|agent)'
    go test -v -timeout=45m ./validatecluster_test.go -ci -local
    cp ./coverage.out /tmp/artifacts/validate-coverage.out
  volumes:
  - name: libvirt
    path: /var/run/libvirt/
  - name: docker
    path: /var/run/docker.sock
  - name: cache
    path: /tmp/artifacts

- name: test-e2e-splitserver
  depends_on:
    - build-e2e-image
  image: test-e2e
  pull: never
  resources:
    cpu: 6000
    memory: 10Gi
  environment:
    E2E_REGISTRY: 'true'
    E2E_GOCOVER: 'true'
  commands:
  - mkdir -p dist/artifacts
  - cp /tmp/artifacts/* dist/artifacts/
  - tests/e2e/scripts/drone_registries.sh
  - |
    cd tests/e2e/splitserver
    ../scripts/cleanup_vms.sh 'splitserver_([0-9]+)'
    # Stagger the launch of this test with the validatecluster test
    # to prevent conflicts over libvirt network interfaces
    sleep 15
    go test -v -timeout=30m ./splitserver_test.go -ci -local
    cp ./coverage.out /tmp/artifacts/split-coverage.out
  volumes:
  - name: libvirt
    path: /var/run/libvirt/
  - name: docker
    path: /var/run/docker.sock
  - name: cache
    path: /tmp/artifacts

- name: test-e2e-upgradecluster
  depends_on:
    - build-e2e-image
  image: test-e2e
  pull: never
  resources:
    cpu: 6000
    memory: 10Gi
  environment:
    E2E_REGISTRY: 'true'
    E2E_GOCOVER: 'true'
  commands:
  - mkdir -p dist/artifacts
  - cp /tmp/artifacts/* dist/artifacts/
  - tests/e2e/scripts/drone_registries.sh
  - |
    if [ "$DRONE_BUILD_EVENT" = "pull_request" ]; then
      cd tests/e2e/upgradecluster
      # Convert release-1.XX branch to v1.XX channel
      if [ "$DRONE_BRANCH" = "main" ]; then
        UPGRADE_CHANNEL="latest"
      else
        UPGRADE_CHANNEL=$(echo $DRONE_BRANCH | sed 's/release-/v/')
        # Check if the UPGRADE_CHANNEL exists, in the case of new minor releases it won't
        if ! curl --silent --fail https://update.k3s.io/v1-release/channels/$UPGRADE_CHANNEL; then
          UPGRADE_CHANNEL="latest"
        fi
      fi
      ../scripts/cleanup_vms.sh 'upgradecluster_([0-9]+)_(server|agent)'
      # Stagger the launch of this test with the splitserver test
      # to prevent conflicts over libvirt network interfaces
      sleep 30
      E2E_RELEASE_CHANNEL=$UPGRADE_CHANNEL go test -v -timeout=45m ./upgradecluster_test.go  -ci -local -ginkgo.v
      cp ./coverage.out /tmp/artifacts/upgrade-coverage.out
    fi
  volumes:
  - name: libvirt
    path: /var/run/libvirt/
  - name: docker
    path: /var/run/docker.sock
  - name: cache
    path: /tmp/artifacts
- name: upload to codecov
  depends_on:
    - test-e2e-validatecluster
    - test-e2e-splitserver
    - test-e2e-upgradecluster
  image: robertstettner/drone-codecov
  settings:
    token: 
      from_secret: codecov_token
    files:
      - /tmp/artifacts/validate-coverage.out
      - /tmp/artifacts/split-coverage.out
      - /tmp/artifacts/upgrade-coverage.out
    flags: 
      - e2etests
  when:
    event:
    - push
  volumes:
  - name: cache
    path: /tmp/artifacts

volumes:
- name: docker
  host:
    path: /var/run/docker.sock
- name: libvirt
  host:
    path: /var/run/libvirt/
- name: cache
  temp: {}
