From c155775425daec692d9462ba889185024cd67c52 Mon Sep 17 00:00:00 2001 From: icex2 Date: Sun, 19 Jun 2022 13:16:57 +0200 Subject: [PATCH] Update build and release pipeline, match with btools Automatic uploads and releasing when new versions are tagged --- .gitlab-ci.yml | 147 +++++++++++++++++++++------ Module.mk | 4 +- scripts/ci/create-release-message.sh | 28 +++++ 3 files changed, 145 insertions(+), 34 deletions(-) create mode 100644 scripts/ci/create-release-message.sh diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e3664f5..980cc15 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,51 +1,134 @@ -image: debian +# +# This pipeline requires packages to be switched on under the repository settings. Otherwise, you will 403s when +# uploading to the package repo is triggered. +# +# Variables to setup in GitLab CI/CD settings of the project +# +# The variables with BASE64 postfixes need to contain the base64 encoded data. Otherwise, masking +# in GitLab won't work due to not matching their pre-defined regex +# +# CI_PIGSTALL_DATA_PREFIX_BASE64 +# CI_PIGSTALL_LINK_BASE64 +# CI_PIGSTALL_PHP_SESSION_ID +# CI_PIGSTALL_SESSION_BASE64 +# +# CI_TOOLS_UPLOAD_KEY +# CI_TOOLS_UPLOAD_URL +# CI_TOOLS_URL + +image: docker:stable + +variables: + DOCKER_TLS_CERTDIR: "/certs" + DIST_PACKAGE_RELATIVE_PATH: "build/bemanitools-supplement.zip" + PACKAGE_REGISTRY_URL: "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/bemanitools-supplement" + +services: + - docker:19.03.8-dind stages: - build + - upload - release - - releasetag build: stage: build + only: + refs: + - tags before_script: - - apt-get update && apt-get -qq install git make zip > /dev/null + - apk update && apk add make zip > /dev/null script: - make artifacts: - name: "$CI_COMMIT_SHORT_SHA-$CI_JOB_NAME" paths: - build + expire_in: 1 week -release: - stage: release - variables: - GIT_STRATEGY: none +upload-package-registry: + stage: upload + image: curlimages/curl:latest + only: + refs: + - tags dependencies: - build - before_script: - - apt-get update && apt-get -qq install zip > /dev/null - script: - - mv build/bemanitools-supplements.zip ./bemanitools-supplements.zip - - find . -mindepth 1 ! -regex '^./bemanitools-supplements.zip' -delete - - unzip bemanitools-supplements.zip - - rm bemanitools-supplements.zip - artifacts: - name: "$CI_COMMIT_SHORT_SHA-$CI_JOB_NAME" - paths: - - ./* - -releasetag: - stage: releasetag - dependencies: [] - before_script: - - apt-get update && apt-get -qq install curl > /dev/null script: - | - curl --silent --show-error \ - --data "{\"tag_name\": \"${CI_COMMIT_TAG}\", \"name\": \"${CI_PROJECT_NAME}-${CI_COMMIT_TAG}\", \"description\": \"${CI_COMMIT_TAG_MESSAGE:-No release notes.}\"}" \ - --header "Content-Type: application/json" \ - --header "Private-Token: ${CI_PRIVATE_TOKEN}" \ - --request POST \ - "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/releases" + if [ "${CI_COMMIT_TAG}" ]; then + version="${CI_COMMIT_TAG}" + else + version="${CI_COMMIT_SHORT_SHA}" + fi + - | + curl \ + --silent \ + --fail \ + --show-error \ + --header "JOB-TOKEN: ${CI_JOB_TOKEN}" \ + --upload-file "${DIST_PACKAGE_RELATIVE_PATH}" \ + $PACKAGE_REGISTRY_URL/${version}/bemanitools-supplement.zip + +upload-tools-page: + stage: upload + image: curlimages/curl:latest only: - - tags + refs: + - tags + dependencies: + - build + script: + - | + curl \ + --silent \ + --fail \ + --show-error \ + --connect-timeout 5 \ + --max-time 10 \ + --retry 5 \ + -F "key=${CI_TOOLS_UPLOAD_KEY}" \ + -F "filename=${CI_PROJECT_NAME}-v${CI_COMMIT_TAG}.zip" \ + -F "file=@${DIST_PACKAGE_RELATIVE_PATH}" \ + ${CI_TOOLS_UPLOAD_URL} + +release-gitlab: + stage: release + image: registry.gitlab.com/gitlab-org/release-cli:v0.8.0 + only: + refs: + - tags + script: + - version="$CI_COMMIT_TAG" + - release_message="$(scripts/ci/create-release-message.sh "${version}" < CHANGELOG.md)" + - | + release-cli create \ + --name "bemanitools-supplement ${version}" \ + --description="${release_message}" \ + --tag-name ${version} \ + --assets-link "{\"name\":\"Distribution binaries\",\"url\":\"${PACKAGE_REGISTRY_URL}/${version}/bemanitools-supplement.zip\"}" + +release-pigstall: + stage: release + image: curlimages/curl:latest + only: + refs: + - tags + script: + - version="${CI_COMMIT_TAG}" + - changelog_excerpt="$(scripts/ci/create-release-message.sh "${version}" < CHANGELOG.md)" + - release_message="$(printf "bemanitools-supplement ${version} released\n${CI_TOOLS_URL}/bemanitools-supplement-v${version}.zip\n${changelog_excerpt}")" + - session="$(echo "$CI_PIGSTALL_SESSION_BASE64" | base64 -d)" + - data_prefix="$(echo "$CI_PIGSTALL_DATA_PREFIX_BASE64" | base64 -d)" + - link="$(echo "$CI_PIGSTALL_LINK_BASE64" | base64 -d)" + - | + curl \ + --silent \ + --fail \ + --connect-timeout 5 \ + --max-time 10 \ + --retry 5 \ + --show-error \ + -H 'Content-Type: application/x-www-form-urlencoded' \ + -H "Cookie: PHPSESSID=$CI_PIGSTALL_PHP_SESSION_ID; session=${session}" \ + --data-raw "${data_prefix}&body=${release_message}" \ + "${link}" diff --git a/Module.mk b/Module.mk index 9905bca..7fc3322 100644 --- a/Module.mk +++ b/Module.mk @@ -19,7 +19,7 @@ $(zipdir)/misc.zip: \ $(V)echo ... $@ $(V)zip -r $@ $^ -$(BUILDDIR)/bemanitools-supplements.zip: \ +$(BUILDDIR)/bemanitools-supplement.zip: \ $(zipdir)/iidx.zip \ $(zipdir)/misc.zip \ README.md \ @@ -28,4 +28,4 @@ $(BUILDDIR)/bemanitools-supplements.zip: \ $(V)echo ... $@ $(V)zip -j $@ $^ -all: $(BUILDDIR)/bemanitools-supplements.zip +all: $(BUILDDIR)/bemanitools-supplement.zip diff --git a/scripts/ci/create-release-message.sh b/scripts/ci/create-release-message.sh new file mode 100644 index 0000000..bcd6c76 --- /dev/null +++ b/scripts/ci/create-release-message.sh @@ -0,0 +1,28 @@ +#!/bin/sh + +VERSION="$1" + +section_active="" +changelog_excerpt="" + +while IFS= read -r line; do + if [ "$section_active" ]; then + if [[ "$(echo "$line" | grep '^#')" ]]; then + section_active="" + else + changelog_excerpt="$(printf "%s\n%s" "$changelog_excerpt" "$line")" + fi + else + if [ "$line" = "## $VERSION" ]; then + section_active="1" + fi + fi +done + +if [ "$changelog_excerpt" ]; then + printf "%s" "$changelog_excerpt" + exit 0 +else + >&2 echo "Could not find version in changelog: $VERSION" + exit 1 +fi \ No newline at end of file