Commit 49011e67 authored by Ruben ten Hove's avatar Ruben ten Hove Committed by Federico Falconieri
Browse files

feat: automatic custom badges

parent 0ae15379
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -5,6 +5,8 @@ variables:
include:
  - local: 'alm/semantic-release.yml'

  - local: 'other/badge.yml'

  - local: 'docker/kaniko.yml'
  - local: 'docker/anchore/grype.yml'

alm/semantic-release-badge.yml

deleted100644 → 0
+0 −39
Original line number Diff line number Diff line
---
# This job will create or update a version badge containing the latest tag.
# It requires a Project Access Token set as a CI/CD variable called GL_TOKEN
# Also make sure you have set a protected tags wildcard as "v*"
# If you want to disable badges,
# set a global variable called "I_DONT_LIKE_BADGES"

# yamllint disable rule:line-length

semantic-release:badge:
  image: bash:latest
  stage: deploy
  script:
    - |
      if [ -z ${GL_TOKEN} ]; then
        echo '$GL_TOKEN is not set. Did you add a Project Access Token with api scope as GL_TOKEN to the CI/CD Variables? If so, it may be set as Protected. You need to add a protected tag wildcard as "v*" for this project.'
        exit 1
      fi
    - apk add --no-cache curl jq
    - |
      echo "[*] Retrieving version badge id..."
      BADGE_ID=$(curl --silent --fail --header "PRIVATE-TOKEN: ${GL_TOKEN}" "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/badges" | jq '.[] | select(.name=="version") | .id') || true
      if [ -z "${BADGE_ID}" ]; then
        echo "[-] Unable to get badge id. It probably doesn't exist yet, so we'll create a new one."
      else
        echo "Badge id is ${BADGE_ID}."
      fi
    - LINK_URL="${CI_PROJECT_URL}/tags/${CI_COMMIT_TAG}"
    - IMAGE_URL="https://img.shields.io/badge/version-${CI_COMMIT_TAG}-informational"
    - |
      case ${BADGE_ID} in
        ''|*[!0-9]*) echo "[*] Creating badge..." && curl --silent --fail --request POST --header "PRIVATE-TOKEN: ${GL_TOKEN}" --data "image_url=${IMAGE_URL}&link_url=${LINK_URL}&name=version" "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/badges" >/dev/null && echo "[+] Badge created successfully." || echo "[!] Badge creation failed" ;;
        *) echo "[*] Updating badge..." && curl --silent --fail --request PUT --header "PRIVATE-TOKEN: ${GL_TOKEN}" --data "image_url=${IMAGE_URL}&link_url=${LINK_URL}" "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/badges/${BADGE_ID}" >/dev/null && echo "[+] Badge updated successfully." || echo "[!] Badge update failed" ;;
      esac
  rules:
    - if: $I_DONT_LIKE_BADGES
      when: never
    - if: '$CI_COMMIT_TAG =~ /^v[0-9]+(\.[0-9]+){2}$/'
  needs: []
+4 −3
Original line number Diff line number Diff line
@@ -4,6 +4,10 @@

# yamllint disable rule:line-length

variables:
  BADGE_semantic_release: "version-${CI_COMMIT_TAG}-informational"
  BADGE_semantic_release_URL: "${CI_PROJECT_URL}/tags/${CI_COMMIT_TAG}"

semantic-release:
  image: registry.gitlab.com/notno/semantic-release-gitlab:latest
  stage: .post
@@ -17,6 +21,3 @@ semantic-release:
    - if: $CI_COMMIT_TAG
      when: never
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH

include:
  - local: 'alm/semantic-release-badge.yml'

other/badge.yml

0 → 100644
+53 −0
Original line number Diff line number Diff line
---
# yamllint disable rule:line-length

# This job will create or update any badges set through other jobs
# It requires a Project Access Token set as a CI/CD variable called GL_TOKEN
# Also make sure you have set a protected tags wildcard as "v*"
# To create your own automatic badges, add the following global variables to a job:
# variables:
#   BADGE_job_name: "label-message-color"  # See https://shields.io/
#   BADGE_job_name_URL: "https://some_url/${WITH_VARIABLES}"
# Make sure job_name is replaced and unique, and only contains ASCII or underscores

badge:
  image: registry.gitlab.com/notno/tool/bash:latest
  stage: deploy
  script:
    - |
      if [ -z "${GL_TOKEN}" ]; then
        echo '$GL_TOKEN is not set. Did you add a Project Access Token with api scope as GL_TOKEN to the CI/CD Variables? If so, it may be set as Protected. You need to add a protected tag wildcard as "v*" for this project.'
        exit 1
      fi
    - |
      IFS='-'
      for BADGE_VARIABLE in ${!BADGE_@}; do
        case "${BADGE_VARIABLE}" in *_URL) continue;; esac

        read -ra BADGE_ELEMENTS <<< "${!BADGE_VARIABLE}"
        BADGE_NAME="${BADGE_ELEMENTS[0]}"
        BADGE_URL_VARIABLE=${BADGE_VARIABLE}_URL
        BADGE_URL=${!BADGE_URL_VARIABLE}

        if [ -z "${BADGE_URL}" ]; then
          BADGE_URL="${CI_PROJECT_URL}"
        fi

        echo "[*] Creating/updating badge '${BADGE_NAME}'..."
        BADGE_ID=$(curl --silent --fail --header "PRIVATE-TOKEN: ${GL_TOKEN}" "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/badges" | jq --arg BADGE_NAME "${BADGE_NAME}" '.[] | select(.name==$BADGE_NAME) | .id') || true
        if [ -z "${BADGE_ID}" ]; then
          echo "[-] Unable to get badge id. It probably doesn't exist yet, so we'll create a new one."
        else
          echo "Badge '${BADGE_NAME}' id is ${BADGE_ID}."
        fi

        IMAGE_URL="https://img.shields.io/badge/${!BADGE_VARIABLE}"

        case ${BADGE_ID} in
          ''|*[!0-9]*) echo "[*] Creating badge..." && curl --silent --fail --request POST --header "PRIVATE-TOKEN: ${GL_TOKEN}" --data "image_url=${IMAGE_URL}&link_url=${BADGE_URL}&name=${BADGE_NAME}" "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/badges" >/dev/null && echo "[+] Badge '${BADGE_NAME}' created successfully." || echo "[!] Badge '${BADGE_NAME}' creation failed" ;;
          *) echo "[*] Updating badge..." && curl --silent --fail --request PUT --header "PRIVATE-TOKEN: ${GL_TOKEN}" --data "image_url=${IMAGE_URL}&link_url=${BADGE_URL}" "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/badges/${BADGE_ID}" >/dev/null && echo "[+] Badge '${BADGE_NAME}' updated successfully." || echo "[!] Badge '${BADGE_NAME}' update failed" ;;
        esac
      done
  rules:
    - if: '$CI_COMMIT_TAG =~ /^v[0-9]+(\.[0-9]+){2}$/'
  needs: []
+4 −0
Original line number Diff line number Diff line
@@ -14,6 +14,10 @@
# build_command = "pip install poetry && poetry build"
# # https://python-semantic-release.readthedocs.io/en/latest/configuration.html#build-command

variables:
  BADGE_semantic_release: "version-${CI_COMMIT_TAG}-informational"
  BADGE_semantic_release_URL: "${CI_PROJECT_URL}/tags/${CI_COMMIT_TAG}"

.python:semantic-release:template:
  stage: .post
  image: registry.gitlab.com/notno/python-semantic-releaser