Automated releases #8
Workflow file for this run
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: PR Code checks | |
on: | |
pull_request: | |
branches: [master] | |
jobs: | |
lint: | |
timeout-minutes: 3 | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: actions/setup-node@v4 | |
with: | |
node-version: 21 | |
- run: npm install | |
- name: Run lint | |
run: npm run lint | |
- name: Run build | |
run: npm run build | |
release-preview: | |
name: Automated release preview | |
needs: [lint] | |
permissions: | |
issues: write | |
runs-on: ubuntu-latest | |
steps: | |
- name: 📀 Checkout | |
uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- name: 🖥️ Setup Node | |
uses: actions/setup-node@v4 | |
with: | |
node-version: 20 | |
- name: 🔗 Install Dependencies | |
shell: bash | |
run: npm install --no-fund --no-audit --ignore-scripts | |
- name: 🔬 Check semantic versioning | |
id: semantic-release | |
run: | | |
GITHUB_REF=${{ github.head_ref }} | |
npx semantic-release --no-ci --dry-run --plugins @semantic-release/commit-analyzer,@semantic-release/release-notes-generator --branches ${{ github.head_ref }} > output.txt | |
OUTPUT=$(cat output.txt | base64 -w 0) | |
echo "::set-output name=releaseNote::$OUTPUT" | |
- name: 📝 Report semantic versioning | |
uses: actions/github-script@v3 | |
if: ${{ steps.semantic-release.outputs.releaseNote != '' }} | |
with: | |
github-token: ${{ secrets.GITHUB_TOKEN }} | |
script: | | |
// build release note | |
const semanticReleaseOutput = Buffer.from('${{ steps.semantic-release.outputs.releaseNote }}', 'base64').toString('utf8'); | |
const semanticReleaseLogMatch = /^[[0-9:\sAMPM]+\]\s\[semantic-release\].*$/; | |
const lines = semanticReleaseOutput.split('\n'); | |
const lastSemanticReleaseLogIndex = [...lines] | |
.reverse() | |
.findIndex((line) => line.match(semanticReleaseLogMatch)); | |
const releaseNoteIndex = lines.length - lastSemanticReleaseLogIndex; | |
const releaseNote = lines.slice(releaseNoteIndex); | |
let res = releaseNote.join('\n'); | |
if (!releaseNote.length || !res) { | |
res = '### No release note would be generated.'; | |
} | |
const SEMANTIC_RELEASE_BODY_HEADER = '## 📝 Semantic Release Report'; | |
const body = [SEMANTIC_RELEASE_BODY_HEADER, res].join('\n'); | |
// get last comment | |
const comments = await github.issues.listComments({ | |
issue_number: context.issue.number, | |
owner: context.repo.owner, | |
repo: context.repo.repo | |
}); | |
// find comments to delete | |
const commentsToDelete = comments.data.filter((comment) => | |
comment.body.startsWith(SEMANTIC_RELEASE_BODY_HEADER) | |
); | |
// delete comments | |
const prms = commentsToDelete.map((comment) => | |
github.issues.deleteComment({ | |
comment_id: comment.id, | |
owner: context.repo.owner, | |
repo: context.repo.repo | |
}) | |
); | |
await Promise.all(prms); | |
// create new comment for release note | |
github.issues.createComment({ | |
issue_number: context.issue.number, | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
body | |
}); |