Skip to content

Release Workflow

Release Workflow #67

Workflow file for this run

on:
push:
tags:
- "*-rc*"
permissions:
contents: write
packages: write
jobs:
build:
uses: ./.github/workflows/build_shared.yml
with:
ref: ${{ github.ref }}
tag: ${{ github.ref_name }}
strip_rc: true
test-e2e-server:
needs: [build]
runs-on: ubuntu-latest
env:
NODE_ENV: test
E2E_TEST: "true"
DATABASE_URL: postgres://root:postgres@localhost:5432/badger_test
steps:
- uses: actions/checkout@v4
# - name: Use Node.js 18.x
# uses: actions/setup-node@v4
# with:
# node-version: 18.x
# cache: "yarn"
# cache-dependency-path: "yarn.lock"
# - name: Set ref in docker-compose
# run: sed -i "s/__RC_REF__/${{ github.ref_name }}/g" docker-compose-rc-test.yml
# - name: Start services
# run: docker compose -f docker-compose.yml -f docker-compose-rc-test.yml up -d
# - run: yarn install --immutable --inline-builds
# - uses: ./.github/steps/setup-playwright
# with:
# working-directory: ./server
# - name: Migrate database
# run: |
# yarn prisma:migrateProd
# - name: Retart services
# run: |
# docker compose -f docker-compose.yml -f docker-compose-rc-test.yml restart server jobrunner
# - name: Run Playwright tests
# run: yarn ${{ runner.debug && 'test:e2e:debug' || 'test:e2e' }}
# working-directory: ./server
# env:
# PLAYWRIGHT_HTML_REPORT: ${{ github.workspace }}/server/playwright-report
# - uses: actions/upload-artifact@v3
# if: failure()
# with:
# name: playwright-report-server
# path: ./server/playwright-report/
# retention-days: 30
test-desktop:
runs-on: windows-latest
needs: [build]
steps:
- uses: actions/checkout@v4
# - name: Use Node.js 18.x
# uses: actions/setup-node@v4
# with:
# node-version: 18.x
# cache: "yarn"
# cache-dependency-path: "yarn.lock"
# - name: Download Desktop build
# uses: actions/download-artifact@v4
# with:
# name: badger-desktop-windows
# - name: Install Badger
# run: |
# $version = "${{ github.ref_name }}" -replace "^v", "" -replace "-rc.*", ""
# Start-Process -FilePath "Badger Desktop-$version.exe" -ArgumentList "/S","/D=${{ runner.temp }}\badger" -Wait
# shell: pwsh
# - run: yarn install --immutable --inline-builds
# - name: Run tests
# run: yarn test:e2e --project=standalone
# working-directory: ./desktop
# env:
# TEST_APPLICATION_PATH: ${{ runner.temp }}\badger\Badger Desktop.exe
linear:
needs: [test-e2e-server, test-desktop]
runs-on: ubuntu-latest
steps:
- name: Determine version number
run: echo "VERSION=$(echo '${{ github.ref_name }}' | sed 's/-rc.*//')" >> $GITHUB_ENV
- uses: actions/setup-node@v3
with:
node-version: "20.x"
- run: npm install @linear/sdk
- name: Create Linear release ticket
uses: actions/github-script@v7
with:
script: |
const { LinearClient } = require('@linear/sdk');
const lin = new LinearClient({
accessToken: "${{ secrets.LINEAR_ACCESS_TOKEN }}"
});
const issueCreate = await lin.createIssue({
teamId: "${{ env.LINEAR_TEAM_ID }}",
templateId: "${{ env.LINEAR_RELEASE_ISSUE_TEMPLATE_ID }}",
stateId: "${{ env.LINEAR_TODO_STATE_ID }}",
title: `Release v${process.env.VERSION}`,
});
if (!issueCreate.success) {
throw new Error(`Failed to create issue`);
}
await lin.createComment({
issueId: issueCreate.issue.id,
body: `Artifacts:
Server Docker image: \`ghcr.io/ystv/badger/server:${{ github.ref_name }}\`
Jobrunner Docker Image: \`ghcr.io/ystv/badger/jobrunner:${{ github.ref_name }}\`
Desktop Windows installer: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
Once testing is complete, please approve [this workflow](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}) and close this issue.
`.replace(/^\s*/gm, ''),
});
core.notice(`Release issue: ${issueCreate.issue.url}`);
release:
needs: [test-e2e-server, test-desktop]
environment: release
runs-on: ubuntu-latest
steps:
- name: Determine version number
run: echo "VERSION=$(echo '${{ github.ref_name }}' | sed 's/-rc.*//')" >> $GITHUB_ENV
- name: Download Desktop build
uses: actions/download-artifact@v4
with:
pattern: badger-desktop-*
path: artifacts
- name: Login to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Re-tag and push Docker images
run: |
for img in server jobrunner; do
docker pull ghcr.io/ystv/badger/$img:${{ github.ref_name }}
docker tag ghcr.io/ystv/badger/$img:${{ github.ref_name }} ghcr.io/ystv/badger/$img:$VERSION
docker push ghcr.io/ystv/badger/$img:$VERSION
docker tag ghcr.io/ystv/badger/$img:${{ github.ref_name }} ghcr.io/ystv/badger/$img:latest
docker push ghcr.io/ystv/badger/$img:latest
done
shell: bash
- name: Create GitHub release
uses: actions/github-script@v7
id: release
with:
script: |
const release = await github.rest.repos.createRelease({
owner: context.repo.owner,
repo: context.repo.repo,
target_commitish: context.sha,
tag_name: process.env.VERSION,
name: process.env.VERSION,
draft: true,
generate_release_notes: true,
make_latest: "true"
});
core.setOutput('id', release.data.id)
core.setOutput('tag_name', release.data.tag_name)
- name: Upload artifacts
run: |
find artifacts -type f -exec gh release upload ${{ steps.release.outputs.tag_name }} {} \;
- name: Publish release
uses: actions/github-script@v7
with:
script: |
await github.rest.repos.updateRelease({
owner: context.repo.owner,
repo: context.repo.repo,
release_id: ${{ steps.release.outputs.id }},
draft: false
})