Merge branch 'rollkit:main' into main #35
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: CI and Release | |
on: | |
push: | |
branches: | |
- main | |
# Trigger on version tags | |
tags: | |
- 'v[0-9]+\.[0-9]+\.[0-9]+' | |
- 'v[0-9]+\.[0-9]+\.[0-9]+-rc(?:[0-9]+|\.[0-9]+)' | |
pull_request: | |
merge_group: | |
workflow_dispatch: | |
# Inputs the workflow accepts. | |
inputs: | |
version: | |
# Friendly description to be shown in the UI instead of 'name' | |
description: "Semver type of new version (major / minor / patch)" | |
# Input has to be provided for the workflow to run | |
required: true | |
type: choice | |
options: | |
- patch | |
- minor | |
- major | |
jobs: | |
setup: | |
runs-on: ubuntu-latest | |
env: | |
# use consistent go version throughout pipeline here | |
GO_VERSION: "1.20" | |
outputs: | |
go-version: ${{ steps.set-vars.outputs.go-version }} | |
steps: | |
- name: Set go version | |
id: set-vars | |
run: echo "go-version=${{env.GO_VERSION}}" >> "$GITHUB_OUTPUT" | |
lint: | |
needs: [setup] | |
uses: ./.github/workflows/lint.yml | |
with: | |
go-version: ${{ needs.setup.outputs.go-version }} | |
test: | |
needs: [setup] | |
uses: ./.github/workflows/test.yml | |
with: | |
go-version: ${{ needs.setup.outputs.go-version }} | |
proto: | |
uses: ./.github/workflows/proto.yml | |
# get_merged_pr_labels uses the listPullRequestsAssociatedWithCommit API | |
# endpoint to get the PR information for the commit during a push event. Once | |
# the PR information is received, we check to see if the create-release label | |
# was added to the pr. | |
get_merged_pr_labels: | |
runs-on: ubuntu-latest | |
outputs: | |
has_release_label: ${{ steps.set-outputs.outputs.has_release_label }} | |
steps: | |
# We only want to run this step on a push event, otherwise this will error | |
# out as the result is null. We have the if condition here as to not block | |
# steps that rely on this step and others if this step is skipped. | |
- name: Query listPullRequestsAssociatedWithCommit for the PR information | |
if: ${{ github.event_name == 'push' }} | |
uses: actions/github-script@v6 | |
id: get_pr_data | |
with: | |
script: | | |
const prData = await github.rest.repos.listPullRequestsAssociatedWithCommit({ | |
commit_sha: context.sha, | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
}); | |
const pr = prData.data[0]; | |
const prLabels = pr ? pr.labels.map(label => label.name) : []; | |
const hasReleaseLabel = prLabels.includes('create-release'); | |
return { hasReleaseLabel }; | |
# Only run if the result is not null. We add this check so that the CI | |
# does not show a failure when the previous step is skipped. | |
- name: Set the outputs | |
if: steps.get_pr_data.outputs.result != null | |
id: set-outputs | |
run: echo "has_release_label=${{ fromJSON(steps.get_pr_data.outputs.result).hasReleaseLabel }}" >> "$GITHUB_OUTPUT" | |
# Make a release if this is a manually trigger job, i.e. workflow_dispatch, or | |
# there was a merged pr with the create-release label | |
release: | |
needs: [lint, test, proto, get_merged_pr_labels] | |
runs-on: ubuntu-latest | |
if: | | |
github.event_name == 'workflow_dispatch' || | |
(github.event_name == 'push' && | |
contains(github.ref, 'refs/heads/main') && | |
needs.get_merged_pr_labels.outputs.has_release_label) | |
permissions: "write-all" | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Version Release | |
uses: rollkit/.github/.github/actions/version-release@v0.2.2 | |
with: | |
github-token: ${{secrets.GITHUB_TOKEN}} | |
version-bump: ${{inputs.version}} |