-
Notifications
You must be signed in to change notification settings - Fork 33
222 lines (217 loc) · 8.48 KB
/
gitlab_ci.yml
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
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
---
name: Mirror to Gitlab to trigger CI
on:
push:
pull_request_target:
types: [opened, synchronize, reopened, labeled]
schedule:
- cron: '2 5 * * 1'
jobs:
check_permission:
runs-on: ubuntu-latest
if: >-
(github.repository_owner == 'Parallel-in-Time') &&
((github.event_name == 'push') ||
(github.event_name == 'schedule') ||
((github.event_name == 'pull_request_target') &&
(contains(github.event.pull_request.labels.*.name, 'gitlab-mirror'))
)
)
steps:
- name: Query permissions of triggering actor
id: query_permission_triggering_actor
if: github.event_name == 'pull_request_target'
uses: actions-cool/check-user-permission@v2
with:
username: ${{ github.triggering_actor }}
require: 'write'
token: ${{ secrets.GITHUB_TOKEN }}
- name: Interpret the queried result
if: github.event_name == 'pull_request_target'
run: |
echo "Current permission level is ${{ steps.query_permission_triggering_actor.outputs.user-permission }}"
echo "Job originally triggered by ${{ github.actor }}"
echo "Checking permission returned ${{ steps.query_permission_triggering_actor.outputs.require-result }}"
if ${{ steps.query_permission_triggering_actor.outputs.require-result }}
then
echo 'Permissions granted'
exit 0
else
echo 'Not enough permissions. Please ask a member of Parallel-in-Time to rerun the job.'
exit 1
fi
- name: Pass if workflow from push or schedule
if: >-
(github.event_name == 'push') ||
(github.event_name == 'schedule')
run: exit 0
# - name: Fail for other triggers
# if: >-
# (github.event_name != 'push') &&
# (github.event_name != 'schedule') &&
# (github.event_name != 'pull_request_target')
# run: exit 1
mirror_to_gitlab:
runs-on: ubuntu-latest
if: >-
(github.repository_owner == 'Parallel-in-Time') &&
((github.event_name == 'push') ||
(github.event_name == 'schedule') ||
((github.event_name == 'pull_request_target') &&
(contains(github.event.pull_request.labels.*.name, 'gitlab-mirror'))
)
)
needs:
- check_permission
steps:
- name: set proper sha
run: |
echo "${{ github.event_name }}"
if [ "${{ github.event_name }}" == 'push' ] || [ "${{ github.event_name }}" == 'schedule' ]
then
echo "USED_SHA=${{ github.sha }}" >> "$GITHUB_ENV"
fi
if [ "${{ github.event_name }}" == 'pull_request_target' ]
then
echo "USED_SHA=${{ github.event.pull_request.head.sha }}" >> "$GITHUB_ENV"
fi
- name: Checkout
uses: actions/checkout@v4
with:
ref: "${{ env.USED_SHA }}"
persist-credentials: false
- name: check if merge is possible (merge is used for testing)
if: github.event_name == 'pull_request_target'
run: |
if $(git rev-parse --is-shallow-repository); then
git fetch --unshallow
else
git fetch
fi
echo "Checkout of ${{ github.base_ref }}"
git checkout "${{ github.base_ref }}"
echo "Git pull"
git pull
MIRROR_BRANCH="TEMPORARY_MERGE_PR_${{ github.event.number }}"
echo MIRROR_BRANCH="$MIRROR_BRANCH" >> $GITHUB_ENV
echo "Create new branch $MIRROR_BRANCH and check it out"
git checkout -b "$MIRROR_BRANCH"
echo "Setting git committer info, so that merge-commit can be created"
git config user.email "[email protected]"
git config user.name "Sync bot"
echo "Merge the two parts of the Merge-Request to test the resulting version"
git merge "${{ github.event.pull_request.head.sha }}"
- name: Mirror and wait for Gitlab-CI
uses: jakob-fritz/[email protected]
env:
MODE: 'all' # Either 'mirror', 'get_status', 'get_artifact', or 'all'
GITLAB_TOKEN: ${{ secrets.GITLAB_SECRET }}
FORCE_PUSH: "true"
GITLAB_HOSTNAME: "gitlab.jsc.fz-juelich.de"
GITLAB_PROJECT_ID: "6029"
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
MIRROR_BRANCH: ${{ env.MIRROR_BRANCH }}
- name: Unzip downloaded artifacts
run: |
pwd
ls -lah
cd artifacts
find . -name "*.zip" -type f -exec unzip -o {} \;
ls -lah
rm *.zip
cd ..
ls -lah
- name: Uploading artifacts
uses: actions/upload-artifact@v4
with:
name: Gitlab-Action_artifacts
path: |
./artifacts/*
get_artifacts_from_other_workflow:
runs-on: ubuntu-latest
needs:
- mirror_to_gitlab
steps:
- name: Download artifacts from this workflow
uses: actions/download-artifact@v4
with:
merge-multiple: true
path: ./github_ci_artifacts
- name: Set env-var
id: get_id
uses: actions/github-script@v7
env:
workflow_filename: 'ci_pipeline.yml'
with:
script: |
if (context.eventName == "pull_request_target") {
var used_sha = context.payload.pull_request.head.sha;
var used_event = "pull_request";
} else {
var used_sha = context.sha;
var used_event = context.eventName;
}
const result = await github.request('GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs', {
owner: context.repo.owner,
repo: context.repo.repo,
workflow_id: process.env.workflow_filename,
headers: {
'X-GitHub-Api-Version': '2022-11-28',
'accept': 'application/vnd.github+json'
},
head_sha: used_sha,
event: used_event
})
console.log("SHA of commit " + used_sha);
console.log("Found runs of workflow: " + result.data.total_count);
if (result.data.total_count == 1) {
console.log("Found workflow has id: " + result.data.workflow_runs[0].id);
return result.data.workflow_runs[0].id
} else {
console.log("Logging all found workflow ids:");
for (var i = 0; i < result.data.workflow_runs.length; i++) {
console.log(result.data.workflow_runs[i].id);
}
console.log("Returned workflow id is: " + result.data.workflow_runs[0].id);
return result.data.workflow_runs[0].id
}
- name: Wait for other workflow to finish
env:
RUN_ID: ${{ steps.get_id.outputs.result }}
POLL_TIMEOUT: 10
run: |
ci_conclusion="pending"
echo "Querying status of workflow $RUN_ID for repo $GITHUB_REPOSITORY"
until [ "$ci_conclusion" != "pending" ] && [ "$ci_conclusion" != "in_progress" ] && [ "$ci_conclusion" != "null" ]
do
# Wait some seconds
sleep "$POLL_TIMEOUT"
# Get the current state of the pipeline and the url of the website
run_reply=$(curl --header "'X-GitHub-Api-Version': '2022-11-28', 'accept': 'application/vnd.github+json'" --silent "https://api.github.com/repos/$GITHUB_REPOSITORY/actions/runs/$RUN_ID")
ci_conclusion=$(jq -n "$run_reply" | jq -r .conclusion)
echo "Current pipeline status: ${ci_conclusion}"
http_status=$(jq -n "$run_reply" | jq -r .status)
if [ "$http_status" != 200 ] && [[ "$http_status" =~ ^[0-9]+$ ]]; then
echo "Request returned status: ${http_status}"
exit 1
fi
done
# Set exit code for success or failure (everything non-success)
if [ "$ci_conclusion" = "success" ]; then
exit 0
else
exit 1
fi
- name: Download artifacts from other workflow
uses: actions/download-artifact@v4
with:
merge-multiple: true
run-id: ${{ steps.get_id.outputs.result }}
github-token: ${{ secrets.ACTION_READ_TOKEN }}
path: ./github_ci_artifacts
- name: Uploading artifacts
uses: actions/upload-artifact@v4
with:
name: Github_CI_artifacts
path: |
./github_ci_artifacts/*