Skip to content

Move creation of release drafts out of build workflow #1

Move creation of release drafts out of build workflow

Move creation of release drafts out of build workflow #1

name: Build and Create Release Draft
on:
push:
branches: [ 'master' ]
workflow_dispatch:
jobs:
build:
uses: ./.github/workflows/build.yml
release-draft:
name: Update drafts for GitHub releases
runs-on: ubuntu-latest
needs: [ build ]
steps:
# Remove old release drafts
- name: Remove old release drafts
uses: actions/github-script@v7
with:
script: |
const owner = context.repo.owner;
const repo = context.repo.repo;
const response = await github.rest.repos.listReleases({owner, repo});
for (const draft of response.data.filter(r => r.draft)) {
core.info(`Delete draft for '${draft.name}' (${draft.id})`);
await github.rest.repos.deleteRelease({owner, repo, release_id: draft.id});
}
# Download build artifacts
- name: Download build result
uses: actions/download-artifact@v4
with:
name: ${{ needs.build.outputs.build-artifact }}
path: build/distributions/
- name: Download metadata
uses: actions/download-artifact@v4
with:
name: ${{ needs.build.outputs.metadata-artifact }}
path: build/metadata/
# Read metadata
- name: Read metadata
id: metadata
run: |
echo "version=$(cat build/metadata/version.txt)" >> "$GITHUB_OUTPUT"
echo "zipfile=$(cat build/metadata/zipfile.txt)" >> "$GITHUB_OUTPUT"
echo "zipname=$(basename "$(cat build/metadata/zipfile.txt)")" >> "$GITHUB_OUTPUT"
# Fail job if the release tag already exists and points to a different commit
- name: Check release tag
uses: actions/github-script@v7
env:
TAG_NAME: v${{ steps.metadata.outputs.version }}
with:
script: |
const owner = context.repo.owner;
const repo = context.repo.repo;
const tagname = process.env.TAG_NAME;
try {
const ref = `tags/${tagname}`
const response = await github.rest.git.getRef({owner, repo, ref});
if (response.data.object.sha === context.sha) {
core.info(`Tag '${tagname}' is already defined and points to the right commit.`);
core.info(`Commit: ${context.sha}`);
}
else {
core.setFailed(
`Tag '${tagname}' already exists but points to a different commit.\n` +
`You probably need to bump the version number.\n` +
`Tag points to: ${response.data.object.sha}\n` +
`Release commit: ${context.sha}`);
}
}
catch (e) {
if (e.status === 404) {
core.info(`Tag '${tagname}' is not yet defined.`);
}
else {
throw e;
}
}
# Create GitHub release draft
- name: Create GitHub release draft
uses: actions/github-script@v7
env:
TAG_NAME: v${{ steps.metadata.outputs.version }}
ZIP_FILE: ${{ steps.metadata.outputs.zipfile }}
ZIP_NAME: ${{ steps.metadata.outputs.zipname }}
with:
script: |
const fs = require('fs');
const owner = context.repo.owner;
const repo = context.repo.repo;
const { TAG_NAME, ZIP_FILE, ZIP_NAME } = process.env;
core.info(`Create new draft for '${TAG_NAME}'`);
const createResponse = await github.rest.repos.createRelease({
owner,
repo,
name: TAG_NAME,
tag_name: TAG_NAME,
target_commitish: context.sha,
body: fs.readFileSync('build/metadata/latest_changelog.md', 'utf8'),
draft: true,
});
core.info(`Upload build result; upload_url: ${createResponse.data.upload_url}`);
const uploadResponse = await github.rest.repos.uploadReleaseAsset({
url: createResponse.data.upload_url,
headers: {'Content-Type': 'application/zip'},
name: ZIP_NAME,
label: ZIP_NAME,
data: fs.readFileSync(ZIP_FILE),
});
core.info(`Upload complete; download_url: ${uploadResponse.data.browser_download_url}`);
core.info(`You can find the release draft at ${createResponse.data.html_url}`);