#!/bin/bash function gitlab() { EXPECTED=$1 METHOD=$2 REQUEST=$3 shift 3 echo " sending request ..." output="$(curl --write-out "\nHTTP-Code:%{http_code}" -X "$METHOD" -s -H "Private-Token: ${GITLAB_PRIVATE_TOKEN}" "${GITLAB_URL}"/api/v4/"$REQUEST" "$@")" echo " done" result="$(echo "$output" | grep "{")" code="$(echo "$output" | grep -m 1 "HTTP-Code:" | cut -d: -f2)" if [[ $code -eq $EXPECTED ]]; then return fi echo "$METHOD request to $REQUEST did not succeed! Responds with code $code instead of $EXPECTED" exit 99 } function isNumeric() { re='^[0-9]+$' if [[ $1 =~ $re ]]; then return 0 fi return 1 } function parseUrl() { # extract the protocol proto="$(echo "$1" | grep :// | sed -e's,^\(.*://\).*,\1,g')" # remove the protocol url="${1/$proto/}" # extract the user (if any) user="$(echo "$url" | grep @ | cut -d@ -f1)" # extract the host and port hostport="$(echo "${url/$user@/}" | cut -d/ -f1)" # by request host without port # shellcheck disable=SC2001 host="$(echo "$hostport" | sed -e 's,:.*,,g')" # by request - try to extract the port port="$(echo "$hostport" | sed -e 's,^.*:,:,g' -e 's,.*:\([0-9]*\).*,\1,g' -e 's,[^0-9],,g')" # extract the path (if any) path="$(echo "$url" | sed -e 's,:,/,g' | grep / | cut -d/ -f2-)" } SOURCEBRANCH=$(git rev-parse --abbrev-ref HEAD) if [[ "$SOURCEBRANCH" == "main" ]]; then echo "Main branch can not be merged." exit 1 elif [[ "$SOURCEBRANCH" == "develop" ]]; then TARGETBRANCH=main else TARGETBRANCH=develop fi if [[ "x${GITLAB_URL}" == "x" ]]; then echo "Missing GITLAB_URL environment variable, should be set to e.g. https://gitlab.lakedrops.com" exit 2 fi if [[ "x${GITLAB_PRIVATE_TOKEN}" == "x" ]]; then echo "Missing GITLAB_PRIVATE_TOKEN environment variable" exit 3 fi parseUrl "$GITLAB_URL" host1=$host parseUrl "$(git config remote.origin.url)" host2=$host if [[ "$host1" != "$host2" ]]; then echo "This repository doesn't match the provided GitLab instance" exit 4 fi echo "Find project ID from remote URL ..." # shellcheck disable=SC2001 path="$(echo "$path" | sed -e 's,\..*,,g')" gitlab 200 GET projects?search="$path" PRJID=$(echo "$result" | jq -r .[0]."id") if [[ $(isNumeric "$PRJID") -eq 1 ]]; then echo "Can not find project ID" exit 5 fi echo "Create merge request ..." # Create MR gitlab 201 POST projects/"$PRJID"/merge_requests --data "source_branch=$SOURCEBRANCH" --data "target_branch=$TARGETBRANCH" --data "title=Merging $SOURCEBRANCH into $TARGETBRANCH" MRID=$(echo "$result" | jq -r ."iid") if [[ $(isNumeric "$MRID") -eq 1 ]]; then echo "Can not create merge request" exit 6 fi echo "Created MR at $(echo "$result" | jq -r ."web_url")" echo "Merge ..." # Merge MR gitlab 200 PUT projects/"$PRJID"/merge_requests/"$MRID"/merge --data "should_remove_source_branch=0" echo "Merged successfully!"