Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore: fix release workflow #508

Merged
merged 8 commits into from
Feb 28, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions .github/workflows/create-frontend-release-pr.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
name: Create Frontend Release PR

on:
workflow_dispatch:
push:
branches:
- main
paths:
- 'frontend/**'

permissions:
contents: write
pull-requests: write

jobs:
create-frontend-release:
concurrency:
group: create-frontend-release-${{ github.ref }}
cancel-in-progress: true

name: generate frontend changelog
runs-on: ubuntu-latest
if: github.repository == 'chanzuckerberg/cryoet-data-portal'
steps:
- name: create changelog
uses: google-github-actions/release-please-action@v4
id: release
with:
# TODO Configuring using manifest file as workaround until we move the frontend to its own repo
config-file: release-please.config.json
manifest-file: release-please.manifest.json
token: ${{ secrets.GITHUB_TOKEN }}
139 changes: 87 additions & 52 deletions .github/workflows/prod-deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ on:
schedule:
# Weekdays Mon-Fri @ 18:00 UTC (10AM PST [winter] / 11AM PDT [summer])
- cron: '0 18 * * 1-5'

permissions:
contents: write
id-token: write
Expand All @@ -20,62 +21,121 @@ jobs:
with:
environment: staging

create-frontend-release:
find-frontend-release-pr:
concurrency:
group: create-frontend-release-${{ github.ref }}
cancel-in-progress: true

outputs:
pr: ${{ steps.release.outputs.pr }}
prs_created: ${{ steps.release.outputs.prs_created }}
pr: ${{ steps.find-release-pr.outputs.result }}

name: generate frontend changelog
name: find release PR
runs-on: ubuntu-latest
if: github.repository == 'chanzuckerberg/cryoet-data-portal'
needs: run-staging-e2e-test
if: ${{ (github.repository == 'chanzuckerberg/cryoet-data-portal') }}
steps:
- name: create changelog
uses: google-github-actions/release-please-action@v4
id: release
- name: find release PR
uses: actions/github-script@v7
id: find-release-pr
with:
# TODO Configuring using manifest file as workaround until we move the frontend to its own repo
config-file: release-please.config.json
manifest-file: release-please.manifest.json
token: ${{ secrets.GITHUB_TOKEN }}
script: |
const { owner, repo } = context.repo
const { data: searchResult } = await github.rest.search.issuesAndPullRequests(
{
q: `repo:${owner}/${repo} is:pr label:"autorelease: pending"`,
per_page: 1,
}
)

const [issue] = searchResult.items
if (!issue) {
throw new Error('No release PR found')
}

// Getting PR data from /pulls API has more info about the pull
// request like merge_commit_sha.
const { data: pr } = await github.rest.pulls.get({
owner,
repo,
pull_number: issue.number,
})

return pr

tag-frontend-release:
concurrency:
group: tag-frontend-release-${{ github.ref }}
cancel-in-progress: true

outputs:
tag: frontend-v${{ steps.extract-version.outputs.result }}
tag: frontend-v${{ steps.get-tag-name.outputs.result }}

name: tag frontend release
runs-on: ubuntu-latest
if: ${{ (github.repository == 'chanzuckerberg/cryoet-data-portal') && (needs.create-frontend-release.outputs.prs_created == 'true') }}
needs: create-frontend-release
if: github.repository == 'chanzuckerberg/cryoet-data-portal'
needs: find-frontend-release-pr
steps:
- name: merge release PR
uses: actions/github-script@v7
id: merge-release-pr
if: fromJson(needs.find-frontend-release-pr.outputs.pr).state == 'open'
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
result-encoding: string
script: |
const pr = ${{ needs.create-frontend-release.outputs.pr }}
const pr = ${{ needs.find-frontend-release-pr.outputs.pr }}
console.log(`Merging release PR #${pr.number}`)

const [owner, repo] = '${{ github.repository }}'.split('/')
const { owner, repo } = context.repo
const mergeResponse = await github.rest.pulls.merge({
owner,
repo,
pull_number: pr.number,
merge_method: 'squash',
})

const [mergeResponse] = await Promise.all([
github.rest.pulls.merge({
owner,
repo,
pull_number: pr.number,
merge_method: 'squash',
}),
return mergeResponse.data.sha

- name: checkout repo for tagging
uses: actions/checkout@v4
with:
ref: |
${{
fromJson(needs.find-frontend-release-pr.outputs.pr).state == 'open' &&
steps.merge-release-pr.outputs.result ||
fromJson(needs.find-frontend-release-pr.outputs.pr).merge_commit_sha
}}

- name: get tag name
id: get-tag-name
uses: actions/github-script@v7
with:
script: |
const pr = ${{ needs.find-frontend-release-pr.outputs.pr }}
const version = pr.title.split(' ').at(-1)

return {
version,
manasaV3 marked this conversation as resolved.
Show resolved Hide resolved
tag: `web-v${version}`,
}

- name: tag release
run: |
git config user.name github-actions[bot]
git config user.email github-actions[bot]@users.noreply.github.com
git tag -a ${{ fromJson(steps.get-tag-name.outputs.result).tag }} -m "Releasing frontend v${{ fromJson(steps.get-tag-name.outputs.result).version }}"
git push origin ${{ fromJson(steps.get-tag-name.outputs.result).tag }}

- name: update label for release PR
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
result-encoding: string
script: |
const pr = ${{ needs.find-frontend-release-pr.outputs.pr }}
const { owner, repo } = context.repo
const { tag } = ${{ steps.get-tag-name.outputs.result }}

await Promise.all([
github.rest.issues.removeLabel({
owner,
repo,
Expand All @@ -91,40 +151,15 @@ jobs:
}),
])

return mergeResponse.data.sha

- name: checkout repo for tagging
uses: actions/checkout@v4
with:
ref: ${{ steps.merge-release-pr.outputs.result }}

- name: extract version
id: extract-version
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
result-encoding: string
script: |
const pr = ${{ needs.create-frontend-release.outputs.pr }}
const version = pr.title.split(' ').at(-1)
return version

- name: tag release
run: |
git config user.name github-actions[bot]
git config user.email github-actions[bot]@users.noreply.github.com
git tag -a frontend-v${{ steps.extract-version.outputs.result }} -m "Release frontend v${{ steps.extract-version.outputs.result }}"
git push origin frontend-v${{ steps.extract-version.outputs.result }}

deploy-to-prod:
concurrency:
group: prod-frontend-deploy-${{ github.ref }}
cancel-in-progress: true
name: deploy prod branch
runs-on: ubuntu-latest
needs: [create-frontend-release, tag-frontend-release]
environment: prod
if: ${{ (github.repository == 'chanzuckerberg/cryoet-data-portal') && (needs.create-frontend-release.outputs.prs_created == 'true') }}
needs: [find-frontend-release-pr, tag-frontend-release]
if: github.repository == 'chanzuckerberg/cryoet-data-portal'
steps:
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v4
Expand Down
2 changes: 1 addition & 1 deletion frontend/package.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"name": "cryoet-data-portal",
"name": "web",
"version": "1.0.1",
"scripts": {
"preinstall": "npx only-allow pnpm",
Expand Down
Loading