Open12

backlogでもCI/CDしたい

omihirofumiomihirofumi

backlogでもCI/CDしたいのでwebhook調査する。

webhookでGitのpushを設定して、git pushしてみると以下の内容が送られたらしい。
webhookの送信先には、適当にデプロイしたCloud RunのURLを設定。

{
  "id":xxxx,
  "project": {
    "id": xxx,
    "projectKey": "XXXX",
    "name": "xxx",
    "chartEnabled": false,
    "subtaskingEnabled": false,
    "projectLeaderCanEditProjectLeader": false,
    "useWikiTreeView": true,
    "textFormattingRule": "markdown",
    "archived": false
  },
  "type": 12,
  "content": {
    "change_type": "create",
    "ref": "refs/heads/main",
    "repository": {
      "id": xx,
      "name": "webhooktest",
      "description": null
    },
    "revision_count": 1,
    "revision_type": "commit",
    "revisions": [
      {
        "rev": "xxx",
        "comment": "first commit"
      }
    ]
  },
  "notifications": [],
  "createdUser": {
    "id": xxx,
    "userId": null,
    "name": "xxxx",
    "roleType": 1,
    "lang": "ja",
    "mailAddress": null,
    "nulabAccount": {
      "nulabId": "xxx",
      "name": "xxx",
      "uniqueId": "xxx"
    }
  },
  "created": "2024-12-05T02:43:41Z"
}
omihirofumiomihirofumi
  "type": 12,
  "content": {
    "change_type": "create",
    "ref": "refs/heads/main",

この辺使って、mainにpushされたら、ビルド・デプロイができるか。
"type": 12"change_type": "create"これ調べる。

omihirofumiomihirofumi

https://developer.nulab.com/ja/docs/backlog/api/2/get-recent-updates/
ここにtypeの一覧があった。

1:課題の追加
2:課題の更新
3:課題にコメント
4:課題の削除
5:Wikiを追加
6:Wikiを更新
7:Wikiを削除
8:共有ファイルを追加
9:共有ファイルを更新
10:共有ファイルを削除
11:Subversionコミット
12:GITプッシュ
13:GITリポジトリ作成
14:課題をまとめて更新
15:ユーザーがプロジェクトに参加
16:ユーザーがプロジェクトから脱退
17:コメントにお知らせを追加
18:プルリクエストの追加
19:プルリクエストの更新
20:プルリクエストにコメント
21:プルリクエストの削除
22:マイルストーンの追加
23:マイルストーンの更新
24:マイルストーンの削除
25:グループがプロジェクトに参加
26:グループがプロジェクトから脱退
omihirofumiomihirofumi

type: 12はgit push。
だからwebhook受け取る側でtype: 12 && ref: refs/heads/mainの時にgit clone -> build -> deployすれば良さそう。

omihirofumiomihirofumi

Google Cloudでどうするか

Cloud Runにデプロイしたい。

backlog (webhook) ->
cloud run (cloud buildをトリガーするだけ) ->
cloud buildでgit cloneして、gcloud run deploy --source .
みたいな感じかな。

omihirofumiomihirofumi

ssh鍵作る。

ssh-keygen -t rsa -b 4096 -N '' -f id_rsa_backlog -C <mail address>

secret managerに秘密鍵保存する。

cloudbuild.yaml
steps:
- name: 'gcr.io/cloud-builders/git'
  secretEnv: ['SSH_KEY']
  entrypoint: 'bash'
  args:
  - -c
  - |
    echo "$$SSH_KEY" >> /root/.ssh/id_rsa
    chmod 400 /root/.ssh/id_rsa
    ssh-keyscan -t rsa <space id>.git.backlog.com > /root/.ssh/known_hosts
  volumes:
  - name: 'ssh'
    path: /root/.ssh

# Clone the repository
- name: 'gcr.io/cloud-builders/git'
  entrypoint: 'bash'
  args:
    - '-c'
    - |
      if [ -d "webhooktest" ]; then
        echo "Directory 'webhooktest' already exists. Performing git pull..."
        cd webhooktest
        git pull
      else
        echo "Cloning repository..."
        git clone  <space id>@<space id>.git.backlog.com:/OMIHIROFUMI/webhooktest.git
      fi
  volumes:
  - name: 'ssh'
    path: /root/.ssh

availableSecrets:
  secretManager:
  - versionName: <secret manager>
    env: 'SSH_KEY'
options:
  logging: CLOUD_LOGGING_ONLY

これで、backlogからgit cloneできることは確認できた。

omihirofumiomihirofumi

steps:
  - name: ubuntu
    args:
      - echo
      - $_PROJECT_DD
options:
  logging: CLOUD_LOGGING_ONLY

omihirofumiomihirofumi

cloud buildのトリガーの設定でbody取れて、フィルタリングもできるからwebhook送る先を自分で作らなくてもよさそう。