Skip to content

fix(ci): Move updating docker tag into own job to avoid setting it twice per run: when the builder image is built and when the app image is built #215

fix(ci): Move updating docker tag into own job to avoid setting it twice per run: when the builder image is built and when the app image is built

fix(ci): Move updating docker tag into own job to avoid setting it twice per run: when the builder image is built and when the app image is built #215

Workflow file for this run

name: Build and Test
on:
pull_request:
paths-ignore:
- '**.md'
push:
branches:
- master
- release/**
paths-ignore:
- '**.md'
env:
# Variables defined in the repository
SENTRY_ORG: ${{ vars.SENTRY_ORG }}
# For master, we have an environment variable that selects the action-release project
# instead of action-release-prs
# For other branches: https://sentry-ecosystem.sentry.io/releases/?project=4505075304693760
# For master branch: https://sentry-ecosystem.sentry.io/releases/?project=6576594
SENTRY_PROJECT: ${{ vars.SENTRY_PROJECT }}
jobs:
prepare-docker:
name: Prepare docker tag
runs-on: ubuntu-latest
permissions:
contents: write
outputs:
docker_tag: ${{ steps.evaluate_docker_tag.outputs.docker_tag }}
steps:
- name: Checkout repo
uses: actions/checkout@v4
- name: Set git user to getsentry-bot
if: github.ref == 'refs/heads/master'
run: |
echo "GIT_COMMITTER_NAME=getsentry-bot" >> $GITHUB_ENV;
echo "GIT_AUTHOR_NAME=getsentry-bot" >> $GITHUB_ENV;
echo "EMAIL=bot@sentry.io" >> $GITHUB_ENV;
- name: Evaluate docker tag
id: evaluate_docker_tag
run: |
if [[ "${{ github.ref }}" == "refs/heads/master" ]]; then
echo "docker_tag=master" >> "$GITHUB_OUTPUT"
yarn set-docker-tag master
if ! git diff --quiet action.yml; then
git add action.yml
SKIP=lint,format,set-docker-tag-from-branch git commit -m "chore: Set docker tag for master [skip-ci]"
git push
fi
else
TAG=$(yq '... | select(has("uses") and .uses | test("docker://ghcr.io/getsentry/action-release-image:.*")) | .uses' action.yml | awk -F':' '{print $3}')
echo "docker_tag=$TAG" >> "$GITHUB_OUTPUT"
if [[ "${{ github.event_name }}" == "pull_request" ]]; then
if [[ "$TAG" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
echo "Error: docker_tag $TAG matching format MAJOR.MINOR.PATCH is not allowed inside pull requests."
echo "Please rename the docker tag in action.yml and try again."
exit 1
fi
fi
fi
docker-build:
name: Build & publish Docker images
needs: prepare-docker
runs-on: ubuntu-latest
permissions:
packages: write
strategy:
matrix:
target:
- name: builder
image: action-release-builder-image
- name: app
image: action-release-image
steps:
- run: echo "TAG = ${{ needs.prepare-docker.outputs.docker_tag }}
- name: Checkout repo
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
# BUILDKIT_INLINE_CACHE creates the image in such a way that you can
# then use --cache-from (think of a remote cache)
# This feature is allowed thanks to using the buildx plugin
#
# There's a COPY command in the builder stage that can easily invalidate the cache
# If you notice, please add more exceptions to .dockerignore since we loose the value
# of using --cache-from on the app stage
- name: Build and push
uses: docker/build-push-action@v6
with:
platforms: linux/amd64,linux/arm64
push: true
tags: ghcr.io/${{ github.repository_owner }}/${{ matrix.target.image }}:${{ needs.prepare-docker.outputs.docker_tag }}
cache-from: ghcr.io/${{ github.repository_owner }}/${{ matrix.target.image }}:master
target: ${{ matrix.target.name }}
build-args: BUILDKIT_INLINE_CACHE=1
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install
run: yarn install
- name: Check format
run: yarn format-check
- name: Lint
run: yarn lint
- name: Build
run: yarn build
#############
# E2E Tests
#############
test-create-staging-release-per-push:
needs: docker-build
strategy:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
runs-on: ${{ matrix.os }}
name: Test current action
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Create a staging release
uses: ./
env:
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
SENTRY_LOG_LEVEL: debug
with:
ignore_missing: true
test-runs-on-container:
needs: docker-build
runs-on: ubuntu-latest
container:
image: node:18.17
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Create a staging release
uses: ./
env:
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
SENTRY_LOG_LEVEL: debug
with:
ignore_missing: true
test-mock-release:
needs: docker-build
strategy:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
runs-on: ${{ matrix.os }}
name: Mock a release
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Mock creating a Sentry release
uses: ./
env:
MOCK: true
with:
environment: production
test-mock-release-working-directory:
needs: docker-build
strategy:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
runs-on: ${{ matrix.os }}
name: Mock a release in a different working directory
steps:
- name: Checkout directory we'll be running from
uses: actions/checkout@v4
with:
fetch-depth: 0
path: main/
- name: Checkout directory we'll be testing
uses: actions/checkout@v4
with:
fetch-depth: 0
path: test/
- name: Mock creating a Sentry release in a different directory
uses: ./main
env:
MOCK: true
with:
environment: production
working_directory: ./test