Automatically dispatch emscripten release tag action (#1442)
This PR add several features to release automation:
1. The existing tag-release job has an output that indicates whether the
triggering commit
is a release (i.e. whether it matches the regex)
2. The new followup job runs a new script which fetches the recent
emscripten-releases
revisions, reads the DEPS file from the 'latest' release in
emscripten-releases-tags.json
to find the corresponding emscripten revision and writes it into the
environment
2. The final step reads the emscripten revision from the environment and
creates a
workflow_dispatch event to run the tag-release.yml job on the emscripten
repo
This commit is contained in:
7
.github/workflows/create-release.yml
vendored
7
.github/workflows/create-release.yml
vendored
@@ -23,5 +23,10 @@ jobs:
|
|||||||
uses: peter-evans/create-pull-request@v6
|
uses: peter-evans/create-pull-request@v6
|
||||||
with:
|
with:
|
||||||
title: Release ${{ env.RELEASE_VERSION }}
|
title: Release ${{ env.RELEASE_VERSION }}
|
||||||
commit-message: Release ${{ env.RELEASE_VERSION }}
|
commit-message: |
|
||||||
|
Release ${{ env.RELEASE_VERSION }}
|
||||||
|
body: |
|
||||||
|
With emscripten-releases revisions:
|
||||||
|
https://chromium.googlesource.com/emscripten-releases/+/${{ inputs.lto-sha }} (LTO)
|
||||||
|
https://chromium.googlesource.com/emscripten-releases/+/${{ inputs.nonlto-sha }} (asserts)
|
||||||
delete-branch: true
|
delete-branch: true
|
||||||
|
|||||||
95
.github/workflows/tag-release.yml
vendored
95
.github/workflows/tag-release.yml
vendored
@@ -4,33 +4,74 @@ name: Create release tag
|
|||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
paths: [ emscripten-releases-tags.json, .github/workflows/tag-release.yml ]
|
paths:
|
||||||
|
- emscripten-releases-tags.json
|
||||||
|
- .github/workflows/tag-release.yml
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
tag-release:
|
tag-release:
|
||||||
# Only activate for commits created by the create-release.yml workflow.
|
# Only activate for commits created by the create-release.yml workflow.
|
||||||
# The assumption is that when manual changes happen, we want to handle
|
# The assumption is that when manual changes happen, we want to handle
|
||||||
# tagging manually too.
|
# tagging manually too.
|
||||||
if: github.event.head_commit.author.username == 'github-actions[bot]'
|
name: Check for release commit and create tag
|
||||||
runs-on: ubuntu-latest
|
if: github.event.head_commit.author.username == 'github-actions[bot]'
|
||||||
steps:
|
runs-on: ubuntu-latest
|
||||||
- name: Match message and create tag
|
outputs:
|
||||||
uses: actions/github-script@v7
|
is_release: ${{ steps.create-tag.outputs.result }}
|
||||||
with:
|
steps:
|
||||||
script: |
|
- name: Match message and create tag
|
||||||
const message = `${{ github.event.head_commit.message }}`
|
id: create-tag
|
||||||
const regex = /Release ([0-9]+.[0-9]+.[0-9]+)/
|
uses: actions/github-script@v7
|
||||||
const match = message.match(regex)
|
with:
|
||||||
if (match) {
|
github-token: ${{ secrets.TEST_TOKEN }}
|
||||||
const release = match[1]
|
# A commit with the message of the form 'Release X.Y.Z' is expected
|
||||||
console.log(`Matched release ${release}`)
|
# to have been created by create_release.py and update the latest
|
||||||
await github.rest.git.createRef({
|
# release in emscripten-releases-tags.json
|
||||||
owner: context.repo.owner,
|
script: |
|
||||||
repo: context.repo.repo,
|
const message = `${{ github.event.head_commit.message }}`
|
||||||
ref: `refs/tags/${release}`,
|
const regex = /Release ([0-9]+.[0-9]+.[0-9]+)/;
|
||||||
sha: context.sha
|
const match = message.match(regex);
|
||||||
})
|
let is_release = false;
|
||||||
} else {
|
if (match) {
|
||||||
console.log(`Commit message: ${message} did not match pattern`)
|
const release = match[1];
|
||||||
}
|
console.log(`Matched release ${release}`);
|
||||||
|
await github.rest.git.createRef({
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
ref: `refs/tags/${release}`,
|
||||||
|
sha: context.sha
|
||||||
|
});
|
||||||
|
is_release = true;
|
||||||
|
} else {
|
||||||
|
console.log(`Commit message: '${message}' did not match pattern`);
|
||||||
|
}
|
||||||
|
return is_release;
|
||||||
|
|
||||||
|
dispatch-emscripten-tag:
|
||||||
|
name: Dispatch workflow to tag emscripten repo
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: tag-release
|
||||||
|
if: ${{ needs.tag-release.outputs.is_release == 'true' }}
|
||||||
|
steps:
|
||||||
|
- name: Checkout repo
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
- name: Find emscripten revision
|
||||||
|
# get_emscripten_revision_info.py sets env.EMSCRIPTEN_HASH to the
|
||||||
|
# emscripten hash associated with the latest release in
|
||||||
|
# emscripten-releases-tags.json
|
||||||
|
run: python3 scripts/get_emscripten_revision_info.py
|
||||||
|
- name: Dispatch emscripten workflow
|
||||||
|
uses: actions/github-script@v7
|
||||||
|
with:
|
||||||
|
github-token: ${{ secrets.TEST_TOKEN }}
|
||||||
|
script: |
|
||||||
|
await github.rest.actions.createWorkflowDispatch({
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: 'emscripten',
|
||||||
|
workflow_id: 'tag-release.yml',
|
||||||
|
ref: 'main',
|
||||||
|
inputs: { 'release-sha': '${{ env.EMSCRIPTEN_HASH }}' }
|
||||||
|
});
|
||||||
|
|||||||
41
scripts/get_emscripten_revision_info.py
Executable file
41
scripts/get_emscripten_revision_info.py
Executable file
@@ -0,0 +1,41 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
|
||||||
|
EMSCRIPTEN_RELEASES_GIT = 'https://chromium.googlesource.com/emscripten-releases'
|
||||||
|
TAGFILE = 'emscripten-releases-tags.json'
|
||||||
|
|
||||||
|
def get_latest_hash(tagfile):
|
||||||
|
with open(tagfile) as f:
|
||||||
|
versions = json.load(f)
|
||||||
|
latest = versions['aliases']['latest']
|
||||||
|
return versions['releases'][latest]
|
||||||
|
|
||||||
|
def get_latest_emscripten(tagfile):
|
||||||
|
latest = get_latest_hash(tagfile)
|
||||||
|
if not os.path.isdir('emscripten-releases'):
|
||||||
|
subprocess.run(['git', 'clone', EMSCRIPTEN_RELEASES_GIT, '--depth',
|
||||||
|
'100'], check=True)
|
||||||
|
# This will fail if the 'latest' revision is not within the most recent
|
||||||
|
# 100 commits; but that shouldn't happen because this script is intended
|
||||||
|
# to be run right after a release is added.
|
||||||
|
info = subprocess.run(['emscripten-releases/src/release-info.py',
|
||||||
|
'emscripten-releases', latest],
|
||||||
|
stdout=subprocess.PIPE, check=True, text=True).stdout
|
||||||
|
for line in info.split('\n'):
|
||||||
|
tokens = line.split()
|
||||||
|
if len(tokens) and tokens[0] == 'emscripten':
|
||||||
|
return tokens[2]
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
emscripten_hash = get_latest_emscripten(TAGFILE)
|
||||||
|
print('Emscripten revision ' + emscripten_hash)
|
||||||
|
if 'GITHUB_ENV' in os.environ:
|
||||||
|
with open(os.environ['GITHUB_ENV'], 'a') as f:
|
||||||
|
f.write(f'EMSCRIPTEN_HASH={emscripten_hash}')
|
||||||
|
sys.exit(0)
|
||||||
|
print('Not a GitHub Action')
|
||||||
|
sys.exit(1)
|
||||||
Reference in New Issue
Block a user