feat(ci): release pipeline moved to gha, disabled release on circle ci (#4905)

This commit is contained in:
Daniel Gak Anagrov
2025-06-11 15:49:19 +02:00
committed by GitHub
parent 8d20d0620f
commit 8e15d51e9a
12 changed files with 414 additions and 12 deletions
+88
View File
@@ -0,0 +1,88 @@
#!/usr/bin/python3
import sys
from typing import Optional
from dataclasses import dataclass
@dataclass
class Version:
major: int
minor: int
patch: int
pre_release_tag: Optional[str] = None
build_number: Optional[int] = None
@property
def pre_release_priority(self) -> int:
if self.pre_release_tag == "alpha":
return 1
if self.pre_release_tag == "beta":
return 2
return 10
@staticmethod
def parse_version_slug(version_slug: str) -> "Version":
members = version_slug.split(".")
assert 3 <= len(members) <= 4
if len(members) == 3:
major, minor, patch = members
return Version(int(major), int(minor), int(patch))
else:
major, minor, patch_and_pre, build = members
patch, pre = patch_and_pre.split("-")
return Version(int(major), int(minor), int(patch), pre, int(build))
def __gt__(self, other):
if not isinstance(other, Version):
raise ValueError(f"cannot compare with {other}")
if self.major > other.major:
return True
if self.major < other.major:
return False
if self.minor > other.minor:
return True
if self.minor < other.minor:
return False
if self.patch > other.patch:
return True
if self.patch < other.patch:
return False
if self.pre_release_tag == other.pre_release_tag:
if self.build_number > other.build_number:
return True
if self.build_number < other.build_number:
return False
if self.pre_release_priority > other.pre_release_priority:
return True
if self.pre_release_priority < other.pre_release_priority:
return False
return True
if __name__ == "__main__":
print("\nStarting version compare\n")
args = sys.argv[1:]
assert len(args) == 2
current_version_slug, target_version_slug = args
print(
f"comparing current version {current_version_slug} with target {target_version_slug}"
)
current_version = Version.parse_version_slug(current_version_slug)
target_version = Version.parse_version_slug(target_version_slug)
if target_version > current_version:
print("target version is newer\n")
exit(0)
print("current version is newer\n")
exit(1)
+1 -4
View File
@@ -4,9 +4,6 @@ set -eo pipefail
# shellcheck disable=SC2034
DOCKER_IMAGE_TAG="speckle/speckle-${SPECKLE_SERVER_PACKAGE}"
# shellcheck disable=SC2034,SC2086
IMAGE_VERSION_TAG="${IMAGE_VERSION_TAG:-${GITHUB_SHA}}"
# shellcheck disable=SC2068,SC2046
LAST_RELEASE="$(git describe --always --tags $(git rev-list --tags) | grep -E '^[0-9]+\.[0-9]+\.[0-9]+$' | head -n 1)" # get the last release tag. FIXME: Fails if a commit is tagged with more than one tag: https://stackoverflow.com/questions/8089002/git-describe-with-two-tags-on-the-same-commit/56039163#56039163
@@ -14,7 +11,7 @@ LAST_RELEASE="$(git describe --always --tags $(git rev-list --tags) | grep -E '^
NEXT_RELEASE="$(echo "${LAST_RELEASE}" | awk -F. -v OFS=. '{$NF += 1 ; print}')"
# shellcheck disable=SC2034
BRANCH_NAME_TRUNCATED="$(echo "${GITHUB_HEAD_REF}" | cut -c -50 | sed 's/[^a-zA-Z0-9.-]/-/g')" # docker has a 128 character tag limit, so ensuring the branch name will be short enough
BRANCH_NAME_TRUNCATED="$(echo "${GITHUB_REF_NAME}" | cut -c -28 | sed 's/[^a-zA-Z0-9.-]/-/g')" # docker has a 128 character tag limit, so ensuring the branch name will be short enough
# shellcheck disable=SC2034
COMMIT_SHA1_TRUNCATED="$(echo "${GITHUB_SHA}" | cut -c -7)"
+2 -3
View File
@@ -5,14 +5,13 @@ SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
# shellcheck disable=SC1090,SC1091
source "${SCRIPT_DIR}/common.sh"
if [[ "${GITHUB_REF}" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
echo "${GITHUB_REF}"
exit 0
fi
if [[ "${GITHUB_HEAD_REF}" == "main" ]]; then
echo "${NEXT_RELEASE}-alpha.${GITHUB_RUN_ID}"
echo "${NEXT_RELEASE}-alpha.${GITHUB_RUN_NUMBER}"
exit 0
fi
@@ -22,5 +21,5 @@ if [[ "${BRANCH_NAME_TRUNCATED}" =~ "_" ]]; then
exit 1
fi
echo "${NEXT_RELEASE}-branch.${BRANCH_NAME_TRUNCATED}.${GITHUB_RUN_ID}-${COMMIT_SHA1_TRUNCATED}"
echo "${NEXT_RELEASE}-branch.${BRANCH_NAME_TRUNCATED}.${GITHUB_RUN_NUMBER}-${COMMIT_SHA1_TRUNCATED}"
exit 0
+15
View File
@@ -0,0 +1,15 @@
#!/usr/bin/env bash
set -eo pipefail
echo "🏷️ Preparing envs"
GIT_ROOT="$(git rev-parse --show-toplevel)"
CLOUDFLARE_PAGES_PROJECT_NAME="${CLOUDFLARE_PAGES_PROJECT_NAME:-"viewer"}"
VIEWER_SANDBOX_DIR_PATH="${VIEWER_SANDBOX_DIR_PATH:-"packages/viewer-sandbox"}"
pushd "${GIT_ROOT}/${VIEWER_SANDBOX_DIR_PATH}"
yarn wrangler pages deploy "${GIT_ROOT}/${VIEWER_SANDBOX_DIR_PATH}/dist" --project-name="${CLOUDFLARE_PAGES_PROJECT_NAME}"
popd
echo "✅ Publishing completed."
View File
@@ -0,0 +1,65 @@
#!/usr/bin/env bash
set -eo pipefail
echo "🏷️ Setting envs"
GIT_ROOT="$(git rev-parse --show-toplevel)"
GIT_HELM="$(dirname "$GIT_ROOT")/helm"
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
# shellcheck disable=SC1090,SC1091
source "${SCRIPT_DIR}/common.sh"
RELEASE_VERSION="${IMAGE_VERSION_TAG}"
HELM_STABLE_BRANCH="${HELM_STABLE_BRANCH:-"main"}"
if [[ -z "${RELEASE_VERSION}" ]]; then
echo "IMAGE_VERSION_TAG is not set: ${IMAGE_VERSION_TAG} ${RELEASE_VERSION}"
exit 1
fi
if [ ! -d "${GIT_HELM}/.git" ]; then
echo "helm repo not found at ${GIT_HELM} "
exit 1
fi
if [ ! -d "${GIT_ROOT}/.git" ]; then
echo "speckle repo not found at ${GIT_ROOT}"
exit 1
fi
echo "✏️ Editing Helm Chart version ${RELEASE_VERSION}"
yq e -i ".version = \"${RELEASE_VERSION}\"" "${GIT_ROOT}/utils/helm/speckle-server/Chart.yaml"
yq e -i ".appVersion = \"${RELEASE_VERSION}\"" "${GIT_ROOT}/utils/helm/speckle-server/Chart.yaml"
yq e -i ".docker_image_tag = \"${RELEASE_VERSION}\"" "${GIT_ROOT}/utils/helm/speckle-server/values.yaml"
if [[ "${GITHUB_REF}" == refs/tags/* || "${GITHUB_REF_NAME}" == "${HELM_STABLE_BRANCH}" ]]; then
echo "⚠️ prod release ${RELEASE_VERSION}"
# before overwriting the chart with the build version, check if the current chart version
# is not newer than the currently build one
CURRENT_VERSION="$(grep ^version "${GIT_HELM}/charts/speckle-server/Chart.yaml" | grep -o '2\..*')"
echo "️ Current version ${CURRENT_VERSION}"
.github/workflows/scripts/check_version.py "${CURRENT_VERSION}" "${RELEASE_VERSION}"
if [ $? -eq 1 ]
then
echo "The current helm chart version '${CURRENT_VERSION}' is newer than the version '${RELEASE_VERSION}' we are attempting to publish. Exiting"
exit 1
fi
rm -rf "${GIT_HELM}/charts/speckle-server"
cp -r "${GIT_ROOT}/utils/helm/speckle-server" "${GIT_HELM}/charts/speckle-server"
else
# overwrite the name of the chart
yq e -i ".name = \"speckle-server-branch-${BRANCH_NAME_TRUNCATED}\"" "${GIT_ROOT}/utils/helm/speckle-server/Chart.yaml"
rm -rf "${GIT_HELM}/charts/speckle-server-branch-${BRANCH_NAME_TRUNCATED}"
cp -r "${GIT_ROOT}/utils/helm/speckle-server" "${GIT_HELM}/charts/speckle-server-branch-${BRANCH_NAME_TRUNCATED}"
fi
echo "💾 Pushing commit"
cd "${GIT_HELM}"
git add .
git -c user.email="devops+gha@speckle.systems" -c user.name="CI" commit -m "Github action commit for version '${RELEASE_VERSION}'"
git push
+37
View File
@@ -0,0 +1,37 @@
#!/usr/bin/env bash
set -eo pipefail
if [[ -z "${IMAGE_VERSION_TAG}" ]]; then
echo "IMAGE_VERSION_TAG is not set"
exit 1
fi
if [[ -z "${DOCKER_REG_USER}" ]]; then
echo "DOCKER_REG_USER is not set"
exit 1
fi
if [[ -z "${DOCKER_REG_PASS}" ]]; then
echo "DOCKER_REG_PASS is not set"
exit 1
fi
echo "🏷️ Preparing envs"
GIT_REPO=$( pwd )
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
# shellcheck disable=SC1090,SC1091
source "${SCRIPT_DIR}/common.sh"
RELEASE_VERSION="${IMAGE_VERSION_TAG}-chart"
HELM_STABLE_BRANCH="${HELM_STABLE_BRANCH:-"main"}"
DOCKER_HELM_REG_URL="${DOCKER_HELM_REG_URL:-"registry-1.docker.io"}"
DOCKER_HELM_REG_ORG="${DOCKER_HELM_REG_ORG:-"speckle"}"
CHART_NAME="${CHART_NAME:-"speckle-server"}"
echo "📌 Releasing Helm Chart version ${RELEASE_VERSION} for application version ${IMAGE_VERSION_TAG}"
yq e -i ".docker_image_tag = \"${IMAGE_VERSION_TAG}\"" "${GIT_REPO}/utils/helm/speckle-server/values.yaml"
echo "${DOCKER_REG_PASS}" | helm registry login "${DOCKER_HELM_REG_URL}" --username "${DOCKER_REG_USER}" --password-stdin
helm package "${GIT_REPO}/utils/helm/speckle-server" --version "${RELEASE_VERSION}" --app-version "${IMAGE_VERSION_TAG}" --destination "/tmp"
helm push "/tmp/${CHART_NAME}-${RELEASE_VERSION}.tgz" "oci://${DOCKER_HELM_REG_URL}/${DOCKER_HELM_REG_ORG}"