Skip to content

Commit 9cdab00

Browse files
fix: do not deregister GitLab tokens which are still in use (#1102)
## Description So far we haven't tracked the usage of the GitLab Runner token. In case the Runner is stopped and a new one is spawned, race conditions might occur as explained in #1062. In consequence the new Runner used a token deleted by the old Runner. This leads into downtimes as the token is no longer valid and can't be used. This PR converts the token into a JSON format and ensures that tokens which are still in use, are not deregistered. Fixes #1062 ## Migrations needed In case you want to rollback to a previous version you have to convert the SSM parameter containing the token and usage counter in JSON format back to a plain token string. ## Verification - [x] script changes were tested locally - [x] Test Runner was started to ensure that the token conversion works --------- Co-authored-by: long-wan-ep <[email protected]>
1 parent aa93e76 commit 9cdab00

File tree

1 file changed

+51
-6
lines changed

1 file changed

+51
-6
lines changed

template/gitlab-runner.tftpl

+51-6
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,26 @@ sed -i.bak s/__PARENT_TAG__/$PARENT_TAG/g /etc/gitlab-runner/config.toml
1818
${pre_install_certificates}
1919

2020
# fetch Runner token from SSM and validate it
21-
token=$(aws ssm get-parameters --names "${secure_parameter_store_runner_token_key}" --with-decryption --region "${secure_parameter_store_region}" | jq -r ".Parameters | .[0] | .Value")
21+
json_token=$(aws ssm get-parameters --names "${secure_parameter_store_runner_token_key}" --with-decryption --region "${secure_parameter_store_region}" | jq -cr ".Parameters[0].Value" | tr -d '\r\n')
22+
23+
# TODO 2024-03-22: this conversion can be removed as soon as all callers switched to version 7.4.1+
24+
if [[ ! "$json_token" =~ ^\{.* ]]; then
25+
# plain text token -> convert to JSON and store
26+
json_token="{\"token\": \"$json_token\", \"usage_counter\": 1}"
27+
28+
aws ssm put-parameter --overwrite --type SecureString --name "${secure_parameter_store_runner_token_key}" --region "${secure_parameter_store_region}" --value="$json_token" 2>&1
29+
30+
echo "GitLab Runner token converted into new JSON format"
31+
else
32+
# increment the usage_counter as we are using the token now
33+
usage_counter=$(echo $json_token | jq -r .usage_counter)
34+
usage_counter=$(($usage_counter+1))
35+
json_token=$(echo $json_token | jq -c ".usage_counter = $usage_counter")
36+
37+
aws ssm put-parameter --overwrite --type SecureString --name "${secure_parameter_store_runner_token_key}" --region "${secure_parameter_store_region}" --value="$json_token" 2>&1
38+
39+
token=$(echo $json_token | jq -r '.token')
40+
fi
2241

2342
valid_token=true
2443
if [[ "$token" != "null" ]]
@@ -89,7 +108,9 @@ then
89108
--form "access_level=${gitlab_runner_access_level}" \
90109
| jq -r .token)
91110
fi
92-
aws ssm put-parameter --overwrite --type SecureString --name "${secure_parameter_store_runner_token_key}" --value="$token" --region "${secure_parameter_store_region}"
111+
112+
aws ssm put-parameter --overwrite --type SecureString --name "${secure_parameter_store_runner_token_key}" \
113+
--value="{\"token\": \"$token\", \"usage_counter\": 1}" --region "${secure_parameter_store_region}"
93114
fi
94115

95116
sed -i.bak s/__REPLACED_BY_USER_DATA__/$token/g /etc/gitlab-runner/config.toml
@@ -181,11 +202,35 @@ WantedBy=multi-user.target
181202

182203
EOF
183204

184-
cat <<EOF > /opt/remove_gitlab_registration.sh
205+
cat <<'EOF' > /opt/remove_gitlab_registration.sh
185206
#!/bin/bash
186-
echo "Removing Gitlab Runner ..."
187-
aws ssm put-parameter --overwrite --type SecureString --name "${secure_parameter_store_runner_token_key}" --region "${secure_parameter_store_region}" --value="null" 2>&1
188-
curl -sS ${curl_cacert} --request DELETE "${runners_gitlab_url}/api/v4/runners" --form "token=$token" 2>&1
207+
json_token=$(aws ssm get-parameters --names "${secure_parameter_store_runner_token_key}" --with-decryption --region "${secure_parameter_store_region}" | jq -r ".Parameters[0].Value" | tr -d '\r\n')
208+
deregister_runner=true
209+
210+
usage_counter=$(echo $json_token | jq -r .usage_counter)
211+
212+
# ensure that the token is not in use by another Runner
213+
if [[ $usage_counter -gt 1 ]]; then
214+
deregister_runner=false
215+
token="not needed"
216+
else
217+
token=$(echo $json_token | jq -r .token)
218+
fi
219+
220+
if [[ $deregister_runner == "true" ]]; then
221+
echo "Removing Gitlab Runner ..."
222+
223+
aws ssm put-parameter --overwrite --type SecureString --name "${secure_parameter_store_runner_token_key}" --region "${secure_parameter_store_region}" --value="{\"token\": \"null\", \"usage_counter\": 0}" 2>&1
224+
curl -sS ${curl_cacert} --request DELETE "${runners_gitlab_url}/api/v4/runners" --form "token=$token" 2>&1
225+
else
226+
usage_counter=$(echo $json_token | jq -r .usage_counter)
227+
usage_counter=$(($usage_counter-1))
228+
json_token=$(echo $json_token | jq -c ".usage_counter = $usage_counter")
229+
230+
aws ssm put-parameter --overwrite --type SecureString --name "${secure_parameter_store_runner_token_key}" --region "${secure_parameter_store_region}" --value="$json_token" 2>&1
231+
232+
echo "Token still in use. GitLab Runner not removed from GitLab."
233+
fi
189234

190235
EOF
191236

0 commit comments

Comments
 (0)