77 lines
2.3 KiB
Bash
77 lines
2.3 KiB
Bash
#!/usr/bin/env sh
|
|
|
|
ACCESS_TOKEN=""
|
|
CURL_FLAGS=""
|
|
GITLAB_API="${CI_API_V4_URL}"
|
|
MERGE_IF_SUCCESSFUL="true"
|
|
MR_BRANCH=""
|
|
MR_TITLE="Auto-Merge-$(date '+%Y%m%d%H%M%S')"
|
|
PROJECT_ID="${CI_PROJECT_ID}"
|
|
SECONDS_BETWEEN_POOLING=10
|
|
TARGET_BRANCH="main"
|
|
eval "${@}"
|
|
|
|
if [ "${MR_BRANCH}" = '' ]; then
|
|
echo "[ERROR] No MR branch was given."
|
|
exit 1
|
|
fi
|
|
|
|
if [ "${ACCESS_TOKEN}" = '' ]; then
|
|
echo "[ERROR] No access token was given."
|
|
exit 2
|
|
fi
|
|
|
|
if [ "${MERGE_IF_SUCCESSFUL}" = "1" ] || [ "${MERGE_IF_SUCCESSFUL}" = "true" ]; then
|
|
MERGE_IF_SUCCESSFUL="true"
|
|
else
|
|
MERGE_IF_SUCCESSFUL="false"
|
|
fi
|
|
|
|
MR_JSON=$(curl ${CURL_FLAGS} \
|
|
--request POST \
|
|
--header "PRIVATE-TOKEN: ${ACCESS_TOKEN}" \
|
|
--data-urlencode "source_branch=${MR_BRANCH}" \
|
|
--data-urlencode "target_branch=${TARGET_BRANCH}" \
|
|
--data-urlencode "title=${MR_TITLE}" \
|
|
--data-urlencode "remove_source_branch=true" \
|
|
"${GITLAB_API}/projects/${PROJECT_ID}/merge_requests"
|
|
)
|
|
CURL_EXIT_CODE=$?
|
|
|
|
if [ "${CURL_EXIT_CODE}" != "0" ]; then
|
|
echo "[ERROR] Please check the returned response for details."
|
|
echo "[INFO] CURL_EXIT_CODE=${CURL_EXIT_CODE}"
|
|
echo "[INFO] MR_JSON=${MR_JSON}"
|
|
exit ${CURL_EXIT_CODE}
|
|
fi
|
|
|
|
echo "[SUCCESS] Merge request created successfully!"
|
|
MR_URL=$(echo "${MR_JSON}" | jq '.web_url')
|
|
echo "[INFO] Merge request URL: ${MR_URL}"
|
|
|
|
if [ "${MERGE_IF_SUCCESSFUL}" = "true" ]; then
|
|
MR_ID=$(echo "${MR_JSON}" | jq '.iid')
|
|
|
|
echo "[INFO] Will merge MR ID ${MR_ID} (branch '${MR_BRANCH}' into '${TARGET_BRANCH}'), if and when the pipeline passes."
|
|
echo "[INFO] Waiting for pipeline to finish..."
|
|
while true; do
|
|
PIPELINE_STATUS=$(curl ${CURL_FLAGS} --silent --header "PRIVATE-TOKEN: ${ACCESS_TOKEN}" \
|
|
"${GITLAB_API}/projects/${PROJECT_ID}/merge_requests/${MR_ID}/pipelines" | jq '.[0].status')
|
|
|
|
if [ "${PIPELINE_STATUS}" = "\"success\"" ]; then
|
|
echo "[INFO] Pipeline succeeded!"
|
|
# Merge the merge request
|
|
curl ${CURL_FLAGS} --request PUT --header "PRIVATE-TOKEN: ${ACCESS_TOKEN}" \
|
|
"${GITLAB_API}/projects/${PROJECT_ID}/merge_requests/${MR_ID}/merge"
|
|
echo "[SUCCESS] Merge request merged successfully!"
|
|
exit 0
|
|
elif [ "${PIPELINE_STATUS}" = "\"failed\"" ]; then
|
|
echo "[ERROR] Pipeline failed!"
|
|
exit 1
|
|
else
|
|
echo "[INFO] Pipeline still running..."
|
|
sleep ${SECONDS_BETWEEN_POOLING}
|
|
fi
|
|
done
|
|
fi
|