-
Notifications
You must be signed in to change notification settings - Fork 13
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
chore: use separate workflows for prs, releases and tags (#3276)
* 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
1 parent
607c6ed
commit 9efdff5
Showing
6 changed files
with
2,543 additions
and
150 deletions.
There are no files selected for viewing
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
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 }} |
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
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 }} | ||
|
@@ -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 | ||
|
@@ -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 | ||
|
@@ -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 | ||
|
@@ -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 }} | ||
|
@@ -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: | ||
|
@@ -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 }} | ||
|
@@ -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 }} |
Oops, something went wrong.