-
Notifications
You must be signed in to change notification settings - Fork 5
/
deploy-github-functions.sh
258 lines (239 loc) · 7.76 KB
/
deploy-github-functions.sh
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
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
#!/usr/bin/env bash
set -e
# Creates a Deploy in Github
#
# Input:
# - 1. Name of the environment to deploy at.
# - eg: $ gh_deploy_create staging
#
# Required environment variables:
# - GITHUB_TOKEN - Github user token with deploy rights.
# - GITHUB_REPOSITORY - Set by default by Github. Formatted as "org/repo".
# - BRANCH - Branch to be deployed.
# - GITHUB_REF - Set by default by Github.
#
# Required system tools:
# - getopt
# - curl
# - jq
# - awk
gh_deploy_create() {
environment_name=$1
if [ -z "$GITHUB_TOKEN" ]; then
echo "GITHUB_TOKEN not set"
exit 1
fi
deploy_url=$(curl -X POST \
-H "Authorization: token $GITHUB_TOKEN" \
-H "Accept: application/vnd.github.ant-man-preview+json" \
https://api.github.com/repos/$GITHUB_REPOSITORY/deployments \
-d '{
"ref": "'"$BRANCH"'",
"description": "'"$environment_name"' deploy created",
"environment": "'"$environment_name"'",
"auto_merge": false,
"required_contexts": []
}' | jq -r '.url') # Gets 'url' field from the response
if [[ "$deploy_url" == "null" ]]; then
echo "Failed to create Github deployment"
exit 1
else
# Need to be shared between steps
echo "DEPLOY_STATUSES_URL=$deploy_url/statuses" >> $GITHUB_ENV
echo "Github deployment created: $deploy_url"
exit 0
fi
}
# Sets Github deploy status as "in_progress"
#
# Input:
# - 1. Name of the deployment environment to update the status at.
# - 2. Url where the deployment progress can be tracked.
# - eg: $ gh_deploy_initiate staging https://github.com/user/repo/pull/15/checks
#
# Required environment variables:
# - GITHUB_TOKEN - Github user token with deploy rights.
# - DEPLOY_STATUSES_URL - URL for Github deployment statuses. Set up by "gh_deploy_create".
#
# Required system tools:
# - curl
gh_deploy_initiate() {
environment_name=$1
log_url=$2
if [ -z "$GITHUB_TOKEN" ]; then
echo "GITHUB_TOKEN not set"
exit 1
fi
curl -X POST \
-H "Authorization: token $GITHUB_TOKEN" \
-H "Accept: application/vnd.github.ant-man-preview+json" \
-H "Accept: application/vnd.github.flash-preview+json" \
$DEPLOY_STATUSES_URL \
-d '{
"environment": "'"$environment_name"'",
"state": "in_progress",
"description": "'"$environment_name"' deployment initiated",
"log_url": "'"$log_url"'"
}'
}
# Sets Github deploy status as "success"
#
# Input:
# - 1. Name of the deployment environment to update the status at.
# - 2. Url where the deployment progress can be tracked.
# - 3. Environment url where the deployed changes can be viewed.
# - eg: $ gh_deploy_success staging https://github.com/user/repo/pull/15/checks https://opss-service.digital/
#
# Required environment variables:
# - GITHUB_TOKEN - Github user token with deploy rights.
# - DEPLOY_STATUSES_URL - URL for Github deployment statuses. Set by "gh_deploy_create".
#
# Required system tools:
# - curl
gh_deploy_success() {
environment_name=$1
log_url=$2
environment_url=$3
if [ -z "$GITHUB_TOKEN" ]; then
echo "GITHUB_TOKEN not set"
exit 1
fi
curl -X POST \
-H "Authorization: token $GITHUB_TOKEN" \
-H "Accept: application/vnd.github.ant-man-preview+json" \
$DEPLOY_STATUSES_URL \
-d '{
"environment": "'"$environment_name"'",
"state": "success",
"description": "'"$environment_name"' deployment succeeded",
"environment_url": "'"$environment_url"'",
"log_url": "'"$log_url"'"
}'
}
# Sets Github deploy status as "failure"
#
# Input:
# - 1. Name of the deployment environment to update the status at.
# - 2. Url where the deployment progress can be tracked.
# - eg: $ gh_deploy_failure staging https://github.com/user/repo/pull/15/checks
#
# Required environment variables:
# - GITHUB_TOKEN - Github user token with deploy rights.
# - DEPLOY_STATUSES_URL - URL for Github deployment statuses. Set by "gh_deploy_create".
#
# Required system tools:
# - curl
gh_deploy_failure() {
environment_name=$1
log_url=$2
if [ -z "$GITHUB_TOKEN" ]; then
echo "GITHUB_TOKEN not set"
exit 1
fi
curl -X POST \
-H "Authorization: token $GITHUB_TOKEN" \
-H "Accept: application/vnd.github.ant-man-preview+json" \
$DEPLOY_STATUSES_URL \
-d '{
"environment": "'"$environment_name"'",
"state": "failure",
"description": "'"$environment_name"' deployment failed",
"log_url": "'"$log_url"'"
}'
}
# Sets Github deploy status as "inactive"
#
# Input:
# - 1. ID of the deploy to have the status updated.
# - eg: $ gh_deploy_deactivate staging
#
# Required environment variables:
# - GITHUB_TOKEN - Github user token with deploy rights.
# - DEPLOY_STATUSES_URL - URL for Github deploy statuses. Set by "gh_deploy_create".
#
# Required system tools:
# - curl
#
gh_deploy_deactivate() {
deploy_id=$1
if [ -z "$GITHUB_TOKEN" ]; then
echo "GITHUB_TOKEN not set"
exit 1
fi
curl -X POST \
-H "Authorization: token $GITHUB_TOKEN" \
-H "Accept: application/vnd.github.ant-man-preview+json" \
https://api.github.com/repos/${GITHUB_REPOSITORY}/deployments/${deploy_id}/statuses \
-d '{ "state": "inactive" }'
}
# Gets list of Github repository deployments.
#
# Input:
# - 1. Environment (optional).
# - eg: $ gh_deploy_list
# - eg: $ gh_deploy_list review-app-156
#
# Required environment variables:
# - GITHUB_REPOSITORY - Set by default by Github. Formatted as "org/repo".
#
# Required system tools:
# - curl
#
gh_deploy_list() {
environment=$1
url="https://api.github.com/repos/${GITHUB_REPOSITORY}/deployments"
# Filters by environment if provided.
if [ -n $environment ]; then
url="${url}?environment=${environment}"
fi
curl -X GET $url
}
# Deactivates Dangling deploys
#
# This function checks all the review app active deploys and deactivates them if
# the branch associated to the deploy has no open PRs.
#
# Input:
# 1. Environment. Deactivates dangling deploys only for the given environment.
# - eg: $ gh_deactivate_dangling
# - eg: $ gh_deactivate_dangling review-app-156
#
# Required environment variables:
# - GITHUB_REPOSITORY - Set by default by Github. Formatted as "org/repo".
#
# Required system tools:
# - curl
# - jq
#
gh_deploy_deactivate_dangling() {
environment=$1
if [ -n $environment ]; then
deploy_list_command="gh_deploy_list $environment"
else
deploy_list_command="gh_deploy_list"
fi
# Iterates over all the deploys and gets their id, environment and references.
# Format: "id@environment@reference".
for deploy in $(eval $deploy_list_command | jq -r '.[] | (.id|tostring) + "@" + .environment + "@" + .ref'); do
# Parses id, environment and reference into separate variables.
# '@' is used as separator for the splitting.
IFS='@' read deploy_id deploy_environment deploy_ref <<< $deploy
# We only want to deactivate Review Apps.
if [[ $deploy_environment != "staging" && $deploy_environment != "production" ]]; then
# Extracts Organization name from "org/repo".
IFS='/' read -r org repo <<< $GITHUB_REPOSITORY
# Number of open Pull Requests belonging to the branch.
# We assume "deploy_ref" is a branch as our GH deploys use branch as ref.
open_prs=$(curl "https://api.github.com/repos/${GITHUB_REPOSITORY}/pulls?state=open&head=${org}:${deploy_ref}" | jq '. | length')
# If there are no open PRs from the branch we can safely deactivate this branch deploys.
if [[ $open_prs -eq 0 ]]; then
# Gets most recent status for the deploy.
deploy_status=$(curl https://api.github.com/repos/${GITHUB_REPOSITORY}/deployments/$deploy_id/statuses | jq -r '.[0].state')
if [[ $deploy_status != "inactive" ]]; then
echo "Deactivating $deploy_environment deployment $deploy_id for branch $deploy_ref"
gh_deploy_deactivate $deploy_id
fi
fi
fi
done
}