309 lines
10 KiB
YAML
309 lines
10 KiB
YAML
# This file is automatically added by @npmcli/template-oss. Do not edit.
|
|
|
|
name: Release
|
|
|
|
on:
|
|
workflow_dispatch:
|
|
push:
|
|
branches:
|
|
- main
|
|
- latest
|
|
- release/v*
|
|
|
|
permissions:
|
|
contents: write
|
|
pull-requests: write
|
|
checks: write
|
|
|
|
jobs:
|
|
release:
|
|
outputs:
|
|
pr: ${{ steps.release.outputs.pr }}
|
|
releases: ${{ steps.release.outputs.releases }}
|
|
release-flags: ${{ steps.release.outputs.release-flags }}
|
|
branch: ${{ steps.release.outputs.pr-branch }}
|
|
pr-number: ${{ steps.release.outputs.pr-number }}
|
|
comment-id: ${{ steps.pr-comment.outputs.result }}
|
|
check-id: ${{ steps.check.outputs.check_id }}
|
|
name: Release
|
|
if: github.repository_owner == 'npm'
|
|
runs-on: ubuntu-latest
|
|
defaults:
|
|
run:
|
|
shell: bash
|
|
steps:
|
|
- name: Support Long Paths
|
|
if: matrix.platform.os == 'windows-latest'
|
|
run: git config --system core.longpaths true
|
|
- name: Checkout
|
|
uses: actions/checkout@v3
|
|
- name: Setup Git User
|
|
run: |
|
|
git config --global user.email "npm-cli+bot@github.com"
|
|
git config --global user.name "npm CLI robot"
|
|
- name: Setup Node
|
|
uses: actions/setup-node@v3
|
|
with:
|
|
node-version: 18.x
|
|
- name: Install npm@latest
|
|
run: npm i --prefer-online --no-fund --no-audit -g npm@latest
|
|
- name: npm Version
|
|
run: npm -v
|
|
- name: Install Dependencies
|
|
run: npm i --ignore-scripts --no-audit --no-fund
|
|
- name: Release Please
|
|
id: release
|
|
env:
|
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
run: |
|
|
npx --offline template-oss-release-please ${{ github.ref_name }} ${{ github.event_name }}
|
|
- name: Post Pull Request Comment
|
|
if: steps.release.outputs.pr-number
|
|
uses: actions/github-script@v6
|
|
id: pr-comment
|
|
env:
|
|
PR_NUMBER: ${{ steps.release.outputs.pr-number }}
|
|
REF_NAME: ${{ github.ref_name }}
|
|
with:
|
|
script: |
|
|
const { REF_NAME, PR_NUMBER } = process.env
|
|
const repo = { owner: context.repo.owner, repo: context.repo.repo }
|
|
const issue = { ...repo, issue_number: PR_NUMBER }
|
|
|
|
const { data: workflow } = await github.rest.actions.getWorkflowRun({ ...repo, run_id: context.runId })
|
|
|
|
let body = '## Release Manager\n\n'
|
|
|
|
const comments = await github.paginate(github.rest.issues.listComments, issue)
|
|
let commentId = comments?.find(c => c.user.login === 'github-actions[bot]' && c.body.startsWith(body))?.id
|
|
|
|
body += `Release workflow run: ${workflow.html_url}\n\n#### Force CI to Update This Release\n\n`
|
|
body += `This PR will be updated and CI will run for every non-\`chore:\` commit that is pushed to \`main\`. `
|
|
body += `To force CI to update this PR, run this command:\n\n`
|
|
body += `\`\`\`\ngh workflow run release.yml -r ${REF_NAME}\n\`\`\``
|
|
|
|
if (commentId) {
|
|
await github.rest.issues.updateComment({ ...repo, comment_id: commentId, body })
|
|
} else {
|
|
const { data: comment } = await github.rest.issues.createComment({ ...issue, body })
|
|
commentId = comment?.id
|
|
}
|
|
|
|
return commentId
|
|
- name: Get Workflow Job
|
|
uses: actions/github-script@v6
|
|
if: steps.release.outputs.pr-sha
|
|
id: check-output
|
|
env:
|
|
JOB_NAME: "Release"
|
|
MATRIX_NAME: ""
|
|
with:
|
|
script: |
|
|
const { owner, repo } = context.repo
|
|
|
|
const { data } = await github.rest.actions.listJobsForWorkflowRun({
|
|
owner,
|
|
repo,
|
|
run_id: context.runId,
|
|
per_page: 100
|
|
})
|
|
|
|
const jobName = process.env.JOB_NAME + process.env.MATRIX_NAME
|
|
const job = data.jobs.find(j => j.name.endsWith(jobName))
|
|
const jobUrl = job?.html_url
|
|
|
|
const shaUrl = `${context.serverUrl}/${owner}/${repo}/commit/${{ steps.release.outputs.pr-sha }}`
|
|
|
|
let summary = `This check is assosciated with ${shaUrl}\n\n`
|
|
|
|
if (jobUrl) {
|
|
summary += `For run logs, click here: ${jobUrl}`
|
|
} else {
|
|
summary += `Run logs could not be found for a job with name: "${jobName}"`
|
|
}
|
|
|
|
return { summary }
|
|
- name: Create Check
|
|
uses: LouisBrunner/checks-action@v1.3.1
|
|
id: check
|
|
if: steps.release.outputs.pr-sha
|
|
with:
|
|
token: ${{ secrets.GITHUB_TOKEN }}
|
|
status: in_progress
|
|
name: Release
|
|
sha: ${{ steps.release.outputs.pr-sha }}
|
|
output: ${{ steps.check-output.outputs.result }}
|
|
|
|
update:
|
|
needs: release
|
|
outputs:
|
|
sha: ${{ steps.commit.outputs.sha }}
|
|
check-id: ${{ steps.check.outputs.check_id }}
|
|
name: Update - Release
|
|
if: github.repository_owner == 'npm' && needs.release.outputs.pr
|
|
runs-on: ubuntu-latest
|
|
defaults:
|
|
run:
|
|
shell: bash
|
|
steps:
|
|
- name: Support Long Paths
|
|
if: matrix.platform.os == 'windows-latest'
|
|
run: git config --system core.longpaths true
|
|
- name: Checkout
|
|
uses: actions/checkout@v3
|
|
with:
|
|
fetch-depth: 0
|
|
ref: ${{ needs.release.outputs.branch }}
|
|
- name: Setup Git User
|
|
run: |
|
|
git config --global user.email "npm-cli+bot@github.com"
|
|
git config --global user.name "npm CLI robot"
|
|
- name: Setup Node
|
|
uses: actions/setup-node@v3
|
|
with:
|
|
node-version: 18.x
|
|
- name: Install npm@latest
|
|
run: npm i --prefer-online --no-fund --no-audit -g npm@latest
|
|
- name: npm Version
|
|
run: npm -v
|
|
- name: Install Dependencies
|
|
run: npm i --ignore-scripts --no-audit --no-fund
|
|
- name: Run Post Pull Request Actions
|
|
env:
|
|
RELEASE_PR_NUMBER: ${{ needs.release.outputs.pr-number }}
|
|
RELEASE_COMMENT_ID: ${{ needs.release.outputs.comment-id }}
|
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
run: |
|
|
npm exec --offline -- template-oss-release-manager --lockfile=false
|
|
npm run rp-pull-request --ignore-scripts --if-present
|
|
- name: Commit
|
|
id: commit
|
|
env:
|
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
run: |
|
|
git commit --all --amend --no-edit || true
|
|
git push --force-with-lease
|
|
echo "::set-output name=sha::$(git rev-parse HEAD)"
|
|
- name: Get Workflow Job
|
|
uses: actions/github-script@v6
|
|
if: steps.commit.outputs.sha
|
|
id: check-output
|
|
env:
|
|
JOB_NAME: "Update - Release"
|
|
MATRIX_NAME: ""
|
|
with:
|
|
script: |
|
|
const { owner, repo } = context.repo
|
|
|
|
const { data } = await github.rest.actions.listJobsForWorkflowRun({
|
|
owner,
|
|
repo,
|
|
run_id: context.runId,
|
|
per_page: 100
|
|
})
|
|
|
|
const jobName = process.env.JOB_NAME + process.env.MATRIX_NAME
|
|
const job = data.jobs.find(j => j.name.endsWith(jobName))
|
|
const jobUrl = job?.html_url
|
|
|
|
const shaUrl = `${context.serverUrl}/${owner}/${repo}/commit/${{ steps.commit.outputs.sha }}`
|
|
|
|
let summary = `This check is assosciated with ${shaUrl}\n\n`
|
|
|
|
if (jobUrl) {
|
|
summary += `For run logs, click here: ${jobUrl}`
|
|
} else {
|
|
summary += `Run logs could not be found for a job with name: "${jobName}"`
|
|
}
|
|
|
|
return { summary }
|
|
- name: Create Check
|
|
uses: LouisBrunner/checks-action@v1.3.1
|
|
id: check
|
|
if: steps.commit.outputs.sha
|
|
with:
|
|
token: ${{ secrets.GITHUB_TOKEN }}
|
|
status: in_progress
|
|
name: Release
|
|
sha: ${{ steps.commit.outputs.sha }}
|
|
output: ${{ steps.check-output.outputs.result }}
|
|
- name: Conclude Check
|
|
uses: LouisBrunner/checks-action@v1.3.1
|
|
if: needs.release.outputs.check-id && always()
|
|
with:
|
|
token: ${{ secrets.GITHUB_TOKEN }}
|
|
conclusion: ${{ job.status }}
|
|
check_id: ${{ needs.release.outputs.check-id }}
|
|
|
|
ci:
|
|
name: CI - Release
|
|
needs: [ release, update ]
|
|
if: needs.release.outputs.pr
|
|
uses: ./.github/workflows/ci-release.yml
|
|
with:
|
|
ref: ${{ needs.release.outputs.branch }}
|
|
check-sha: ${{ needs.update.outputs.sha }}
|
|
|
|
post-ci:
|
|
needs: [ release, update, ci ]
|
|
name: Post CI - Release
|
|
if: github.repository_owner == 'npm' && needs.release.outputs.pr && always()
|
|
runs-on: ubuntu-latest
|
|
defaults:
|
|
run:
|
|
shell: bash
|
|
steps:
|
|
- name: Get Needs Result
|
|
id: needs-result
|
|
run: |
|
|
result=""
|
|
if [[ "${{ contains(needs.*.result, 'failure') }}" == "true" ]]; then
|
|
result="failure"
|
|
elif [[ "${{ contains(needs.*.result, 'cancelled') }}" == "true" ]]; then
|
|
result="cancelled"
|
|
else
|
|
result="success"
|
|
fi
|
|
echo "::set-output name=result::$result"
|
|
- name: Conclude Check
|
|
uses: LouisBrunner/checks-action@v1.3.1
|
|
if: needs.update.outputs.check-id && always()
|
|
with:
|
|
token: ${{ secrets.GITHUB_TOKEN }}
|
|
conclusion: ${{ steps.needs-result.outputs.result }}
|
|
check_id: ${{ needs.update.outputs.check-id }}
|
|
|
|
post-release:
|
|
needs: release
|
|
name: Post Release - Release
|
|
if: github.repository_owner == 'npm' && needs.release.outputs.releases
|
|
runs-on: ubuntu-latest
|
|
defaults:
|
|
run:
|
|
shell: bash
|
|
steps:
|
|
- name: Support Long Paths
|
|
if: matrix.platform.os == 'windows-latest'
|
|
run: git config --system core.longpaths true
|
|
- name: Checkout
|
|
uses: actions/checkout@v3
|
|
- name: Setup Git User
|
|
run: |
|
|
git config --global user.email "npm-cli+bot@github.com"
|
|
git config --global user.name "npm CLI robot"
|
|
- name: Setup Node
|
|
uses: actions/setup-node@v3
|
|
with:
|
|
node-version: 18.x
|
|
- name: Install npm@latest
|
|
run: npm i --prefer-online --no-fund --no-audit -g npm@latest
|
|
- name: npm Version
|
|
run: npm -v
|
|
- name: Install Dependencies
|
|
run: npm i --ignore-scripts --no-audit --no-fund
|
|
- name: Run Post Release Actions
|
|
env:
|
|
RELEASES: ${{ needs.release.outputs.releases }}
|
|
run: |
|
|
npm run rp-release --ignore-scripts --if-present ${{ join(fromJSON(needs.release.outputs.release-flags), ' ') }}
|