CI で Gitリポジトリ への push を Pixela に記録する
Pixela という日々の様々な活動量を記録して GitHub のグラフのように表現する API サービスがあります。
この記事では、GitHub だけでなく Bitbucket や GitLab への Gitリポジトリの Push を、自動でその Pixela に記録する CI の設定例を記載します。
概要
- (CI実行用のコンテナイメージを決める)
- 3つのリポジトリ変数を terraform で設定する
- CIを設定する
- commit・push して pixela に記録されたか確認する
詳細
(CI実行用のコンテナイメージを決める)
curl が実行できれば何だっていいのですが、軽いのが良いかなーと思って alpine linux 3.11 のイメージに curl をインストールしただけのイメージを自分は用意しました。 -> DockerHub : sogaoh/pixela-hooker
なお、ベースの Dockerfile はこちら 。
3つのリポジトリ変数を terraform で設定する
以下の3つをリポジトリ変数として設定しておきましょう。
- PIXELA_TOKEN
- PIXELA_USERNAME
- PIXELA_WEBHOOK_HASH
新しいリポジトリには terraform.tfvars を少し書き換えれば手短にコマンド実行1回で上述3変数の設定ができます。
なお、*.tfstate ファイルはローカルに実行後だけ置いて、実行したら移動か削除する運用を想定しています。 そうしないのであれば、毎回3変数を定義することになるのでちょっと手間が多いかなと。
一度リポジトリに設定すれば、以降の push で Pixela への記録が自動で走ります。
サンプルコードは https://github.com/sogaoh/TerraformPractice/tree/master/VCS にもあるので適宜参考にしてください。参照したガイド類[1]をこの中の README に記載しています。
リポジトリ変数設定:GitHub編
- terraform-version
0.12.29
- main.tf [2]
provider "github" {
token = var.github_token
owner = var.github_owner
}
resource "github_actions_secret" "pixela_token" {
repository = var.github_secret_repository
secret_name = "PIXELA_TOKEN"
plaintext_value = var.pixela_token_value
}
resource "github_actions_secret" "pixela_username" {
repository = var.github_secret_repository
secret_name = "PIXELA_USERNAME"
plaintext_value = var.pixela_username_value
}
resource "github_actions_secret" "pixela_webhook_hash" {
repository = var.github_secret_repository
secret_name = "PIXELA_WEBHOOK_HASH"
plaintext_value = var.pixela_webhook_hash_value
}
- variables.tf
variable github_token {}
variable github_owner {}
variable github_secret_repository {}
variable pixela_token_value {}
variable pixela_username_value {}
variable pixela_webhook_hash_value {}
- terraform.tfvars.example
github_token="<Set Your Token>"
github_owner="sogaoh"
github_secret_repository="TerraformPractice"
pixela_token_value="<Set Your Pixela Token>"
pixela_username_value="sogaoh"
pixela_webhook_hash_value="<Set Your Pixela Hash>"
リポジトリ変数設定:BitBucket編
- terraform-version
0.12.29
- main.tf
provider "bitbucket" {
username = var.bitbucket_user
password = var.bitbucket_password
}
resource "bitbucket_repository_variable" "pixela_token" {
key = "PIXELA_TOKEN"
value = var.pixela_token_value
repository = var.bitbucket_variables_repository
secured = true
}
resource "bitbucket_repository_variable" "pixela_username" {
key = "PIXELA_USERNAME"
value = var.pixela_username_value
repository = var.bitbucket_variables_repository
secured = true
}
resource "bitbucket_repository_variable" "pixela_webhook_hash" {
key = "PIXELA_WEBHOOK_HASH"
value = var.pixela_webhook_hash_value
repository = var.bitbucket_variables_repository
secured = true
}
- variables.tf
variable bitbucket_user {}
variable bitbucket_password {}
variable bitbucket_variables_repository {}
variable pixela_token_value {}
variable pixela_username_value {}
variable pixela_webhook_hash_value {}
- terraform.tfvars.example
bitbucket_user="<Set Your Mail Address>"
bitbucket_password="<Set Your Password>"
bitbucket_variables_repository="sogaoh/go-pl"
pixela_token_value="<Set Your Pixela Token>"
pixela_username_value="sogaoh"
pixela_webhook_hash_value="<Set Your Pixela Hash>"
リポジトリ変数設定:GitLab編
- terraform-version [3]
0.12.29
- main.tf [4]
provider "gitlab" {
token = var.gitlab_token
}
resource "gitlab_project_variable" "pixela_token" {
project = var.gitlab_project_repository
key = "PIXELA_TOKEN"
value = var.pixela_token_value
masked = true
}
resource "gitlab_project_variable" "pixela_username" {
project = var.gitlab_project_repository
key = "PIXELA_USERNAME"
value = var.pixela_username_value
#masked = true
}
resource "gitlab_project_variable" "pixela_webhook_hash" {
project = var.gitlab_project_repository
key = "PIXELA_WEBHOOK_HASH"
value = var.pixela_webhook_hash_value
masked = true
}
- variables.tf
variable gitlab_token {}
variable gitlab_project_repository {}
variable pixela_token_value {}
variable pixela_username_value {}
variable pixela_webhook_hash_value {}
- terraform.tfvars.example
gitlab_token="<Set Your Token>"
gitlab_project_repository="<Set Your Organization/Project>"
pixela_token_value="<Set Your Pixela Token>"
pixela_username_value="sogaoh"
pixela_webhook_hash_value="<Set Your Pixela Hash>"
必要なリポジトリ変数を、terraform apply
してください。
初回や何か違和感があった時はリポジトリの管理画面で設定した変数を確認する必要があります。
CIを設定する
リポジトリそれぞれの管理画面でも設定可能ですが、簡単な設定なので IDE で作成するのも良いと思います。
なお、土台として PixelaのWebhookを叩くGitHub Actionsを作ってみた : sms日記 のエントリをもとにしました。
こちらにあった GitHub Actions から全て始まった感じです。情報共有にとても感謝しています。
CI設定:GitHub Actions
on: [push]
jobs:
increment-pixela-graph:
runs-on: ubuntu-latest
name: Invoke Pixela increment webhook
steps:
- name: Invoke webhook
uses: ryosms/pixela-webhook-action@v1.0.0
id: increment-pixela
with:
username: ${{ secrets.PIXELA_USERNAME }}
token: ${{ secrets.PIXELA_TOKEN }}
webhook_hash: ${{ secrets.PIXELA_WEBHOOK_HASH }}
CI設定:BitBucket Pipeline
pipelines:
default:
- step:
name: "increment-pixela-graph"
image: sogaoh/pixela-hooker:latest
script:
- curl -X POST https://pixe.la/v1/users/${PIXELA_USERNAME}/webhooks/${PIXELA_WEBHOOK_HASH} -H "X-USER-TOKEN:${PIXELA_TOKEN}"
CI設定:GitLab CI
- .gitlab-ci.yml
image: sogaoh/pixela-hooker
increment-pixela:
stage: deploy
script:
- curl -X POST https://pixe.la/v1/users/$PIXELA_USERNAME/webhooks/$PIXELA_WEBHOOK_HASH -H "X-USER-TOKEN:$PIXELA_TOKEN"
commit・push して pixela に記録されたか確認する
リポジトリの管理画面でCIの稼働を確認できると思います。
そちらがOKであれば Pixela のグラフでカウントアップを確認する、という流れで自分はチェックしました。
稼働確認:GitLab編
-
https://gitlab.com/*******/********/-/jobs/xxxxxxxx
(プライベートリポジトリのため伏せます)
Pixelaに反映されたか確認
まとめ・その他
本記事では以下について記述しました。
技術面
- terraform で 主要な Git リポジトリ SaaS 3つのリポジトリ変数を簡単に設定することができます。
- これらの SaaS にちょっとした CI を設定することで、日々のコミット数を自動で Pixela に記録することができます。
活動アピール面
- Pixela の最近のバージョンアップ(v1.20.0)で ユーザープロフィールページ もできたので、自身の活動状況を提示するのに GitHub が業務リポジトリでない方でも多くの
草
を生やすことができます。 - 個人のリポジトリでないと自分の思うようには記録できないかもしれませんが、そんなときは Pixela LINE Bot で手動記録するのも良いかもです。
ちなみに自分のプロフィールページは こちら です。
最後まで読んでいただきありがとうございました。
この記事が、terraform や CI を実践するとっかかりになったらうれしいです。
-
terraform-provider-github が 個人のリポジトリ変数に対応したのは v3.0.0 以降です。それまでは組織のでないと
terraform apply
でエラーとなりました。 refs issue #422 ↩︎ -
GitLab 13.4 以前の場合、terraform v0.13 系に未対応の模様。 ↩︎
-
masked = true
にするには 8 文字以上の長さが必要。 refs https://docs.gitlab.com/ee/ci/variables/#masked-variable-requirements ↩︎
Discussion