Skip to content

Commit

Permalink
chore: use separate workflows for prs, releases and tags (#3276)
Browse files Browse the repository at this point in the history
* PR workflow: verify-pr.yml
This workflow triggers on pull request actions only.
It verifies that the PR code passes build, lint, test, and e2e.

* Release workflow: release.yml
This workflow only runs on pushes to the master branch since this is the only release branch.
Every release involves 2 commits to master:
** squash merging the PR
** the release workflow pushes a new commit with version change in package.json
and CHANGELOG.md, e.g. the [skip release] commit

The release workflow triggers for both pushes to master listed above.
But we only want the jobs to run for the first push.
Therefore all jobs ( build, lint, test, e2e, release, report) check that the commit is not
a "[skip release]". In the case of the second commit ([skip release]) the workflow will therefore
complete successfully without running any jobs.

The semantic-release workflow steps are found in .releaserc. 
Previously @dhis2/action-semantic-release was used but this was overkill for our needs
and difficult to make changes to.
Therefore, we created our own semantic-release steps in .releaserc:
** commit-analyzer: Determines the next app version
** release-notes-generator: Generates the new release notes
** changelog: Updates CHANGELOG.md with the generated release notes
** npm: Updates package.json with the new version number.
Does not publish to npm since private: true in package.json
** exec: Runs yarn build which updates all version number references in the bundle
** git: creates commit number "2" (mentioned above) with just CHANGELOG.md and
package.json and pushes it to the remote
** github: pushes the bundle to the github repo as a new release and adds a tag

After semantic-release is complete, the bundle is then published to AppHub so that it
is actually available to all users. Because of the addition of the exec yarn build step,
all references to the version in the bundle should be the same, thus fixing the
annoying bug where the old version displays in the instance after installing the later version.

If any point in the release fails, then a failure message is sent to slack. If the release step
succeeds, then a success message is posted to slack that includes the new
version number and the release notes.

* Publish to d2-ci: publish-to-d2-ci.yml
This workflow publishes the build to d2-ci in the following cases:
** The [skip release] commit on master
** Git tags
** Fail message is sent to slack if the publish failed
  • Loading branch information
jenniferarnesen authored Aug 14, 2024
1 parent 607c6ed commit 9efdff5
Show file tree
Hide file tree
Showing 6 changed files with 2,543 additions and 150 deletions.
59 changes: 59 additions & 0 deletions .github/workflows/publish-d2-ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
name: 'publish build to d2-ci'

on:
push:
branches:
- master
tags:
- '*'

env:
GIT_AUTHOR_NAME: '@dhis2-bot'
GIT_AUTHOR_EMAIL: '[email protected]'
GIT_COMMITTER_NAME: '@dhis2-bot'
GIT_COMMITTER_EMAIL: '[email protected]'
GH_TOKEN: ${{secrets.DHIS2_BOT_GITHUB_TOKEN}}
CI: true

jobs:
publish-to-d2-ci:
if: |
${{ !github.event.push.repository.fork }} &&
${{ startsWith(github.ref, 'refs/tags/') || (github.ref == 'refs/heads/master' && contains(github.event.head_commit.message, '[skip release]')) }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3

- uses: actions/setup-node@v3
with:
node-version: 18.x

- name: Install
run: yarn install --frozen-lockfile

- name: Build
run: yarn d2-app-scripts build

- name: Copy build to d2-ci
uses: dhis2/deploy-build@master
with:
build-dir: build/app
github-token: ${{ secrets.DHIS2_BOT_GITHUB_TOKEN }}

report-deploy-failure:
runs-on: ubuntu-latest
needs: publish-to-d2-ci
steps:
- name: Send failure message to analytics-internal-bot slack channel
if: ${{ failure() && !cancelled() }}
id: slack_publish_failure
uses: slackapi/[email protected]
with:
channel-id: ${{ secrets.SLACK_CHANNEL_ID }}
payload: |
{
"text": ":small_red_triangle_down: :maps-app: Maps failed to deploy to d2-ci",
}
env:
SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
Original file line number Diff line number Diff line change
@@ -1,24 +1,22 @@
name: 'dhis2: verify (app)'
name: 'release app'

on:
pull_request:
types: ['opened', 'labeled', 'reopened', 'synchronize']
push:
branches:
- 'master'
tags:
- '*'

env:
GIT_AUTHOR_NAME: '@dhis2-bot'
GIT_AUTHOR_EMAIL: '[email protected]'
GIT_COMMITTER_NAME: '@dhis2-bot'
GIT_COMMITTER_EMAIL: '[email protected]'
GH_TOKEN: ${{secrets.DHIS2_BOT_GITHUB_TOKEN}}
D2_APP_HUB_TOKEN: ${{secrets.DHIS2_BOT_APPHUB_TOKEN}}
CI: true

jobs:
setup-matrix:
if: ${{ !contains(github.event.head_commit.message, '[skip release]') }}
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.set-matrix.outputs.specs }}
Expand All @@ -29,6 +27,7 @@ jobs:
run: echo "::set-output name=specs::$(node cypress/support/generateTestMatrix.js)"

