#!/bin/sh # SPDX-License-Identifier: Apache-2.0 # (c) 2024, Konstantin Demin set -ef ## shifty-nifty shell goodies :) ## do same thing as GitLab does for CI_COMMIT_REF_SLUG: ## 1. lowercase string ## 2. replace not allowed chars with '-' (squeezing repeats) ## allowed chars are: `0-9`, `a-z` and '-' ## 3. remove leading and trailing '-' (if any) ## 4. truncate string up to 63 chars ## 5. remove trailing '-' (if any) ref_slug() { printf '%s' "${1:?}" \ | sed -Ez 's/^(.+)$/\L\1/;s/[^0-9a-z]+/-/g;s/^-//;s/-$//;s/^(.{1,63}).*$/\1/;s/-$//' \ | tr -d '\0' } ## normalize image tag ## performs like ref_slug() except: ## - symbols '_' and '.' are allowed too ## - truncate string up to 96 chars ## - squeeze symbol sequences: ## - '-' has higher priority than surrounding (leading and trailing) symbols ## - first symbol in sequence has higher priority than following symbols ## NB: implementation is rather demonstrative than effective image_tag_norm() { printf '%s' "${1:?}" \ | sed -Ez 's/^(.+)$/\L\1/;s/[^0-9a-z_.]+/-/g' \ | sed -Ez 's/\.+/./g;s/_+/_/g;s/[_.]+-/-/g;s/-[_.]+/-/g;s/([_.])[_.]+/\1/g' \ | sed -Ez 's/^[_.-]//;s/[_.-]$//;s/^(.{1,95}).*$/\1/;s/[_.-]$//' \ | tr -d '\0' } ## misc CI things # CI_COMMIT_SHORT_SHA="${CI_COMMIT_SHA:0:8}" CI_COMMIT_SHORT_SHA=$(printf '%s' "${CI_COMMIT_SHA}" | cut -c 1-8) if [ -n "${CI_COMMIT_BRANCH}" ] ; then CI_COMMIT_REF_SLUG="${CI_COMMIT_BRANCH}" fi if [ -n "${CI_COMMIT_SOURCE_BRANCH}" ] ; then CI_COMMIT_REF_SLUG="${CI_COMMIT_SOURCE_BRANCH}" fi if [ -n "${CI_COMMIT_TAG}" ] ; then CI_COMMIT_REF_SLUG="${CI_COMMIT_TAG}" fi CI_COMMIT_REF_SLUG="$(image_tag_norm "${CI_COMMIT_REF_SLUG}")" ## image tag(s) IMAGE_TAG="${CI_COMMIT_SHORT_SHA}-b${CI_PIPELINE_NUMBER}-${CI_COMMIT_REF_SLUG}" EXTRA_TAGS=$(image_tag_norm "branch-${CI_COMMIT_BRANCH}") if [ -n "${CI_COMMIT_TAG}" ] ; then IMAGE_TAG="${CI_COMMIT_SHORT_SHA}" EXTRA_TAGS="${CI_COMMIT_REF_SLUG}" ## TODO: think about "latest" tag: it should be error-prone for "backward tag push" # EXTRA_TAGS="${CI_COMMIT_REF_SLUG} latest" else if [ -n "${CI_COMMIT_SOURCE_BRANCH}" ] ; then echo "Running on branch '${CI_COMMIT_SOURCE_BRANCH}'" else if [ "${CI_COMMIT_BRANCH}" != "${CI_REPO_DEFAULT_BRANCH}" ] ; then echo "Running on branch '${CI_COMMIT_BRANCH}'" else IMAGE_TAG="${CI_COMMIT_SHORT_SHA}" fi fi fi IMAGE_TAG=$(image_tag_norm "${IMAGE_TAG}") export CI_COMMIT_SHORT_SHA CI_COMMIT_REF_SLUG IMAGE_TAG EXTRA_TAGS