forked from jito-foundation/jito-solana
-
Notifications
You must be signed in to change notification settings - Fork 1
177 lines (171 loc) · 7 KB
/
rebase.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
# This workflow runs a periodic rebase process, pulling in updates from an upstream repository
# The workflow for rebasing a jito-solana branch to a solana labs branch locally is typically:
# $ git checkout v1.17
# $ git pull --rebase # --rebase needed locally
# $ git branch -D lb/v1.17_rebase # deletes branch from last v1.17 rebase
# $ git checkout -b lb/v1.17_rebase
# $ git fetch upstream
# $ git rebase upstream/v1.17 # rebase + fix merge conflicts
# $ git rebase --continue
# $ git push origin +lb/v1.17_rebase # force needed to overwrite remote. wait for CI, fix if any issues
# $ git checkout v1.17
# $ git reset --hard lb/v1.17_rebase
# $ git push origin +v1.17
#
# This workflow automates this process, with periodic status updates over slack.
# It will also run CI and wait for it to pass before performing the force push to v1.17.
# In the event there's a failure in the process, it's reported to slack and the job stops.
name: "Rebase jito-solana from upstream anza-xyz/agave"
on:
# push:
schedule:
- cron: "30 18 * * 1-5"
jobs:
rebase:
runs-on: ubuntu-latest
strategy:
matrix:
include:
- branch: master
rebase: upstream/master
- branch: v1.18
rebase: upstream/v1.18
- branch: v2.0
rebase: upstream/v2.0
fail-fast: false
steps:
- uses: actions/checkout@v4
with:
ref: ${{ matrix.branch }}
submodules: recursive
fetch-depth: 0
token: ${{ secrets.JITO_SOLANA_RELEASE_TOKEN }}
- name: Add upstream
run: git remote add upstream https://github.com/anza-xyz/agave.git
- name: Fetch upstream
run: git fetch upstream
- name: Fetch origin
run: git fetch origin
- name: Set REBASE_BRANCH
run: echo "REBASE_BRANCH=ci/nightly/${{ matrix.branch }}/$(date +'%Y-%m-%d-%H-%M')" >> $GITHUB_ENV
- name: echo $REBASE_BRANCH
run: echo $REBASE_BRANCH
- name: Create rebase branch
run: git checkout -b $REBASE_BRANCH
- name: Setup email
run: |
git config --global user.email "[email protected]"
git config --global user.name "Jito Infrastructure"
- name: Rebase
id: rebase
run: git rebase ${{ matrix.rebase }}
- name: Send warning for rebase error
if: failure() && steps.rebase.outcome == 'failure'
uses: slackapi/[email protected]
with:
payload: |
{
"text": "Nightly rebase on branch ${{ matrix.branch }}\nStatus: Rebase failed to apply cleanly"
}
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
- name: Check if rebase applied
id: check_rebase_applied
run: |
PRE_REBASE_SHA=$(git rev-parse ${{ matrix.branch }})
POST_REBASE_SHA=$(git rev-parse HEAD)
if [ "$PRE_REBASE_SHA" = "$POST_REBASE_SHA" ]; then
echo "No rebase was applied, exiting..."
exit 1
else
echo "Rebase applied successfully."
fi
- name: Send warning for rebase error
if: failure() && steps.check_rebase_applied.outcome == 'failure'
uses: slackapi/[email protected]
with:
payload: |
{
"text": "Nightly rebase on branch ${{ matrix.branch }}\nStatus: Rebase not needed"
}
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
- name: Set REBASE_SHA
run: echo "REBASE_SHA=$(git rev-parse HEAD)" >> $GITHUB_ENV
- name: Push changes
uses: ad-m/github-push-action@master
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
branch: ${{ env.REBASE_BRANCH }}
- name: Wait for buildkite to start build
run: sleep 300
- name: Wait for buildkite to finish
id: wait_for_buildkite
timeout-minutes: 300
run: |
while true; do
response=$(curl -s -f -H "Authorization: Bearer ${{ secrets.BUILDKITE_TOKEN }}" "https://api.buildkite.com/v2/organizations/jito/pipelines/jito-solana/builds?commit=${{ env.REBASE_SHA }}")
if [ $? -ne 0 ]; then
echo "Curl request failed."
exit 1
fi
state=$(echo $response | jq --exit-status -r '.[0].state')
echo "Current build state: $state"
# Check if the state is one of the finished states
case $state in
"passed"|"finished")
echo "Build finished successfully."
exit 0
;;
"canceled"|"canceling"|"not_run")
# ignoring "failing"|"failed" because flaky CI, can restart and hope it finishes or times out
echo "Build failed or was cancelled."
exit 2
;;
esac
sleep 30
done
- name: Send failure update
uses: slackapi/[email protected]
if: failure() && steps.wait_for_buildkite.outcome == 'failure'
with:
payload: |
{
"text": "Nightly rebase on branch ${{ matrix.branch }}\nStatus: CI failed\nBranch: ${{ env.REBASE_BRANCH}}\nBuild: https://buildkite.com/jito/jito-solana/builds?commit=${{ env.REBASE_SHA }}"
}
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
# check to see if different branch since CI build can take awhile and these steps are not atomic
- name: Fetch the latest remote changes
run: git fetch origin ${{ matrix.branch }}
- name: Check if origin HEAD has changed from the beginning of the workflow
run: |
LOCAL_SHA=$(git rev-parse ${{ matrix.branch }})
ORIGIN_SHA=$(git rev-parse origin/${{ matrix.branch }})
if [ "$ORIGIN_SHA" != "$LOCAL_SHA" ]; then
echo "The remote HEAD of ${{ matrix.branch }} does not match the local HEAD of ${{ matrix.branch }} at the beginning of CI."
echo "origin sha: $ORIGIN_SHA"
echo "local sha: $LOCAL_SHA"
exit 1
else
echo "The remote HEAD matches the local REBASE_SHA at the beginning of CI. Proceeding."
fi
- name: Reset ${{ matrix.branch }} to ${{ env.REBASE_BRANCH }}
run: |
git checkout ${{ matrix.branch }}
git reset --hard ${{ env.REBASE_BRANCH }}
- name: Push rebased %{{ matrix.branch }}
uses: ad-m/github-push-action@master
with:
github_token: ${{ secrets.JITO_SOLANA_RELEASE_TOKEN }}
branch: ${{ matrix.branch }}
force: true
- name: Send success update
uses: slackapi/[email protected]
with:
payload: |
{
"text": "Nightly rebase on branch ${{ matrix.branch }}\nStatus: CI success, rebased, and pushed\nBranch: ${{ env.REBASE_BRANCH}}\nBuild: https://buildkite.com/jito/jito-solana/builds?commit=${{ env.REBASE_SHA }}"
}
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}