build:
if: ${{ !contains(github.event.head_commit.message, '[skip release]') }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
Expand All @@ -42,15 +41,8 @@ jobs:
- name: Build
run: yarn d2-app-scripts build

- uses: actions/upload-artifact@v3
with:
name: app-build
path: |
**/build
!**/node_modules
retention-days: 1

lint:
if: ${{ !contains(github.event.head_commit.message, '[skip release]') }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
Expand All @@ -68,6 +60,7 @@ jobs:
run: yarn d2-style check

test:
if: ${{ !contains(github.event.head_commit.message, '[skip release]') }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
Expand All @@ -89,14 +82,14 @@ jobs:
REPORTPORTAL_PROJECT: ${{ vars.REPORTPORTAL_PROJECT }}
CI_BUILD_ID: ${{ github.sha }}-${{ github.workflow }}-${{ github.event_name }}
BRANCH_NAME: ${{ github.head_ref || github.ref_name }}
PR_TITLE: ${{ github.event_name == 'pull_request' && github.event.pull_request.title || format('Direct push to {0}', github.ref_name) }}
PR_TITLE: ${{ format('Direct push to {0}', github.ref_name) }}

call-workflow-e2e-prod:
if: "!contains(github.event.head_commit.message, '[skip ci]')"
if: ${{ !contains(github.event.head_commit.message, '[skip ci]') && !contains(github.event.head_commit.message, '[skip release]')}}
needs: [build, lint, test, setup-matrix]
uses: dhis2/workflows/.github/workflows/analytics-e2e-tests-prod.yml@master
with:
should_record: ${{ contains(github.event.head_commit.message, '[e2e record]') || contains(join(github.event.pull_request.labels.*.name), 'e2e record')}}
should_record: ${{ contains(github.event.head_commit.message, '[e2e record]') }}
spec-group: ${{ needs.setup-matrix.outputs.matrix }}
secrets:
username: ${{ secrets.CYPRESS_DHIS2_USERNAME }}
Expand All @@ -109,10 +102,11 @@ jobs:
release:
runs-on: ubuntu-latest
needs: call-workflow-e2e-prod
if: |
!github.event.push.repository.fork &&
if: >
${{ !github.event.push.repository.fork &&
github.actor != 'dependabot[bot]' &&
(github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags/'))
!contains(github.event.head_commit.message, '[skip ci]') &&
!contains(github.event.head_commit.message, '[skip release]') }}
steps:
- uses: actions/checkout@v3
with:
Expand All @@ -122,80 +116,38 @@ jobs:
with:
node-version: 18.x

- uses: actions/download-artifact@v3
with:
name: app-build

- name: Install
run: yarn install --frozen-lockfile

- uses: dhis2/action-semantic-release@master
with:
publish-apphub: true
publish-github: true
github-token: ${{ secrets.DHIS2_BOT_GITHUB_TOKEN }}
apphub-token: ${{ secrets.DHIS2_BOT_APPHUB_TOKEN }}

- uses: dhis2/deploy-build@master
with:
build-dir: build/app
github-token: ${{ secrets.DHIS2_BOT_GITHUB_TOKEN }}

report-release-failure:
runs-on: ubuntu-latest
needs: release
if: |
failure() &&
!cancelled() &&
github.ref == 'refs/heads/master' &&
contains(github.event.head_commit.message, 'chore(release)')
steps:
- name: Checkout code
uses: actions/checkout@master

- name: Extract version
id: extract_version
uses: Saionaro/[email protected]

- name: Send failure message to analytics-internal-bot slack channel
id: slack
uses: slackapi/[email protected]
with:
channel-id: ${{ secrets.SLACK_CHANNEL_ID }}
payload: |
{
"text": ":small_red_triangle_down: :maps-app: Maps release <https://github.com/dhis2/maps-app/actions/workflows/dhis2-verify-app.yml?query=branch%3Amaster+is%3Afailure|failed>",
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": ":small_red_triangle_down: :maps-app: Maps release <https://github.com/dhis2/maps-app/actions/workflows/dhis2-verify-app.yml?query=branch%3Amaster+is%3Afailure|failed>"
}
}
]
}
# This step will push a new commit to master with [skip release] in the commit message
- name: Run Semantic Release
run: npx semantic-release
env:
SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
GITHUB_TOKEN: ${{ secrets.DHIS2_BOT_GITHUB_TOKEN }}

- name: Publish to AppHub
run: yarn run d2-app-scripts publish

report-release-success:
report-release-result:
runs-on: ubuntu-latest
needs: release
if: |
success() &&
!cancelled() &&
github.ref == 'refs/heads/master' &&
contains(github.event.head_commit.message, 'chore(release)')
if: >
${{ !github.event.push.repository.fork &&
github.actor != 'dependabot[bot]' &&
!contains(github.event.head_commit.message, '[skip ci]') &&
!contains(github.event.head_commit.message, '[skip release]') }}
steps:
- name: Checkout code
uses: actions/checkout@master

- name: Extract version
if: success()
id: extract_version
uses: Saionaro/[email protected]

- name: Send success message to analytics-internal-bot slack channel
id: slack
if: success()
id: slack_success
uses: slackapi/[email protected]
with:
channel-id: ${{ secrets.SLACK_CHANNEL_ID }}
Expand All @@ -221,24 +173,46 @@ jobs:
"text": "*Release Notes*"
}
},
{
"type": "section",
"text": {
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": ${{ toJSON(github.event.head_commit.message) }}
}
},
{
"type": "divider"
},
{
"type": "section",
"text": {
}
},
{
"type": "divider"
},
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "Link to <https://github.com/dhis2/maps-app/actions/workflows/dhis2-verify-app.yml?query=branch%3Amaster+is%3Asuccess|build>"
}
}
]
}
env:
SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}

- name: Send failure message to analytics-internal-bot slack channel
if: ${{ failure() && !cancelled() }}
id: slack_failure
uses: slackapi/[email protected]
with:
channel-id: ${{ secrets.SLACK_CHANNEL_ID }}
payload: |
{
"text": ":small_red_triangle_down: :maps-app: Maps release <https://github.com/dhis2/maps-app/actions/workflows/dhis2-verify-app.yml?query=branch%3Amaster+is%3Afailure|failed>",
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": ":small_red_triangle_down: :maps-app: Maps release <https://github.com/dhis2/maps-app/actions/workflows/dhis2-verify-app.yml?query=branch%3Amaster+is%3Afailure|failed>"
}
}
}
]
]
}
env:
SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
Loading

0 comments on commit 9efdff5

Please sign in to comment.