mirror of
https://github.com/aquasecurity/trivy.git
synced 2025-12-05 20:40:16 -08:00
ci: introduce Release Please for automated release management (#6795)
Signed-off-by: knqyf263 <knqyf263@gmail.com> Co-authored-by: simar7 <1254783+simar7@users.noreply.github.com>
This commit is contained in:
82
.github/workflows/release-please.yaml
vendored
Normal file
82
.github/workflows/release-please.yaml
vendored
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
name: Release Please
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
- 'release/v*'
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
version:
|
||||||
|
required: true
|
||||||
|
description: 'Release version without the "v" prefix (e.g., 0.51.0)'
|
||||||
|
type: string
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
release-please:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
if: ${{ !startsWith(github.event.head_commit.message, 'release:') && !github.event.inputs.version }}
|
||||||
|
steps:
|
||||||
|
- name: Release Please
|
||||||
|
id: release
|
||||||
|
uses: googleapis/release-please-action@v4
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.PAT }}
|
||||||
|
target-branch: ${{ github.ref_name }}
|
||||||
|
|
||||||
|
manual-release-please:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
if: ${{ github.event.inputs.version }}
|
||||||
|
steps:
|
||||||
|
- name: Install Release Please CLI
|
||||||
|
run: npm install release-please -g
|
||||||
|
|
||||||
|
- name: Release Please
|
||||||
|
run: |
|
||||||
|
release-please release-pr --repo-url=${{ github.server_url }}/${{ github.repository }} \
|
||||||
|
--token=${{ secrets.PAT }} \
|
||||||
|
--release-as=${{ github.event.inputs.version }} \
|
||||||
|
--target-branch=${{ github.ref_name }}
|
||||||
|
|
||||||
|
release-tag:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
if: ${{ startsWith(github.event.head_commit.message, 'release:') }}
|
||||||
|
steps:
|
||||||
|
# Since skip-github-release is specified, the outputs of googleapis/release-please-action cannot be used.
|
||||||
|
# Therefore, we need to parse the version ourselves.
|
||||||
|
- name: Extract version and PR number from commit message
|
||||||
|
id: extract_info
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
echo "version=$( echo "${{ github.event.head_commit.message }}" | sed 's/^release: v\([0-9]\+\.[0-9]\+\.[0-9]\+\).*$/\1/' )" >> $GITHUB_OUTPUT
|
||||||
|
echo "pr_number=$( echo "${{ github.event.head_commit.message }}" | sed 's/.*(\#\([0-9]\+\)).*$/\1/' )" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
- name: Tag release
|
||||||
|
if: ${{ steps.extract_info.outputs.version }}
|
||||||
|
uses: actions/github-script@v7
|
||||||
|
with:
|
||||||
|
github-token: ${{ secrets.PAT }}
|
||||||
|
script: |
|
||||||
|
await github.rest.git.createRef({
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
ref: `refs/tags/v${{ steps.extract_info.outputs.version }}`,
|
||||||
|
sha: context.sha
|
||||||
|
});
|
||||||
|
|
||||||
|
# Since skip-github-release is specified, googleapis/release-please-action doesn't delete the label from PR.
|
||||||
|
# This label prevents the subsequent PRs from being created. Therefore, we need to delete it ourselves.
|
||||||
|
# cf. https://github.com/googleapis/release-please?tab=readme-ov-file#release-please-bot-does-not-create-a-release-pr-why
|
||||||
|
- name: Remove the label from PR
|
||||||
|
if: ${{ steps.extract_info.outputs.pr_number }}
|
||||||
|
uses: actions/github-script@v7
|
||||||
|
with:
|
||||||
|
github-token: ${{ secrets.PAT }}
|
||||||
|
script: |
|
||||||
|
const prNumber = parseInt('${{ steps.extract_info.outputs.pr_number }}', 10);
|
||||||
|
github.rest.issues.removeLabel({
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
issue_number: prNumber,
|
||||||
|
name: 'autorelease: pending'
|
||||||
|
});
|
||||||
1
.github/workflows/semantic-pr.yaml
vendored
1
.github/workflows/semantic-pr.yaml
vendored
@@ -28,6 +28,7 @@ jobs:
|
|||||||
ci
|
ci
|
||||||
chore
|
chore
|
||||||
revert
|
revert
|
||||||
|
release
|
||||||
BREAKING
|
BREAKING
|
||||||
|
|
||||||
scopes: |
|
scopes: |
|
||||||
|
|||||||
1
.release-please-manifest.json
Normal file
1
.release-please-manifest.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{".":"0.51.4"}
|
||||||
65
docs/community/maintainer/release-flow.md
Normal file
65
docs/community/maintainer/release-flow.md
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
# Release Flow
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
Trivy adopts [conventional commit messages][conventional-commits], and [Release Please][release-please] automatically creates a [release PR](https://github.com/googleapis/release-please?tab=readme-ov-file#whats-a-release-pr) based on the messages of the merged commits.
|
||||||
|
This release PR is automatically updated every time a new commit is added to the release branch.
|
||||||
|
|
||||||
|
If a commit has the prefix `feat:`, a PR is automatically created to increment the minor version, and if a commit has the prefix `fix:`, a PR is created to increment the patch version.
|
||||||
|
When the PR is merged, GitHub Actions automatically creates a version tag and the release is performed.
|
||||||
|
For detailed behavior, please refer to [the GitHub Actions configuration][workflows].
|
||||||
|
|
||||||
|
!!! note
|
||||||
|
Commits with prefixes like `chore` or `build` are not considered releasable, and no release PR is created.
|
||||||
|
To include such commits in a release, you need to either include commits with `feat` or `fix` prefixes or perform a manual release as described [below](#manual-release).
|
||||||
|
|
||||||
|
## Flow
|
||||||
|
The release flow consists of the following main steps:
|
||||||
|
|
||||||
|
1. Creating the release PR (automatically or manually)
|
||||||
|
1. Drafting the release notes
|
||||||
|
1. Merging the release PR
|
||||||
|
1. Updating the release notes
|
||||||
|
|
||||||
|
### Automatic Release PR Creation
|
||||||
|
When a releasable commit (a commit with `feat` or `fix` prefix) is merged, a release PR is automatically created.
|
||||||
|
These Release PRs are kept up-to-date as additional work is merged.
|
||||||
|
When it's ready to tag a release, simply merge the release PR.
|
||||||
|
See the [Release Please documentation][release-please] for more information.
|
||||||
|
|
||||||
|
The title of the PR will be in the format `release: v${version} [${branch}]` (e.g., `release: v0.51.0 [main]`).
|
||||||
|
The format of the PR title is important for identifying the release commit, so it should not be changed.
|
||||||
|
|
||||||
|
The `release/vX.Y` release branches are also subject to automatic release PR creation for patch releases.
|
||||||
|
The PR title will be like `release: v0.51.1 [release/v0.51]`.
|
||||||
|
|
||||||
|
### Manual Release PR Creation
|
||||||
|
If you want to release commits like `chore`, a release PR is not automatically created, so you need to manually trigger the creation of a release PR.
|
||||||
|
The [Release Please workflow](https://github.com/aquasecurity/trivy/actions/workflows/release-please.yaml) supports `workflow_dispatch` and can be triggered manually.
|
||||||
|
Click "Run workflow" in the top right corner and specify the release branch.
|
||||||
|
In Trivy, the following branches are the release branches.
|
||||||
|
|
||||||
|
- `main`
|
||||||
|
- `release/vX.Y` (e.g. `release/v0.51`)
|
||||||
|
|
||||||
|
Specify the release version (without the `v` prefix) and click "Run workflow" to create a release PR for the specified version.
|
||||||
|
|
||||||
|
### Drafting the Release Notes
|
||||||
|
Next, create release notes for this version.
|
||||||
|
Draft a new post in GitHub Discussions, and maintainers edit these release notes (e.g., https://github.com/aquasecurity/trivy/discussions/6605).
|
||||||
|
Currently, the creation of this draft is done manually.
|
||||||
|
For patch version updates, this step can be skipped since they only involve bug fixes.
|
||||||
|
|
||||||
|
### Merging the Release PR
|
||||||
|
Once the draft of the release notes is complete, merge the release PR.
|
||||||
|
When the PR is merged, a tag is automatically created, and [GoReleaser][goreleaser] releases binaries, container images, etc.
|
||||||
|
|
||||||
|
### Updating the Release Notes
|
||||||
|
If the release completes without errors, a page for the release notes is created in GitHub Discussions (e.g., https://github.com/aquasecurity/trivy/discussions/6622).
|
||||||
|
Copy the draft release notes, adjust the formatting, and finalize the release notes.
|
||||||
|
|
||||||
|
The release is now complete.
|
||||||
|
|
||||||
|
[conventional-commits]: https://www.conventionalcommits.org/en/v1.0.0/
|
||||||
|
[release-please]: https://github.com/googleapis/release-please
|
||||||
|
[goreleaser]: https://goreleaser.com/
|
||||||
|
[workflows]: https://github.com/aquasecurity/trivy/tree/main/.github/workflows
|
||||||
@@ -199,6 +199,7 @@ nav:
|
|||||||
- Overview: community/contribute/checks/overview.md
|
- Overview: community/contribute/checks/overview.md
|
||||||
- Add Service Support: community/contribute/checks/service-support.md
|
- Add Service Support: community/contribute/checks/service-support.md
|
||||||
- Maintainer:
|
- Maintainer:
|
||||||
|
- Release Flow: community/maintainer/release-flow.md
|
||||||
- Help Wanted: community/maintainer/help-wanted.md
|
- Help Wanted: community/maintainer/help-wanted.md
|
||||||
- Triage: community/maintainer/triage.md
|
- Triage: community/maintainer/triage.md
|
||||||
theme:
|
theme:
|
||||||
|
|||||||
11
release-please-config.json
Normal file
11
release-please-config.json
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json",
|
||||||
|
"release-type": "go",
|
||||||
|
"include-component-in-tag": false,
|
||||||
|
"bump-minor-pre-major": true,
|
||||||
|
"skip-github-release": true,
|
||||||
|
"pull-request-title-pattern": "release: v${version} [${branch}]",
|
||||||
|
"packages": {
|
||||||
|
".": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user