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:
Derek Schuff
2024-08-29 17:07:00 -07:00
committed by GitHub
parent d09b3c3815
commit 122b38f2ce
3 changed files with 115 additions and 28 deletions

View File

@@ -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

View File

@@ -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 }}' }
});

View 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)