Skip to content

Commit

Permalink
feat(prerelease): adds prerelease action that works on pull requests
Browse files Browse the repository at this point in the history
  • Loading branch information
greenkiwi committed Jan 17, 2024
1 parent e36e02b commit 5eedd2c
Show file tree
Hide file tree
Showing 2 changed files with 293 additions and 0 deletions.
104 changes: 104 additions & 0 deletions prerelease/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
# GitHub Action: Prerelease Terraform Module

<!-- prettier-ignore-start -->
<!-- action-docs-description -->
## Description

< GitHub Action to compute a prerelease version based on the latest release version and the number of commits since the latest release. This will also generate a docker tag based on the computed version if the label `prerelease` is specified on the PR.
<!-- action-docs-description -->
<!-- prettier-ignore-end -->

## Configuration

### Step1: Set any [Semantic Release Configuration](https://github.com/semantic-release/semantic-release/blob/master/docs/usage/configuration.md#configuration) in your repository.

### Step2: [Add Secrets](https://help.github.com/en/actions/configuring-and-managing-workflows/creating-and-storing-encrypted-secrets) in your repository for the [Semantic Release Authentication](https://github.com/semantic-release/semantic-release/blob/master/docs/usage/ci-configuration.md#authentication) Environment Variables.

### Step3: Add a [Workflow File](https://help.github.com/en/articles/workflow-syntax-for-github-actions) to your repository to create custom automated processes.

## Usage

