Skip to content

Commit

Permalink
Merge pull request #111 from alma/devx/dex-889-update-cicd-pipeline
Browse files Browse the repository at this point in the history
[DEX-889] Add new release workflow
  • Loading branch information
carine-bonnafous authored Jun 25, 2024
2 parents 9481a0b + a1a4c15 commit 9ca2ca8
Show file tree
Hide file tree
Showing 12 changed files with 525 additions and 45 deletions.
8 changes: 8 additions & 0 deletions .github/CODEOWNERS
Validating CODEOWNERS rules …
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# Grant ownership of all files by default to the ECOM integrations squad
* @alma/squad-e-commerce-integrations

# Grant DevX ownership of Github workflows and actions
.github @alma/squad-devx

# Grant DevX ownership of Taskfile
Taskfile.yml @alma/squad-devx
4 changes: 2 additions & 2 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
### Reason for change

<!-- Describe here the reason for change, and provide a link to the corresponding ClickUp task or Sentry issue. -->
<!-- Describe here the reason for change, and provide a link to the corresponding Linear task or Sentry issue. -->

[ClickUp task](https://app.clickup.com/20427503/v/b/4-32476982-2/CLICKUP_ISSUE_ID)
[Linear task](https://linear.app/almapay/issue/ECOM-XXX)

### Code changes

Expand Down
21 changes: 21 additions & 0 deletions .github/release-drafter.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
name-template: 'v$RESOLVED_VERSION'
tag-template: 'v$RESOLVED_VERSION'

template: |
$CHANGES
change-template: '- $TITLE'
change-title-escapes: '\<*_&#@`'
version-resolver:
major:
labels:
- 'major'
minor:
labels:
- 'minor'
- 'type: feature'
patch:
labels:
- 'patch'
default: patch
36 changes: 36 additions & 0 deletions .github/workflows/backport-pull-request.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# This workflow is triggered when a pull request is merged and the label 'release' is present.
# It opens a pull request to backport the changes from main to develop.
name: Create backport pull request

on:
pull_request:
branches:
- main
types:
- closed

jobs:

create-backport-pull-request:
if: ${{ (github.event.pull_request.merged == true) && (contains(github.event.pull_request.labels.*.name, 'release')) }}
runs-on: ubuntu-22.04

steps:

- uses: actions/checkout@v4
with:
ref: develop

# See https://github.com/peter-evans/create-pull-request/blob/main/docs/examples.md#keep-a-branch-up-to-date-with-another
- name: Fetch main branch
run: |
git fetch origin main:main
git reset --hard main
- name: Create Pull Request
uses: peter-evans/create-pull-request@v6
with:
commit-message: 'chore: backport main to develop'
title: Backport main to develop
branch: chore/backport-main-to-develop
base: develop
66 changes: 66 additions & 0 deletions .github/workflows/hotfix-pull-request.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
name: Create hotfix pull request

on:
workflow_dispatch:
inputs:
changelog-message:
type: string
description: The message to add to the changelog
required: true

jobs:

create-hotfix-pull-request:
runs-on: ubuntu-22.04

steps:

- uses: actions/checkout@v4
with:
ref: main

- name: Release drafter
uses: release-drafter/release-drafter@v6
id: release-drafter
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

- name: Update release draft
uses: actions/github-script@v7
with:
script: |
const { owner, repo } = context.repo;
await github.rest.repos.updateRelease({
owner,
repo,
release_id: "${{ steps.release-drafter.outputs.id }}",
draft: true,
body: "### 🐛 Bug Fixes\n ${{ inputs.changelog-message }}\n"
});
- name: Update CHANGELOG.md file
uses: stefanzweifel/changelog-updater-action@v1
with:
latest-version: ${{ steps.release-drafter.outputs.tag_name }}
release-notes: "### 🐛 Bug Fixes\n ${{ inputs.changelog-message }}\n"

- name: Update other files
run: |
./scripts/update-files-with-release-version.sh ${{ steps.release-drafter.outputs.tag_name }}
- name: Create Pull Request
uses: peter-evans/create-pull-request@v6
with:
commit-message: 'chore: update version'
title: Release ${{ steps.release-drafter.outputs.tag_name }}
body: |
Update version to ${{ steps.release-drafter.outputs.tag_name }}
### Checklist of actions to be done before merging
- [ ] Review and update the CHANGELOG.md if needed
- [ ] Review and update the Github release draft if needed
- [ ] Review the files updated with the new version number in the commit named "chore: update version"
branch: hotfix/${{ steps.release-drafter.outputs.tag_name }}
base: main
labels: hotfix, release

124 changes: 124 additions & 0 deletions .github/workflows/release-publish.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
# This workflow is triggered when a pull request is merged and the label 'release' is present.
# It fetches the last draft release, updates it to a non-draft release and sends a Slack message with the release notes.
name: Publish Release

on:
pull_request:
types:
- closed

jobs:

release:
if: github.event.pull_request.merged == true && contains(github.event.pull_request.labels.*.name, 'release')
runs-on: ubuntu-22.04

steps:

- uses: actions/checkout@v4

- name: Install taskfile.dev
uses: arduino/setup-task@v2
with:
version: 3.x
repo-token: ${{ github.token }}

- name: Create release zip file
shell: bash
run: |
task dist
- name: Fetch last draft release
id: fetch-release-draft
shell: bash
run: |
# Call Github releases API and filter draft releases
DRAFT_RELEASE=$(curl \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer ${{ github.token }}" \
https://api.github.com/repos/${{ github.repository }}/releases | \
jq 'map(select(.draft == true))' \
)
# Fail if 0 or more than 1 draft release is found
if [[ $(echo $DRAFT_RELEASE | jq 'length') -ne 1 ]]
then
echo "No draft release found or more than one draft release found"
exit 1
fi
DRAFT_RELEASE=$(echo $DRAFT_RELEASE | jq first)
# Retrieve name, id and body of the draft release
# We need to remove the quotes from the JSON output
NAME=$(echo $DRAFT_RELEASE | jq '.name' | sed 's/"//g')
ID=$(echo $DRAFT_RELEASE | jq '.id')
BODY=$(echo $DRAFT_RELEASE | jq '.body' | sed 's/"//g')
# Add URLs to GitHub pull requests
PULL_REQUEST_URL_START=${{ github.server_url }}/${{ github.repository }}/pull/
ESCAPED_PULL_REQUEST_URL_START=$(printf '%s\n' "$PULL_REQUEST_URL_START" | sed -e 's/[\/&]/\\&/g')
BODY=$(echo -e "$BODY" | sed -E "s/#([0-9]+)/[#\1](${ESCAPED_PULL_REQUEST_URL_START}\1)/g")
# Add URLs to GitHub profiles
PROFILE_URL_START=${{ github.server_url }}/
ESCAPED_PROFILE_URL_START=$(printf '%s\n' "$PROFILE_URL_START" | sed -e 's/[\/&]/\\&/g')
BODY=$(echo -e "$BODY" | sed -E "s/@([[:alnum:]-]+)/[@\1](${ESCAPED_PROFILE_URL_START}\1)/g")
# Write the output variables
echo "name=$NAME" >> $GITHUB_OUTPUT
echo "id=$ID" >> $GITHUB_OUTPUT
echo "body<<EOF" >> $GITHUB_OUTPUT
echo -e "$BODY" >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
- name: Add zip file to the release assets
shell: bash
run: |
curl \
-X POST \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer ${{ github.token }}" \
-H "Content-Type: application/zip" \
-T "dist/alma.zip" \
https://uploads.github.com/repos/${{ github.repository }}/releases/${{ steps.fetch-release-draft.outputs.id }}/assets?name=alma.zip
- name: Publish Github release
uses: actions/github-script@v7
with:
script: |
const { owner, repo } = context.repo;
await github.rest.repos.updateRelease({
owner,
repo,
release_id: "${{ steps.fetch-release-draft.outputs.id }}",
draft: false,
make_latest: true,
tag_name: "${{ steps.fetch-release-draft.outputs.name }}"
});
- name: Format release notes for Slack
# v1.0.2 cannot be used as it is not correctly handling the newlines
uses: LoveToKnow/[email protected]
id: slack-markdown-release-notes
with:
text: |
New release of ${{ github.repository }}, **[${{ steps.fetch-release-draft.outputs.name }}](https://github.com/${{ github.repository }}/releases/tag/${{ steps.fetch-release-draft.outputs.name }})**:
${{ steps.fetch-release-draft.outputs.body }}
- name: Send changelog to Slack
uses: slackapi/[email protected]
with:
# TODO: Replace with channel #alma_changelog (id: CR9C57YM6) once full testing is done
# Channel `#devx-experiments`
channel-id: C04MQ9VEWRF
slack-message: ${{ steps.slack-markdown-release-notes.outputs.text }}
payload: |
{
"username": "${{ github.event.sender.login }}",
"icon_url": "${{ github.event.sender.avatar_url }}"
}
env:
SLACK_BOT_TOKEN: ${{ secrets.SLACK_RELEASE_CHANGELOG_BOT_TOKEN }}
56 changes: 56 additions & 0 deletions .github/workflows/release-pull-request.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
name: Create release pull request

on:
workflow_dispatch:

jobs:

create-release-pull-request:
runs-on: ubuntu-22.04

steps:

- uses: actions/checkout@v4
with:
ref: main
persist-credentials: false

# This is needed to get all changes from develop in the PR
# It won't work if we checkout from develop, see https://github.com/peter-evans/create-pull-request/issues/2841
# See https://github.com/peter-evans/create-pull-request/blob/main/docs/examples.md#keep-a-branch-up-to-date-with-another
- name: Fetch develop branch
run: |
git fetch origin develop:develop
git reset --hard develop
- name: Create release draft
uses: release-drafter/release-drafter@v6
id: release-drafter
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

- name: Update CHANGELOG.md
uses: stefanzweifel/changelog-updater-action@v1
with:
latest-version: ${{ steps.release-drafter.outputs.tag_name }}
release-notes: ${{ steps.release-drafter.outputs.body }}

- name: Update files with release version
run: |
./scripts/update-files-with-release-version.sh ${{ steps.release-drafter.outputs.tag_name }}
- name: Create Pull Request
uses: peter-evans/create-pull-request@v6
with:
commit-message: 'chore: update version'
title: Release ${{ steps.release-drafter.outputs.tag_name }}
body: |
Update version to ${{ steps.release-drafter.outputs.tag_name }}
### Checklist of actions to be done before merging
- [ ] Review and update the CHANGELOG.md if needed
- [ ] Review and update the Github release draft if needed
- [ ] Review the files updated with the new version number in the commit named "chore: update version"
branch: release/${{ steps.release-drafter.outputs.tag_name }}
base: main
labels: release
Loading

0 comments on commit 9ca2ca8

Please sign in to comment.