Commit 33566519 authored by Ruben ten Hove's avatar Ruben ten Hove
Browse files

Merge branch 'badges' into 'beta'

feat: local badges

See merge request just-ci/templates!20
parents d19c8473 45409c0d
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -21,6 +21,14 @@ gitlab:recommended:
tbump:
  stage: pre-release

badge:test:
  extends: .badge
  stage: test
  variables:
    NAME: "branch"
    MESSAGE: "${CI_COMMIT_REF_NAME}"
    COLOR: "fuchsia"

# child pipeline to unit tests all our jobs

jobs:c:
+46 −42
Original line number Diff line number Diff line
---
# This job will create or update any badges set through other jobs
# This job will create or update any badges set through other jobs.
# It requires a Project Access Token or Personal Access Token with api scope set
# as a CI/CD variable called GL_TOKEN.
# To create your own automatic badges, add the following to your .gitlab-ci.yml:

# It requires:
# - A Project Access Token set as a CI/CD variable called GL_TOKEN
# - Protected tags set with a wildcard: "v*"
# - A variable called I_WANT_BADGES set to a truthy value

# To create your own automatic badges, add the following global variables to a job:
# badge:your_custom_job:
#   extends: .badge
#   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
#     NAME: "version"
#     MESSAGE: "1.2.3"
#     COLOR: "red"
#     URL: "${CI_PROJECT_URL}/tags/${CI_COMMIT_TAG}"
#   rules:
#     - if: ($CI_COMMIT_TAG =~ /^v[0-9]+(\.[0-9]+){2}$/ && $GL_TOKEN)

badge:
  image: registry.gitlab.com/notno/tool/bash:latest
  stage: .post
  script:
    - |
      IFS='-'
      for BADGE_VARIABLE in ${!BADGE_@}; do
        case "${BADGE_VARIABLE}" in *_URL) continue;; esac
# Make sure your_custom_job is replaced and unique, and you've changed the variables
# according to your preferences.

        read -ra BADGE_ELEMENTS <<< "${!BADGE_VARIABLE}"
        BADGE_NAME="${BADGE_ELEMENTS[0]}"
        BADGE_URL_VARIABLE=${BADGE_VARIABLE}_URL
        BADGE_URL=${!BADGE_URL_VARIABLE}
# Choose a color from this list: https://github.com/jongracecox/anybadge#colors

        if [ -z "${BADGE_URL}" ]; then
          BADGE_URL="${CI_PROJECT_URL}"
        fi
# Make sure your rules at least includes the requirement of $GL_TOKEN

        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
.badge:
  image: registry.gitlab.com/just-ci/images/anybadge:latest
  stage: .post
  variables:
    GIT_STRATEGY: "none"
  script:
    - IMAGE_URL=${CI_PROJECT_URL}/-/jobs/artifacts/${CI_DEFAULT_BRANCH}/raw/badges/${NAME}.svg?job=${CI_JOB_NAME}
    - mkdir -p ci_badges
    - anybadge -l "${NAME}" -v "${MESSAGE}" -c "${COLOR}" -f "ci_badges/${NAME}.svg"

    - echo "[*] Creating/updating badge..."
    - |
      if [ -z "${GL_TOKEN}" ]; then
        echo "[!] GL_TOKEN not set. You can check the resulting badge in the artifacts. It will not be set."
      else
        BADGE_ID=$(curl -SsLF -H "PRIVATE-TOKEN: ${GL_TOKEN}" "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/badges" | jq --arg NAME "${NAME}" '.[] | select(.name==$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."
          echo "[-] Badge doesn't exist yet. We'll create a new one..."
          curl -SsLF -X POST -H "PRIVATE-TOKEN: ${GL_TOKEN}" -d "image_url=${IMAGE_URL}&link_url=${URL:-$CI_PROJECT_URL}&name=${NAME}" "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/badges" >/dev/null
          echo "[+] Badge created successfully."
        else
          echo "Badge '${BADGE_NAME}' id is ${BADGE_ID}."
          echo "[*] Updating badge ID ${BADGE_ID}..."
          curl -SsLF -X PUT -H "PRIVATE-TOKEN: ${GL_TOKEN}" -d "image_url=${IMAGE_URL}&link_url=${URL:-$CI_PROJECT_URL}" "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/badges/${BADGE_ID}" >/dev/null
          echo "[+] Badge updated successfully."
        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}$/ && $GL_TOKEN && $I_WANT_BADGES)
      fi
  artifacts:
    paths:
      - ci_badges/*.svg
  needs: []
+10 −4
Original line number Diff line number Diff line
@@ -2,10 +2,6 @@
# https://github.com/semantic-release/semantic-release#commit-message-format
# https://levelup.gitconnected.com/semantic-versioning-and-release-automation-on-gitlab-9ba16af0c21

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/just-ci/images/node:latest
  stage: .post
@@ -40,3 +36,13 @@ semantic-release:
  only:
    variables:
      - $GL_TOKEN

badge:semantic-release:
  extends: .badge
  variables:
    NAME: "version"
    MESSAGE: "${CI_COMMIT_TAG}"
    COLOR: "green"
    URL: "${CI_PROJECT_URL}/tags/${CI_COMMIT_TAG}"
  rules:
    - if: ($CI_COMMIT_TAG =~ /^v[0-9]+(\.[0-9]+){2}$/ && $GL_TOKEN)