ci: sync release changes to pg (#35893) #3
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
name: Merge release to pg | |
on: | |
push: | |
branches: | |
- release # Trigger on push to the release branch | |
jobs: | |
merge-release-to-pg: | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout release branch | |
uses: actions/checkout@v3 | |
with: | |
ref: release # Checkout the release branch | |
- name: Fetch all branches | |
run: git fetch --all | |
- name: Checkout pg branch | |
run: git checkout pg | |
- name: Get new commits from release | |
id: get_commits | |
run: | | |
COMMITS=$(git log pg..release --oneline | awk '{print $1}') | |
echo "COMMITS=\"$COMMITS\"" >> $GITHUB_ENV | |
- name: Merge commits one by one | |
id: merge_commits | |
run: | | |
# Initialize an empty list for conflicted commits | |
conflicted_commits=() | |
# Convert the string of commits to an array | |
IFS=' ' read -r -a commit_array <<< "$COMMITS" | |
# Loop through each commit | |
for commit in "${commit_array[@]}"; do | |
echo "Merging commit $commit" | |
git cherry-pick $commit || { | |
echo "Conflict detected with commit $commit" | |
conflicted_commits+=($commit) | |
git cherry-pick --abort | |
} | |
done | |
# Save conflicted commits to environment variable | |
echo "CONFLICTED_COMMITS=\"${conflicted_commits[@]}\"" >> $GITHUB_ENV | |
- name: Push changes | |
if: success() && steps.merge_commits.outputs.CONFLICTED_COMMITS == '' | |
run: | | |
git push origin pg | |
- name: Notify on merge conflicts | |
if: failure() | |
env: | |
REPOSITORY_URL: ${{ github.repositoryUrl }} | |
run: | | |
# Prepare the message for Slack | |
message="Merge conflict detected while merging release into pg branch. Conflicted commits:\n" | |
for commit in $CONFLICTED_COMMITS; do | |
commit_url="$REPOSITORY_URL/commit/$commit" | |
message+="$commit_url\n" | |
done | |
# Send the message to Slack | |
# This unwieldy horror of a sed command, converts standard Markdown links to Slack's unwieldy link syntax. | |
slack_message="$(echo "$message" | sed -E 's/\[([^]]+)\]\(([^)]+)\)/<\2|\1>/g')" | |
# This is the ChannelId of the proj postgres channel. | |
body="$(jq -nc \ | |
--arg channel C06Q3A97USE \ | |
--arg text "$slack_message" \ | |
'$ARGS.named' | |
)" | |
curl --version | |
curl -v https://slack.com/api/chat.postMessage \ | |
--header 'Authorization: Bearer ${{ secrets.SLACK_APPSMITH_ALERTS_TOKEN }}' \ | |
--header 'Content-Type: application/json; charset=utf-8' \ | |
--data-raw "$body" |