From 32f9a249c3af679d3842a15e4beaa2ed39c68f67 Mon Sep 17 00:00:00 2001 From: Joakim Olsson Date: Fri, 4 Oct 2024 21:58:36 +0200 Subject: [PATCH] feat: initial version --- Release.gitlab-ci.yml | 168 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 168 insertions(+) create mode 100644 Release.gitlab-ci.yml diff --git a/Release.gitlab-ci.yml b/Release.gitlab-ci.yml new file mode 100644 index 0000000..17736ac --- /dev/null +++ b/Release.gitlab-ci.yml @@ -0,0 +1,168 @@ +stages: +- prepare + +preconditions_failed: + stage: .pre + image: alpine:3.19 + script: + - | + echo "To use Unbound Release, a UNBOUND_RELEASE_TOKEN environment variable needs to be defined." + echo "It needs API access to write repository files, create MRs and releases and it needs at least Developer access." + echo " " + echo "See more info here:" + echo "Personal Access Tokens: https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html" + echo "Project Access Tokens: https://docs.gitlab.com/ee/user/project/settings/project_access_tokens.html" + echo "Group Access Tokens: https://docs.gitlab.com/ee/user/group/settings/group_access_tokens.html" + - 'false' + rules: + - if: $UNBOUND_RELEASE_TOKEN == null + +changelog: + stage: .pre + image: + name: orhunp/git-cliff:latest + entrypoint: [ "" ] + variables: + GIT_STRATEGY: clone # clone entire repo instead of reusing workspace + GIT_DEPTH: 0 # avoid shallow clone to give cliff all the info it needs + script: + - 'echo "Generating changelog"' + - 'git-cliff --bump > CHANGELOG.md' + - 'echo "Bumping version"' + - 'git-cliff --bumped-version 2>/dev/null > VERSION' + artifacts: + paths: + - CHANGELOG.md + - VERSION + rules: + - if: $UNBOUND_RELEASE_TOKEN == null + when: never + - if: '$CI_COMMIT_TITLE =~ /^chore\(release\): prepare for .*$/' + when: never + - if: $CI_DEFAULT_BRANCH == $CI_COMMIT_BRANCH + +handle_mr: + stage: .pre + image: alpine:latest + needs: + - changelog + before_script: + - 'apk add --no-cache jq curl' + script: + - | + echo "Fetching existing release MRs" + MRS=$(curl -s \ + -H "Authorization: Bearer ${UNBOUND_RELEASE_TOKEN}" \ + "https://gitlab.com/api/v4/projects/${CI_PROJECT_ID}/merge_requests?state=opened&source_branch=next-release") + BRANCHES=$(curl -s \ + -H "Authorization: Bearer ${UNBOUND_RELEASE_TOKEN}" \ + "https://gitlab.com/api/v4/projects/${CI_PROJECT_ID}/repository/branches?regex=^next-release\$") + MR=$(echo "${MRS}" | jq ".[].iid") + BRANCH=$(echo "${BRANCHES}" | jq ".[].name") + TITLE="chore(release): prepare for $(cat VERSION)" + CONTENT="$(base64 -w0 CHANGES.md' + - 'echo "Bumping version"' + - 'git-cliff --bumped-version 2>/dev/null > VERSION' + artifacts: + paths: + - CHANGES.md + - VERSION + rules: + - if: $UNBOUND_RELEASE_TOKEN == null + when: never + - if: $CI_DEFAULT_BRANCH != $CI_COMMIT_BRANCH + when: never + - if: '$CI_COMMIT_TITLE =~ /^chore\(release\): prepare for .*$/' + +release: + stage: .pre + image: alpine:latest + needs: + - prepare_release + before_script: + - 'apk add --no-cache jq curl' + script: + - | + echo "Creating release" + NAME="$(cat VERSION)" + MESSAGE="$(cat CHANGES.md)" + BODY_TMPL='{"name":$name,"tag_name":$name,"tag_message":$name,"description":$message,"ref":$ref}' + BODY="$(jq --null-input -c \ + --arg name "${NAME}" \ + --arg message "${MESSAGE}" \ + --arg ref "${CI_DEFAULT_BRANCH}" \ + "${BODY_TMPL}")" + curl -s -X POST \ + -H "Authorization: Bearer ${UNBOUND_RELEASE_TOKEN}" \ + -H "Content-Type: application/json" \ + --data "${BODY}" \ + "https://gitlab.com/api/v4/projects/${CI_PROJECT_ID}/releases" + rules: + - if: $UNBOUND_RELEASE_TOKEN == null + when: never + - if: $CI_DEFAULT_BRANCH != $CI_COMMIT_BRANCH + when: never + - if: '$CI_COMMIT_TITLE =~ /^chore\(release\): prepare for .*$/'