dashboard re renderings 2 #40658
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
# Cherry-picks commits from current branch to a specified one in a command "@metabase-bot backport release-x.40.x" | |
name: Backport | |
on: | |
issue_comment: | |
types: [created] | |
jobs: | |
create_pull_request: | |
name: Creates a pull request | |
if: contains(github.event.comment.body, '@metabase-bot backport') | |
runs-on: ubuntu-22.04 | |
steps: | |
- uses: tibdex/github-app-token@v2.1.0 | |
id: generate-token | |
with: | |
app_id: ${{ secrets.METABASE_BOT_APP_ID }} | |
private_key: ${{ secrets.METABASE_BOT_APP_PRIVATE_KEY }} | |
- uses: actions/checkout@v4 | |
name: Cherry-pick commits and create PR | |
with: | |
fetch-depth: 0 | |
- name: Verify Membership | |
id: verify-membership | |
uses: ./.github/actions/verify-membership | |
with: | |
github_token: ${{ steps.generate-token.outputs.token }} | |
organization_name: metabase | |
username: ${{ github.event.comment.user.login }} | |
- run: | | |
result=${{ steps.verify-membership.outputs.is_member }} | |
if [ $result == false ]; then | |
echo User ${{ github.event.comment.user.login }} is not a member of Metabase organization | |
exit 1 | |
fi | |
- uses: actions/github-script@v7 | |
id: branch_info | |
with: | |
script: | | |
await github.rest.reactions.createForIssueComment({ | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
comment_id: context.payload.comment.id, | |
content: 'eyes', | |
}); | |
// Example: @metabase-bot backport release-x.40.x | |
const [_botName, _command, targetBranch] = context.payload.comment.body.split(" "); | |
console.log(`Target branch is ${targetBranch}`); | |
const { data: originalPullRequest } = await github.rest.pulls.get({ | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
pull_number: context.payload.issue.number, | |
}); | |
const { data: commits } = await github.rest.pulls.listCommits({ | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
pull_number: context.payload.issue.number, | |
}); | |
const targetRef = await github.rest.git.getRef({ | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
ref: `heads/${targetBranch}`, | |
}); | |
const backportBranch = `backport-${originalPullRequest.head.ref}-${targetBranch}` | |
try { | |
await github.rest.git.getRef({ | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
ref: `heads/${backportBranch}`, | |
}); | |
} catch(e) { | |
if (e.status === 404) { | |
await github.rest.git.createRef({ | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
ref: `refs/heads/${backportBranch}`, | |
sha: targetRef.data.object.sha, | |
}); | |
} | |
} | |
return { | |
backportBranch, | |
targetBranch, | |
originalPullRequest, | |
startSha: commits[0].sha, | |
endSha: commits[commits.length - 1].sha | |
} | |
- id: create_backport_pull_request | |
name: Create backport pull request | |
run: | | |
git config --global user.email "metabase-bot@metabase.com" | |
git config --global user.name "Metabase bot" | |
git fetch --all | |
git checkout "${BACKPORT_BRANCH}" | |
git reset --hard origin/${TARGET_BRANCH} | |
if [[ -z $(git ls-remote --heads origin ${ORIGINAL_HEAD_REF}) ]]; then | |
echo "PR has been merged, searching for a squashed commit in the base branch" | |
echo "searching for a commit in a ${ORIGINAL_BASE_REF} that contains pull request number ${ORIGINAL_PULL_REQUEST_NUMBER}" | |
SQUASHED_COMMIT=$(env -i git log ${ORIGINAL_BASE_REF} --grep="(#${ORIGINAL_PULL_REQUEST_NUMBER})" --format="%H") | |
echo "found commit ${SQUASHED_COMMIT}" | |
git cherry-pick ${SQUASHED_COMMIT} | |
else | |
echo "PR has not been merged, copying all commits" | |
git cherry-pick ${ORIGINAL_BASE_SHA}..${ORIGINAL_HEAD_SHA} | |
fi | |
git push origin "${BACKPORT_BRANCH}" --force-with-lease | |
if [[ $(gh pr list --base "${TARGET_BRANCH}" --head "${BACKPORT_BRANCH}" -s "open") ]]; then | |
echo "PR already exists" | |
else | |
BACKPORT_PR_URL=$(gh pr create --base "${TARGET_BRANCH}" --head "${BACKPORT_BRANCH}" --label "was-backported" --assignee "${GITHUB_ACTOR}" --title "🤖 backported \"${ORIGINAL_TITLE}\"" --body "#${ORIGINAL_PULL_REQUEST_NUMBER}") | |
BACKPORT_PR_NUMBER=${BACKPORT_PR_URL##*/} | |
echo "backport_pr_number=$BACKPORT_PR_NUMBER" >> $GITHUB_OUTPUT | |
echo "New PR has been created" | |
fi | |
env: | |
ORIGINAL_TITLE: ${{ fromJson(steps.branch_info.outputs.result).originalPullRequest.title }} | |
ORIGINAL_BASE_REF: ${{ fromJson(steps.branch_info.outputs.result).originalPullRequest.base.ref }} | |
ORIGINAL_BASE_SHA: ${{ fromJson(steps.branch_info.outputs.result).originalPullRequest.base.sha }} | |
ORIGINAL_HEAD_REF: ${{ fromJson(steps.branch_info.outputs.result).originalPullRequest.head.ref }} | |
ORIGINAL_HEAD_SHA: ${{ fromJson(steps.branch_info.outputs.result).originalPullRequest.head.sha }} | |
ORIGINAL_PULL_REQUEST_NUMBER: ${{ fromJson(steps.branch_info.outputs.result).originalPullRequest.number }} | |
TARGET_BRANCH: ${{ fromJson(steps.branch_info.outputs.result).targetBranch }} | |
BACKPORT_BRANCH: ${{ fromJson(steps.branch_info.outputs.result).backportBranch }} | |
START_SHA: ${{ fromJson(steps.branch_info.outputs.result).startSha }} | |
END_SHA: ${{ fromJson(steps.branch_info.outputs.result).endSha }} | |
GITHUB_TOKEN: ${{ steps.generate-token.outputs.token }} | |
- name: Auto approve backport PR | |
uses: juliangruber/approve-pull-request-action@v1 | |
with: | |
github-token: ${{ secrets.GITHUB_TOKEN }} | |
number: ${{ steps.create_backport_pull_request.outputs.backport_pr_number }} | |
- name: Enable Pull Request Automerge | |
uses: peter-evans/enable-pull-request-automerge@v2 | |
with: | |
token: ${{ steps.generate-token.outputs.token }} | |
pull-request-number: ${{ steps.create_backport_pull_request.outputs.backport_pr_number }} | |
merge-method: squash | |
notify_when_failed: | |
runs-on: ubuntu-22.04 | |
name: Notify about failure | |
needs: create_pull_request | |
if: ${{ failure() }} | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: ./.github/actions/notify-pull-request | |
with: | |
include-log: true | |
message: something went wrong while creating a backport |