Skip to content

Split images and add CI script to run e2e in-cluster #249

Split images and add CI script to run e2e in-cluster

Split images and add CI script to run e2e in-cluster #249

Workflow file for this run

# Copyright (C) 2021 ScyllaDB
name: Build & Test
on:
push:
# Restrict the branches to only those we want to promote from.
branches:
- 'master'
- 'v[0-9]+.[0-9]+'
# Act only on temporary tags, the final ones are created by manually promoting
# an existing candidate image, after it goes through QA. We need to be carefully
# to avoid overwriting those, building from the same sources may not result
# in the same image content that was tested, e.g. if a base image changed in the meantime.
tags:
- 'v[0-9]+.[0-9]+.[0-9]+-alpha.[0-9]+'
- 'v[0-9]+.[0-9]+.[0-9]+-beta.[0-9]+'
- 'v[0-9]+.[0-9]+.[0-9]+-rc.[0-9]+'
pull_request:
branches:
- '**'
types:
- opened
- edited
- reopened
- synchronize
env:
go_version: 1.21
GOPATH: ${{ github.workspace }}/go
git_repo_path: ${{ github.workspace }}/go/src/github.com/scylladb/k8s-local-volume-provisioner
image_repo_ref: docker.io/scylladb/k8s-local-volume-provisioner
retention_days: 7
defaults:
run:
shell: bash
working-directory: "./go/src/github.com/scylladb/k8s-local-volume-provisioner"
jobs:
verify:
name: Verify
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v3
with:
path: ${{ env.git_repo_path }}
- name: Setup go
uses: actions/setup-go@v3
with:
go-version: ${{ env.go_version }}
- name: Verify
run: make verify --warn-undefined-variables
verify-deps:
name: Verify dependencies
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v3
with:
path: ${{ env.git_repo_path }}
- name: Setup go
uses: actions/setup-go@v3
with:
go-version: ${{ env.go_version }}
- name: Verify dependencies
run: make verify-deps --warn-undefined-variables
build-and-test:
name: Build and test
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v3
with:
path: ${{ env.git_repo_path }}
fetch-depth: 0
- name: Setup git tags
if: ${{ startsWith(github.ref, 'refs/tags/') }}
run: ./hack/ci-detect-tags.sh
- name: Setup go
uses: actions/setup-go@v3
with:
go-version: ${{ env.go_version }}
- name: Build
run: make --warn-undefined-variables
- name: Make sure new unit tests aren't flaky
if: ${{ github.event_name == 'pull_request' }}
run: |
echo "GO_TEST_COUNT=-count=3" | tee -a ${GITHUB_ENV}
echo "GINKGO_TEST_COUNT=-repeat=3" | tee -a ${GITHUB_ENV}
- name: Test
run: make test --warn-undefined-variables
images:
name: Build images
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v3
with:
path: ${{ env.git_repo_path }}
fetch-depth: 0
- name: Setup git tags
if: ${{ startsWith(github.ref, 'refs/tags/') }}
run: ./hack/ci-detect-tags.sh
- name: Build image
run: |
set -euExo pipefail
shopt -s inherit_errexit
# Avoid podman permission error on Ubuntu 20.04 by using it as root, although it shouldn't be needed.
# Use --format=docker to support SHELL instruction in the Dockerfile. (SHELL didn't make it to OCI spec.)
sudo podman --cgroup-manager=cgroupfs build --format=docker --squash --network=none -f ./Dockerfile -t '${{ env.image_repo_ref }}:ci' .
sudo podman images '${{ env.image_repo_ref }}:ci'
sudo podman save '${{ env.image_repo_ref }}:ci' | lz4 - ~/driverimage.tar.lz4
- name: Upload image artifact
uses: actions/upload-artifact@v3
with:
name: driverimage.tar.lz4
path: ~/driverimage.tar.lz4
if-no-files-found: error
retention-days: ${{ env.retention_days }}
test-e2e-serial:
name: Test e2e serial
runs-on: ubuntu-22.04
needs: images
steps:
- uses: actions/checkout@v3
with:
path: ${{ env.git_repo_path }}
fetch-depth: 0
- name: Run e2e
uses: ./go/src/github.com/scylladb/k8s-local-volume-provisioner/.github/actions/run-e2e
with:
repositoryPath: ${{ env.git_repo_path }}
jobSuffix: "serial"
suite: "conformance/serial"
test-e2e-parallel:
name: Test e2e parallel
runs-on: ubuntu-22.04
needs: images
steps:
- uses: actions/checkout@v3
with:
path: ${{ env.git_repo_path }}
fetch-depth: 0 # also fetch tags
- name: Run e2e
uses: ./go/src/github.com/scylladb/k8s-local-volume-provisioner/.github/actions/run-e2e
with:
repositoryPath: ${{ env.git_repo_path }}
jobSuffix: "parallel"
suite: "conformance/parallel"
success:
name: All tests successfull
runs-on: ubuntu-22.04
needs:
- verify
- verify-deps
- build-and-test
- images
- test-e2e-serial
- test-e2e-parallel
steps:
- name: Always succeed
working-directory: .
run: true
promote:
name: Promote artifacts
runs-on: ubuntu-22.04
needs: [success]
if: ${{ github.event_name != 'pull_request' }}
steps:
- uses: actions/checkout@v3
with:
path: ${{ env.git_repo_path }}
fetch-depth: 0
- name: Setup git tags
if: ${{ startsWith(github.ref, 'refs/tags/') }}
run: ./hack/ci-detect-tags.sh
- name: Setup go
uses: actions/setup-go@v3
with:
go-version: ${{ env.go_version }}
- name: Determine promotion tag
run: |
set -euExo pipefail
shopt -s inherit_errexit
source ./hack/lib/tag-from-gh-ref.sh
CI_IMAGE_TAG=$( tag_from_gh_ref "${GITHUB_REF}" )
echo "CI_IMAGE_TAG=${CI_IMAGE_TAG}" | tee -a ${GITHUB_ENV}
- uses: actions/download-artifact@v3
with:
name: driverimage.tar.lz4
path: ~/
- name: Load image
run: |
set -euExo pipefail
shopt -s inherit_errexit
unlz4 ~/driverimage.tar.lz4 - | docker load
# docker looses the registry part on save/load
docker tag "$( echo "${image_repo_ref}:ci" | sed -E -e 's~[^/]+/(.*)~\1~' )" "${image_repo_ref}:ci"
docker images '${{ env.image_repo_ref }}:ci'
- name: Login to DockerHub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Promote image
run: |
set -euExo pipefail
shopt -s inherit_errexit
docker tag '${{ env.image_repo_ref }}:ci' '${{ env.image_repo_ref }}:${{ env.CI_IMAGE_TAG }}'
docker push '${{ env.image_repo_ref }}:${{ env.CI_IMAGE_TAG }}'
failure-notifications:
name: Failure notifications
runs-on: ubuntu-22.04
needs:
- success
- promote
if: ${{ failure() && github.event_name != 'pull_request' }}
steps:
- name: Report failures to Slack
if: ${{ always() }}
working-directory: .
run: |
# We have to avoid printing the secret to logs.
set -euExo pipefail
shopt -s inherit_errexit
curl -X POST -H 'Content-type: application/json' --data @<( cat <<-EOF
{
"text": ":warning: CI workflow \"${{ github.workflow }}\" triggered on \"${{ github.event_name }}\" event from ${{ github.ref }} (${{ github.sha }}) failed!\n:fire_extinguisher: See https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} for details.:fire:"
}
EOF
) '${{ secrets.SLACK_WEBHOOK_URL }}'