```yaml
steps:
- name: Action semantic release
uses: open-turo/actions-tf/prerelease@v3
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
```
**IMPORTANT**: `GITHUB_TOKEN` does not have the required permissions to operate on protected branches.
If you are using this action for protected branches, replace `GITHUB_TOKEN`
with [Personal Access Token](https://help.github.com/en/github/authenticating-to-github/creating-a-personal-access-token-for-the-command-line).
If using the `@semantic-release/git` plugin for protected branches, avoid persisting credentials as part
of `actions/checkout@v4` by setting the parameter `persist-credentials: false`. This credential does not have the
required permission to operate on protected branches.

<!-- prettier-ignore-start -->
<!-- action-docs-inputs -->
## Inputs

| parameter | description | required | default |
| --- | --- | --- | --- |
| checkout-repo | Perform checkout as first step of action | `false` | true |
| create-prerelease | Whether semantic-release should create a prerelease or do a dry run. This can be useful to set to true when a prerelease requires pushing artifacts semantic-release is in charge of generating | `false` | false |
| docker-config-file | Path to the docker config file (defaults to .docker-config.json) Must contain imageName, may contain dockerfile. | `false` | .docker-config.json |
| dockerhub-user | username for dockerhub | `true` | |
| dockerhub-password | password for dockerhub | `true` | |
| github-token | GitHub token that can checkout the repository as well as create tags/releases against it. e.g. 'secrets.GITHUB_TOKEN' | `true` | |
| extra-plugins | Extra plugins for pre-install. You can also specify specifying version range for the extra plugins if you prefer. Defaults to install @open-turo/semantic-release-config. | `false` | @open-turo/semantic-release-config |
| artifactory-username | Artifactory user name usually secrets.ARTIFACTORY_USERNAME | `true` | |
| artifactory-auth-token | Artifactory auth token usually secrets.ARTIFACTORY_AUTH_TOKEN | `true` | |
<!-- action-docs-inputs -->

<!-- action-docs-outputs -->
## Outputs

| parameter | description |
| --- | --- |
| new-release-published | Whether a new release was published |
| new-release-version | Version of the new release |
| new-release-major-version | Major version of the new release |
| image-name | Docker image name |
| image-with-tag | Full image with tag - <image-name>:<image-version> |
| pull-request-number | Pull request number |
| run-url | URL to the GHA run |
<!-- action-docs-outputs -->

<!-- action-docs-runs -->
## Runs

This action is a `composite` action.
<!-- action-docs-runs -->

<!-- action-docs-usage -->
<!-- action-docs-usage -->
<!-- prettier-ignore-end -->

## Additional Examples

### using output parameters example

```yaml
jobs:
build:
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Release
uses: open-turo/actions-tf/prerelease@v3
id: semantic # Need an `id` for output variables
with:
github-token: ${{ secrets.GITHUB_TOKEN }}

- name: Do something when a new release published
if: steps.semantic.outputs.new-release-published == 'true'
run: |
echo ${{ steps.semantic.outputs.new-release-version }}
echo ${{ steps.semantic.outputs.new-release-major-version }}
```
## Notes
- By default, this action will perform actions/checkout as its first step.
189 changes: 189 additions & 0 deletions prerelease/action.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,189 @@
name: GitHub Action Release and Publish Prerelease Module
description: GitHub Action to compute a prerelease version based on the latest release version and the number of commits since the latest release.
inputs:
checkout-repo:
required: false
description: Perform checkout as first step of action
default: "true"
create-prerelease:
required: false
description: Whether semantic-release should create a prerelease or do a dry run. This can be useful to set to true when a prerelease requires pushing artifacts semantic-release is in charge of generating
default: "true"
github-token:
required: true
description: GitHub token that can checkout the repository as well as create tags/releases against it. e.g. 'secrets.GITHUB_TOKEN'
extra-plugins:
required: false
description: Extra plugins for pre-install. You can also specify specifying version range for the extra plugins if you prefer. Defaults to install @open-turo/semantic-release-config.
default: |
@open-turo/semantic-release-config
outputs:
new-release-published:
description: Whether a new release was published
value: ${{ steps.prerelease.outputs.new-release-published }}
new-release-version:
description: Version of the new release
value: ${{ steps.prerelease.outputs.new-release-version }}
new-release-major-version:
description: Major version of the new release
value: ${{ steps.prerelease.outputs.new-release-major_version }}
pull-request-number:
description: Pull request number
value: ${{ steps.PR.outputs.number }}
run-url:
description: URL to the GHA run
value: ${{ steps.vars.outputs.run-url }}

runs:
using: composite
steps:
- name: Dump GitHub context
env:
GITHUB_CONTEXT: ${{ toJSON(github) }}
shell: bash
run: |
echo "::group::Github Context"
echo "$GITHUB_CONTEXT"
echo "::endgroup::"
- name: Set vars
id: source-vars
shell: bash
env:
event_name: ${{ github.event_name }}
dispatch_client_payload_ref: ${{ github.event.client_payload.ref }}
dispatch_client_payload_sha: ${{ github.event.client_payload.sha }}
push_ref_name: ${{ github.ref_name }}
push_sha: ${{ github.sha }}
pull_request_ref_name: ${{ github.event.pull_request.head.ref }}
pull_request_sha: ${{ github.event.pull_request.head.sha }}
run: |
echo "event_name=$event_name"
if [ "$event_name" == "push" ]; then
branch=$push_ref_name
sha=$push_sha
elif [ "$event_name" == "repository_dispatch" ]; then
branch=$dispatch_client_payload_ref
sha=$dispatch_client_payload_sha
elif [ "$event_name" == "pull_request" ]; then
branch=$pull_request_ref_name
sha=$pull_request_sha
else
echo "::error::Unsupported event type '$event_name'"
exit 1
fi
echo "branch=$branch"
echo "branch=$branch" >> $GITHUB_OUTPUT
echo "sha=$sha"
echo "sha=$sha" >> $GITHUB_OUTPUT
- uses: actions/checkout@v4
with:
fetch-depth: 0
ref: ${{ steps.source-vars.outputs.branch }}

# Find PR
- uses: 8BitJonny/[email protected]
id: PR
with:
sha: ${{ steps.source-vars.outputs.sha }}

- id: check-pr
shell: bash
run: |
if [ -z "${{ steps.PR.outputs.number }}" ]; then
echo "pr_found=false" >> $GITHUB_OUTPUT
echo "has_prerelease_label=false" >> $GITHUB_OUTPUT
else
echo "pr_found=true" >> $GITHUB_OUTPUT
echo "has_prerelease_label=${{ contains(toJSON(fromJSON(steps.PR.outputs.pr).labels.*.name), 'prerelease') }}" >> $GITHUB_OUTPUT
fi
git branch
echo "branch: ${{ steps.source-vars.outputs.branch }}"
- if: steps.check-pr.outputs.pr_found != 'true'
shell: bash
run: echo "PR does not exist for branch (${{ steps.source-vars.outputs.branch }}) - ignoring"

- if: steps.check-pr.outputs.has_prerelease_label == 'true'
shell: bash
run: |
echo "Your PR number is ${{ steps.PR.outputs.number }}"
echo "::debug::labels.contains('prerelease'): ${{ contains(toJSON(fromJSON(steps.PR.outputs.pr).labels.*.name), 'prerelease') }}"
# Compute next release
- uses: open-turo/action-setup-tools@v1
if: steps.check-pr.outputs.has_prerelease_label == 'true'

- name: Prerelease
id: prerelease
uses: open-turo/actions-release/semantic-release@v4
if: steps.check-pr.outputs.has_prerelease_label == 'true'
env:
GITHUB_TOKEN: ${{ inputs.github-token }}
ORG_GRADLE_PROJECT_artifactoryAuthToken: ${{ inputs.artifactory-auth-token }}
ORG_GRADLE_PROJECT_artifactoryUsername: ${{ inputs.artifactory-username }}
with:
branches: '["main", {"name": "${{ steps.source-vars.outputs.branch }}","channel": "next","prerelease": "pr-${{ steps.PR.outputs.number }}.${{ github.run_number }}.${{ github.run_attempt }}"}]'
dry-run: ${{ inputs.create-prerelease == 'false' }}
override-github-ref-name: ${{ steps.source-vars.outputs.branch }}
override-github-sha: ${{ steps.source-vars.outputs.sha }}
extra-plugins: ${{ inputs.extra-plugins }}

- id: vars
if: steps.check-pr.outputs.has_prerelease_label == 'true'
shell: bash
run: |
echo "version=${{ steps.prerelease.outputs.new-release-version }}" >> $GITHUB_OUTPUT
echo "run-url=https://github.com/$GITHUB_REPOSITORY/actions/runs/$GITHUB_RUN_ID" >> "$GITHUB_OUTPUT"
- name: Add new version to summary
shell: bash
if: steps.prerelease.outputs.new-release-published == 'true'
env:
NEW_VERSION: ${{ steps.vars.outputs.version }}
DOCKER_IMAGE: ${{ steps.build-docker.outputs.image-with-tag }}
run: |
echo "::notice::new version: \`${NEW_VERSION}\`"
echo "#### New version: \`${NEW_VERSION}\`" >> $GITHUB_STEP_SUMMARY
echo "#### Docekr image: \`${DOCKER_IMAGE}\`" >> $GITHUB_STEP_SUMMARY
- name: Add no new version to summary
shell: bash
if: steps.prerelease.outputs.new-release-published != 'true'
run: |
echo "::notice::no new version"
echo "### New version: 'NONE" >> $GITHUB_STEP_SUMMARY
- name: Check for release notes comment
uses: peter-evans/find-comment@v2
id: fc-prerelease
if: steps.prerelease.outputs.new-release-published == 'true'
with:
issue-number: ${{ steps.PR.outputs.number }}
comment-author: "github-actions[bot]"
body-includes: "<!-- prerelease comment -->"

- name: Delete previous release note
if: steps.fc-prerelease.outputs.comment-id != ''
uses: jungwinter/comment@v1
with:
type: delete
comment_id: ${{ steps.fc-prerelease.outputs.comment-id }}
token: ${{ inputs.github-token }}

- name: Upsert build version
if: steps.prerelease.outputs.new-release-published == 'true'
uses: peter-evans/create-or-update-comment@v1
with:
issue-number: ${{ steps.PR.outputs.number }}
body: |
<!-- prerelease comment -->
## Prerelease build
**Build version:** `${{ steps.vars.outputs.version }}`
[Build output](${{ steps.vars.outputs.run-url }})

0 comments on commit 5eedd2c

Please sign in to comment.