Skip to content

Commit

Permalink
Add support for public and hotfix releases in Tag Release workflow (#…
Browse files Browse the repository at this point in the history
…2246)

Task/Issue URL: https://app.asana.com/0/1199230911884351/1206628689034178/f

Description:
This change renames tag_and_merge.yml workflow to tag_release.yml and updates it to handle
public releases (regular as well as hotfixes). For public releases, tag_release deletes the release
branch instead of merging it to the base branch. publish_dmg_release workflow calls tag_release
for non-internal releases prior to publishing.
New Asana comments and templates were added to inform release DRI about the progress and issues.
  • Loading branch information
ayoy authored Feb 23, 2024
1 parent e8bf262 commit 4d4ca2b
Show file tree
Hide file tree
Showing 14 changed files with 212 additions and 28 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
data:
html_text: |
<body>
<h2>[ACTION NEEDED] Failed to publish ${TAG} release – tagging failed</h2>
<ul>
<li><b>❗️ Tagging repository with ${TAG} tag failed.</b></li>
<li><b>⚠️ GitHub release creation was skipped.</b></li>
<li><b>⚠️ Deleting <code>${BRANCH}</code> was skipped.</b></li>
</ul>
<a data-asana-gid='${ASSIGNEE_ID}'/>, please proceed with the release <a data-asana-gid='${TASK_ID}' data-asana-dynamic='false'>according to instructions</a>.
🔗 Workflow URL: <a href='${WORKFLOW_URL}'>${WORKFLOW_URL}</a>.
</body>
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
data:
# yq -o=j | sed -E 's/\\n( *)([^\\n])/\2/g'
html_text: |
<body>
<h2>[ACTION NEEDED] Public release ${TAG} tagged</h2>
<ul>
<li>🏷️ Repository is tagged with <code>${TAG}</code> tag.</li>
<li>🚢 GitHub <a href='${RELEASE_URL}'>${TAG} release</a> is created.</li>
<li><b>❗️ Deleting <code>${BRANCH}</code> failed.</b>
<ul>
<li><a data-asana-gid='${ASSIGNEE_ID}'/>, please proceed with deleting the branch manually <a data-asana-gid='${TASK_ID}' data-asana-dynamic='false'>according to instructions</a>.</li>
</ul></li>
</ul>
🔗 Workflow URL: <a href='${WORKFLOW_URL}'>${WORKFLOW_URL}</a>.
</body>
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
data:
# yq -o=j | sed -E 's/\\n( *)([^\\n])/\2/g'
html_text: |
<body>
<h2>Public release ${TAG} has been tagged ✅</h2>
<ul>
<li>📥 DMG is available from <a href='${DMG_URL}'>${DMG_URL}</a>.</li>
<li>🏷️ Repository is tagged with <code>${TAG}</code> tag.</li>
<li>🚢 GitHub <a href='${RELEASE_URL}'>${TAG} release</a> is created.</li>
<li>🔱 <code>${BRANCH}</code> branch has been deleted.</li>
<li>🚀 The relase will be published to Sparkle in a few minutes (you'll get notified).</li>
</ul>
🔗 Workflow URL: <a href='${WORKFLOW_URL}'>${WORKFLOW_URL}</a>.
</body>
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
data:
name: Delete ${BRANCH} branch
assignee: "${ASSIGNEE_ID}"
html_notes: |
<body>
The <code>${TAG}</code> public release has been successfully tagged and published in GitHub releases,
but deleting <code>${BRANCH}</code> branch failed. Please delete it manually:
<ul>
<li><code>git push origin --delete ${BRANCH}</code></li>
</ul>
Complete this task when ready, or if the release branch has already been deleted.
🔗 Workflow URL: <a href='${WORKFLOW_URL}'>${WORKFLOW_URL}</a>.
</body>
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
data:
name: Merging ${BRANCH} to ${BASE_BRANCH} failed
name: Tag ${BRANCH} branch and create GitHub release
assignee: "${ASSIGNEE_ID}"
html_notes: |
<body>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
data:
name: Merging ${BRANCH} to ${BASE_BRANCH} failed
name: Merge ${BRANCH} to ${BASE_BRANCH}
assignee: "${ASSIGNEE_ID}"
html_notes: |
<body>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
data:
name: Tag ${BRANCH} branch, delete it, and create GitHub release
assignee: "${ASSIGNEE_ID}"
html_notes: |
<body>
Failed to tag the release with <code>${TAG}</code> tag.
Please follow instructions below to tag the branch, make GitHub release and delete the release branch manually.
<ul>
<li>If the tag has already been created, please proceed with creating GitHub release and deleting the branch.</li>
<li>If both tag and GitHub release have already been created, please close this task already.</li>
</ul>
Issue the following git commands to tag the release and delete the branch:
<ul>
<li><code>git fetch origin</code></li>
<li><code>git checkout ${BRANCH}</code> switch to the release branch</li>
<li><code>git pull origin ${BRANCH}</code> pull latest changes</li>
<li><code>git tag ${TAG}</code> tag the release</li>
<li><code>git push origin ${TAG}</code> push the tag</li>
<li><code>git checkout ${BASE_BRANCH}</code> switch to ${BASE_BRANCH}</li>
<li><code>git push origin --delete ${BRANCH}</code> delete the release branch</li>
</ul>
To create GitHub release:
<ul>
<li>Set up GH CLI if you haven't yet: <a data-asana-gid='1203791243007683'/></li>
<li>Run the following command:
<ul>
<li><code>gh release create ${TAG} --generate-notes --latest --notes-start-tag ${LAST_RELEASE_TAG}</code></li>
</ul></li>
</ul>
Complete this task when ready.
🔗 Workflow URL: <a href='${WORKFLOW_URL}'>${WORKFLOW_URL}</a>.
</body>
11 changes: 8 additions & 3 deletions .github/actions/create-tag-and-github-release/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,11 @@ inputs:
required: true
type: string
outputs:
promoted-tag:
description: "Pre-release tag (x.y.z-N) that has been promoted to a release tag (x.y.z)"
value: ${{ steps.compute-tag.outputs.promoted-tag }}
tag:
description: "Tag that has been added"
description: "Tag that has been added (x.y.z-N for internal, x.y.z for public and hotfixes)"
value: ${{ steps.compute-tag.outputs.tag }}
tag-created:
description: "Whether the tag has been created"
Expand All @@ -30,11 +33,13 @@ runs:
shell: bash
run: |
version="$(cut -d ' ' -f 3 < Configuration/Version.xcconfig)"
build_number="$(cut -d ' ' -f 3 < Configuration/BuildNumber.xcconfig)"
if [[ "${{ inputs.prerelease }}" == "true" ]]; then
build_number="$(cut -d ' ' -f 3 < Configuration/BuildNumber.xcconfig)"
tag="${version}-${build_number}"
else
tag="${version}"
promoted_tag="${version}-${build_number}"
echo "promoted-tag=${promoted_tag}" >> $GITHUB_OUTPUT
fi
echo "tag=${tag}" >> $GITHUB_OUTPUT
Expand All @@ -53,5 +58,5 @@ runs:
if [[ "${{ inputs.prerelease }}" == "true" ]]; then
gh release create ${{ steps.compute-tag.outputs.tag }} --generate-notes --prerelease --notes-start-tag ${latest_release}
else
gh release create ${{ steps.compute-tag.outputs.tag }} --generate-notes --notes-start-tag ${latest_release}
gh release create ${{ steps.compute-tag.outputs.tag }} --generate-notes --latest --notes-start-tag ${latest_release}
fi
2 changes: 1 addition & 1 deletion .github/actions/install-certs-and-profiles/action.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: Instal Certs and Profiles
name: Install Certs and Profiles
description: Installs signing certificates and provisioning profiles
inputs:
BUILD_CERTIFICATE_BASE64:
Expand Down
3 changes: 2 additions & 1 deletion .github/workflows/bump_internal_release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -123,11 +123,12 @@ jobs:
tag_and_merge:
name: Tag and Merge Branch
needs: [ prepare_release ]
uses: ./.github/workflows/tag_and_merge.yml
uses: ./.github/workflows/tag_release.yml
with:
asana-task-url: ${{ github.event.inputs.asana-task-url }}
branch: ${{ github.ref_name }}
base-branch: ${{ github.event.inputs.base-branch || 'main' }}
prerelease: true
secrets:
ASANA_ACCESS_TOKEN: ${{ secrets.ASANA_ACCESS_TOKEN }}
GHA_ELEVATED_PERMISSIONS_TOKEN: ${{ secrets.GHA_ELEVATED_PERMISSIONS_TOKEN }}
3 changes: 2 additions & 1 deletion .github/workflows/code_freeze.yml
Original file line number Diff line number Diff line change
Expand Up @@ -163,10 +163,11 @@ jobs:
tag_and_merge:
name: Tag and Merge Branch
needs: [ create_release_branch, prepare_release ]
uses: ./.github/workflows/tag_and_merge.yml
uses: ./.github/workflows/tag_release.yml
with:
asana-task-url: ${{ needs.create_release_branch.outputs.asana_task_url }}
branch: ${{ needs.create_release_branch.outputs.release_branch_name }}
prerelease: true
secrets:
ASANA_ACCESS_TOKEN: ${{ secrets.ASANA_ACCESS_TOKEN }}
GHA_ELEVATED_PERMISSIONS_TOKEN: ${{ secrets.GHA_ELEVATED_PERMISSIONS_TOKEN }}
30 changes: 28 additions & 2 deletions .github/workflows/publish_dmg_release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,33 @@ on:

jobs:

# This is only run for public and hotfix releases
# Internal release has been tagged as part of code_freeze or bump_interal_release workflows
tag-public-release:

name: Tag public release

if: ${{ github.event.inputs.release-type != 'internal' }}

uses: ./.github/workflows/tag_release.yml
with:
asana-task-url: ${{ github.event.inputs.asana-task-url }}
branch: ${{ github.ref_name }}
prerelease: false
secrets:
ASANA_ACCESS_TOKEN: ${{ secrets.ASANA_ACCESS_TOKEN }}
GHA_ELEVATED_PERMISSIONS_TOKEN: ${{ secrets.GHA_ELEVATED_PERMISSIONS_TOKEN }}

publish-to-sparkle:

name: Publish a release to Sparkle

needs: [tag-public-release]

# Allow to run even if the tag-public-release job was skipped (e.g. for internal releases)
# or failed (for public releases or hotfixes), because tagging doesn't block publishing the release
if: always()

runs-on: macos-13-xlarge
timeout-minutes: 10

Expand Down Expand Up @@ -68,8 +91,11 @@ jobs:
env:
DMG_NAME: duckduckgo-${{ steps.verify-tag.outputs.release-version }}.dmg
run: |
DMG_URL="${{ vars.DMG_URL_ROOT }}${DMG_NAME}"
curl -fLSs -o "$DMG_NAME" "$DMG_URL"
# Public release doesn't need fetching a DMG (it's already uploaded to S3)
if [[ "${{ github.event.inputs.release-type }}" != 'public' ]]; then
DMG_URL="${{ vars.DMG_URL_ROOT }}${DMG_NAME}"
curl -fLSs -o "$DMG_NAME" "$DMG_URL"
fi
echo "dmg-name=$DMG_NAME" >> $GITHUB_OUTPUT
echo "dmg-path=$DMG_NAME" >> $GITHUB_OUTPUT
Expand Down
Loading

0 comments on commit 4d4ca2b

Please sign in to comment.