From aee802cb099d5b1bc9389f7588a760d84cf3996c Mon Sep 17 00:00:00 2001 From: Frederik Ring Date: Thu, 16 Mar 2023 19:32:44 +0100 Subject: [PATCH] Migrate CI setup to GitHub Actions, also publish to GHCR (#199) * Run tests in GitHub actions * Do not try to allocate a pseudo TTY when running compose commands * Try hard disabling TTY allocation * Use compose plugin * Test scripts shall not try to allocate a TTY * Pass correct base version * Check whether env var is even needed * Stop running tests in CircleCI * Run releases from GitHub actions as well * Manually construct tags to be pushed on release --- .circleci/config.yml | 75 ----------------------------------- .github/workflows/release.yml | 53 +++++++++++++++++++++++++ .github/workflows/test.yml | 17 ++++++++ test/azure/run.sh | 10 ++--- test/certs/run.sh | 2 +- test/cli/run.sh | 2 +- test/extend/run.sh | 3 +- test/s3/run.sh | 4 +- test/secrets/run.sh | 2 +- test/ssh/run.sh | 4 +- test/swarm/run.sh | 2 +- test/webdav/run.sh | 4 +- 12 files changed, 87 insertions(+), 91 deletions(-) delete mode 100644 .circleci/config.yml create mode 100644 .github/workflows/release.yml create mode 100644 .github/workflows/test.yml diff --git a/.circleci/config.yml b/.circleci/config.yml deleted file mode 100644 index 9b59360..0000000 --- a/.circleci/config.yml +++ /dev/null @@ -1,75 +0,0 @@ -version: 2.1 - -jobs: - canary: - machine: - image: ubuntu-2004:202201-02 - working_directory: ~/docker-volume-backup - resource_class: large - steps: - - checkout - - run: - name: Build - command: | - docker build . -t offen/docker-volume-backup:canary - - run: - name: Install gnupg - command: | - sudo apt-get install -y gnupg - - run: - name: Run tests - working_directory: ~/docker-volume-backup/test - command: | - export GPG_TTY=$(tty) - ./test.sh canary - - build: - docker: - - image: cimg/base:2020.06 - environment: - DOCKER_BUILDKIT: '1' - DOCKER_CLI_EXPERIMENTAL: enabled - working_directory: ~/docker-volume-backup - resource_class: large - steps: - - checkout - - setup_remote_docker: - version: 20.10.6 - - docker/install-docker-credential-helper: - release-tag: v0.6.4 - - docker/configure-docker-credentials-store - - run: - name: Push to Docker Hub - command: | - echo "$DOCKER_ACCESSTOKEN" | docker login --username offen --password-stdin - # This is required for building ARM: https://gitlab.alpinelinux.org/alpine/aports/-/issues/12406 - docker run --rm --privileged linuxkit/binfmt:v0.8 - docker context create docker-volume-backup - docker buildx create docker-volume-backup --name docker-volume-backup --use - docker buildx inspect --bootstrap - tag_args="-t offen/docker-volume-backup:$CIRCLE_TAG" - if [[ "$CIRCLE_TAG" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then - # prerelease tags like `v2.0.0-alpha.1` should not be released as `latest` - tag_args="$tag_args -t offen/docker-volume-backup:latest" - tag_args="$tag_args -t offen/docker-volume-backup:$(echo "$CIRCLE_TAG" | cut -d. -f1)" - fi - docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 \ - $tag_args . --push - -workflows: - version: 2 - docker_image: - jobs: - - canary: - filters: - tags: - ignore: /^v.*/ - - build: - filters: - branches: - ignore: /.*/ - tags: - only: /^v.*/ - -orbs: - docker: circleci/docker@2.1.4 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..9d8d8a1 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,53 @@ +name: Release Docker Image + +on: + push: + tags: ^v.* + +jobs: + push_to_registries: + name: Push Docker image to multiple registries + runs-on: ubuntu-latest + permissions: + packages: write + contents: read + steps: + - name: Check out the repo + uses: actions/checkout@v3 + + - name: Log in to Docker Hub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Log in to GHCR + uses: docker/login-action@v2 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract Docker tags + id: meta + run: | + version_tag="${{github.ref_name}}" + tags=($version_tag) + if [[ "$version_tag" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + # prerelease tags like `v2.0.0-alpha.1` should not be released as `latest` nor `v2` + tags+=("latest") + tags+=($(echo "$version_tag" | cut -d. -f1)) + fi + releases="" + for tag in "${tags[@]}"; do + releases="${releases:+$releases,}offen/docker-volume-backup:$tag,ghcr.io/offen/docker-volume-backup:$tag" + done + echo "releases=$releases" >> "$GITHUB_OUTPUT" + + - name: Build and push Docker images + uses: docker/build-push-action@v4 + with: + context: . + push: true + platforms: linux/amd64,linux/arm64,linux/arm/v7 + tags: ${{ steps.meta.outputs.releases }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..4dc5fcc --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,17 @@ +name: Run Integration Tests + +on: + - push + +jobs: + test: + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v3 + - name: Build Docker Image + run: docker build . -t offen/docker-volume-backup:test + - name: Run Tests + working-directory: ./test + run: | + export GPG_TTY=$(tty) + ./test.sh test diff --git a/test/azure/run.sh b/test/azure/run.sh index 0077706..01de8a9 100644 --- a/test/azure/run.sh +++ b/test/azure/run.sh @@ -6,12 +6,12 @@ cd "$(dirname "$0")" . ../util.sh current_test=$(basename $(pwd)) -docker-compose up -d +docker compose up -d sleep 5 # A symlink for a known file in the volume is created so the test can check # whether symlinks are preserved on backup. -docker-compose exec backup backup +docker compose exec backup backup sleep 5 @@ -29,12 +29,12 @@ pass "Found relevant files in untared remote backups." BACKUP_RETENTION_DAYS="0" docker-compose up -d sleep 5 -docker-compose exec backup backup +docker compose exec backup backup -docker-compose run --rm az_cli \ +docker compose run --rm az_cli \ az storage blob download -f /dump/test.tar.gz -c test-container -n path/to/backup/test.tar.gz test -f ./local/test.tar.gz pass "Remote backups have not been deleted." -docker-compose down --volumes +docker compose down --volumes diff --git a/test/certs/run.sh b/test/certs/run.sh index c021ec0..f8446d5 100644 --- a/test/certs/run.sh +++ b/test/certs/run.sh @@ -33,7 +33,7 @@ sleep 5 expect_running_containers "3" -docker run --rm -it \ +docker run --rm \ -v minio_backup_data:/minio_data \ alpine \ ash -c 'tar -xvf /minio_data/backup/test.tar.gz -C /tmp && test -f /tmp/backup/app_data/offen.db' diff --git a/test/cli/run.sh b/test/cli/run.sh index 937b4ba..07b1906 100755 --- a/test/cli/run.sh +++ b/test/cli/run.sh @@ -48,7 +48,7 @@ docker run --rm \ --entrypoint backup \ offen/docker-volume-backup:${TEST_VERSION:-canary} -docker run --rm -it \ +docker run --rm \ -v backup_data:/data alpine \ ash -c 'tar -xvf /data/backup/test.tar.gz && test -f /backup/app_data/offen.db && test -d /backup/empty_data' diff --git a/test/extend/run.sh b/test/extend/run.sh index 1c95cad..b083e17 100644 --- a/test/extend/run.sh +++ b/test/extend/run.sh @@ -8,9 +8,10 @@ current_test=$(basename $(pwd)) mkdir -p local +export BASE_VERSION="${TEST_VERSION:-canary}" export TEST_VERSION="${TEST_VERSION:-canary}-with-rsync" -docker build . -t offen/docker-volume-backup:$TEST_VERSION +docker build . -t offen/docker-volume-backup:$TEST_VERSION --build-arg version=$BASE_VERSION docker compose up -d sleep 5 diff --git a/test/s3/run.sh b/test/s3/run.sh index 84c7ae9..4022ae4 100755 --- a/test/s3/run.sh +++ b/test/s3/run.sh @@ -17,7 +17,7 @@ sleep 5 expect_running_containers "3" -docker run --rm -it \ +docker run --rm \ -v minio_backup_data:/minio_data \ alpine \ ash -c 'tar -xvf /minio_data/backup/test-hostnametoken.tar.gz -C /tmp && test -f /tmp/backup/app_data/offen.db' @@ -32,7 +32,7 @@ sleep 5 docker compose exec backup backup -docker run --rm -it \ +docker run --rm \ -v minio_backup_data:/minio_data \ alpine \ ash -c '[ $(find /minio_data/backup/ -type f | wc -l) = "1" ]' diff --git a/test/secrets/run.sh b/test/secrets/run.sh index cf3af92..aae0cd6 100755 --- a/test/secrets/run.sh +++ b/test/secrets/run.sh @@ -22,7 +22,7 @@ sleep 20 docker exec $(docker ps -q -f name=backup) backup -docker run --rm -it \ +docker run --rm \ -v backup_data:/data alpine \ ash -c 'tar -xf /data/backup/test.tar.gz && test -f /backup/pg_data/PG_VERSION' diff --git a/test/ssh/run.sh b/test/ssh/run.sh index eb0ce03..c86fbd8 100755 --- a/test/ssh/run.sh +++ b/test/ssh/run.sh @@ -17,7 +17,7 @@ sleep 5 expect_running_containers 3 -docker run --rm -it \ +docker run --rm \ -v ssh_backup_data:/ssh_data \ alpine \ ash -c 'tar -xvf /ssh_data/test-hostnametoken.tar.gz -C /tmp && test -f /tmp/backup/app_data/offen.db' @@ -32,7 +32,7 @@ sleep 5 docker compose exec backup backup -docker run --rm -it \ +docker run --rm \ -v ssh_backup_data:/ssh_data \ alpine \ ash -c '[ $(find /ssh_data/ -type f | wc -l) = "1" ]' diff --git a/test/swarm/run.sh b/test/swarm/run.sh index 0ec2cc2..4028cc5 100755 --- a/test/swarm/run.sh +++ b/test/swarm/run.sh @@ -19,7 +19,7 @@ sleep 20 docker exec $(docker ps -q -f name=backup) backup -docker run --rm -it \ +docker run --rm \ -v backup_data:/data alpine \ ash -c 'tar -xf /data/backup/test.tar.gz && test -f /backup/pg_data/PG_VERSION' diff --git a/test/webdav/run.sh b/test/webdav/run.sh index 0ec3017..9a4282d 100755 --- a/test/webdav/run.sh +++ b/test/webdav/run.sh @@ -15,7 +15,7 @@ sleep 5 expect_running_containers "3" -docker run --rm -it \ +docker run --rm \ -v webdav_backup_data:/webdav_data \ alpine \ ash -c 'tar -xvf /webdav_data/data/my/new/path/test-hostnametoken.tar.gz -C /tmp && test -f /tmp/backup/app_data/offen.db' @@ -30,7 +30,7 @@ sleep 5 docker compose exec backup backup -docker run --rm -it \ +docker run --rm \ -v webdav_backup_data:/webdav_data \ alpine \ ash -c '[ $(find /webdav_data/data/my/new/path/ -type f | wc -l) = "1" ]'