🐦

CI で Gitリポジトリ への push を Pixela に記録する

2020/10/18に公開

Pixela という日々の様々な活動量を記録して GitHub のグラフのように表現する API サービスがあります。

この記事では、GitHub だけでなく BitbucketGitLab への 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
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
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 のグラフでカウントアップを確認する、という流れで自分はチェックしました。

稼働確認:GitHub編
稼働確認:BitBucket編
稼働確認:GitLab編
  • https://gitlab.com/*******/********/-/jobs/xxxxxxxx (プライベートリポジトリのため伏せます)

Pixelaに反映されたか確認

まとめ・その他

本記事では以下について記述しました。

技術面

  • terraform で 主要な Git リポジトリ SaaS 3つのリポジトリ変数を簡単に設定することができます。
  • これらの SaaS にちょっとした CI を設定することで、日々のコミット数を自動で Pixela に記録することができます。

活動アピール面

  • Pixela の最近のバージョンアップ(v1.20.0)で ユーザープロフィールページ もできたので、自身の活動状況を提示するのに GitHub が業務リポジトリでない方でも多くの を生やすことができます。
  • 個人のリポジトリでないと自分の思うようには記録できないかもしれませんが、そんなときは Pixela LINE Bot で手動記録するのも良いかもです。

ちなみに自分のプロフィールページは こちら です。

最後まで読んでいただきありがとうございました。
この記事が、terraform や CI を実践するとっかかりになったらうれしいです。

脚注
  1. ほぼ完成順に、 BitbucketGitHubGitLab ↩︎

  2. terraform-provider-github が 個人のリポジトリ変数に対応したのは v3.0.0 以降です。それまでは組織のでないと terraform apply でエラーとなりました。 refs issue #422 ↩︎

  3. GitLab 13.4 以前の場合、terraform v0.13 系に未対応の模様。 ↩︎

  4. masked = true にするには 8 文字以上の長さが必要。 refs https://docs.gitlab.com/ee/ci/variables/#masked-variable-requirements ↩︎

Discussion