2021年11月4日木曜日

Gitlab の Wiki を CI と組み合わせて自動で更新する方法

Gitlab の Wiki を CI と組み合わせて自動で更新する方法

概要

前回の続きです
今回は CI を組み合わせて自動で Wiki が更新される仕組みにします

環境

  • Gitlab 14.3.3-ee

サンプルスクリプト (update_wiki.sh)

#!/bin/bash

[[ $HOST =~ ^https?://[^/]+ ]] && HOST="${BASH_REMATCH[0]}/api/v4/projects/"
UPLOAD_API_PATH="${CI_PROJECT_ID}/uploads"
FILE_NAME="test.jpg"

IMAGE_URL=`/usr/bin/curl -s -XPOST "${HOST}${UPLOAD_API_PATH}" --header "PRIVATE-TOKEN:${PRIVATE_TOKEN}" --form "file=@${FILE_NAME}" | jq -r .markdown`

CONTENT="
# API Test Page

## List
* a
* b
* c

## Image
${IMAGE_URL}
"
TITLE="test"
BODY="format=markdown&content=${CONTENT}&title=${TITLE}&slug=${TITLE}"

WIKI_API_PATH="${CI_PROJECT_ID}/wikis/${TITLE}"

/usr/bin/curl -XPUT "${HOST}${WIKI_API_PATH}" \
  --header "PRIVATE-TOKEN:${PRIVATE_TOKEN}" \
  --data "${BODY}"

.gitlab-ci.yml

stages:
  - update_wiki

update_wiki:
  image:
    name: alpine/git:latest
    entrypoint: [""]
  stage: update_wiki
  before_script:
    - "apk add curl"
    - "apk add bash"
    - "apk add jq"
    - "apk add wget"
    - "export PROJECT_ID=123"
  script:
    - "cd $CI_BUILDS_DIR/$CI_PROJECT_PATH"
    - "wget https://picsum.photos/200 -O test.jpg"
    - "chmod +x ./update_wiki.sh"
    - "HOST=${CI_PROJECT_URL} CI_PROJECT_ID=${PROJECT_ID} PRIVATE_TOKEN=${GIT_PASSWORD} ./update_wiki.sh"

解説

.gitlab-ci.yml 側で API をコールするのに必要なパラメータを変数に設定します

今まではシェルスクリプト側で HOST やシークレットトークなどを設定していましたが CI が自動で設定してくれているのでそれを使うようにします
自分で設定するのは PROJECT_ID だけになります
GIT_PASSWORD は CI の変数として Gitlab に事前に登録しています

画像は固定の画像ではなくランダムで取得するようにします
おそらく実際の場面では他のビルドで画像を作成してそれを Wiki に掲載する感じになるかなと思います

もしステージを分けて次のステージで画像情報を使う場合は artifacts.untracked: true を設定すると良いと思います

最後に

API で Wiki 編集 -> 画像をアップロードできるようにする -> CI に組み込むという流れで紹介しました

一度にゴールを目指そうとせず順を追って一つ一つ実装していくと結果的に近道になっていることは多いかなと思います

0 件のコメント:

コメントを投稿