🪪

[GitHub Profile]Commitすることで山を作るカードを作ってみた

2024/06/29に公開

🪪 作ったもの

以下のように毎日コミットすると、GitHubプロフィールカード画像に山が描かれていくGitHub Actionsを作りました

現在から過去一ヶ月分のコミット日数で山の形が決まるため、コミットしない日が続くと積み上げた山が減っていきます。なので、毎日コミットして山を成長させていきましょう!

Themeについて

現状7種類展開しています
今後もさらに増やしていきたい.....

default dark sakura maple
スクリーンショット 2024-05-13 22 48 51 スクリーンショット 2024-05-13 22 47 30 スクリーンショット 2024-05-13 22 15 02
onedark solarized solarized_dark

⚙️ 設定方法

  1. 自分のREADMEがあるディレクトリに移動し、「Add file」します
  2. Name your fileに
    .github/workflows/readme-mountain.ymlを入力します
  3. 中身は以下をコピペしてください
    .github/workflows/readme-mountain.yml
    on:
      schedule: # run 0:00 (JST)
        - cron: "0 9 * * *"
      workflow_dispatch:
    
    jobs:
      readme_mountain:
        runs-on: ubuntu-latest
        name: generate-mountain
        steps:
          - name: Checkout
            uses: actions/checkout@v3
          - name: Use README.Mountain
            uses: suba327777/README.Mountain@release
            env:
              GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
              USERNAME: ${{ github.repository_owner }}
              # select theme
              THEME: "onedark"
          - name: Diff
            id: diff
            run: |
              git add -N .
              git diff --name-only --exit-code
            continue-on-error: true
          - name: commit & push
            run: |
              git config user.name  "github-actions[bot]"
              git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
              git add .
              git commit -m "[μRM] generate svg."
              git push
            if: steps.diff.outcome == 'failure'
    
  4. Actinosから Run workflowを行います
  5. 成功すると、以下の感じでmountain-output配下にmountain.svgとREADME.mdが生成されます
  6. プロフィールに表示させるには、mountain-output配下にあるREADME.mdのimgを貼り付けてください
    README.md
    <img src="https://raw.githubusercontent.com/自分のusername/自分のusername/main/mountain-output/mountain.svg" />
    
    README.md
    //ex 私の場合
    <img src="https://raw.githubusercontent.com/suba327777/suba327777/main/mountain-output/mountain.svg" />
    

🔧 実装について

構成

GitHub Actionsのスケジュール実行で1日1回最新の情報をGitHubAPIから取得し、その値を元にSVG生成を行っています

カード生成

APIでのやり取りや、UI部分などはGoで作成しました

Actionsのenvからtheme名を読み込み、カードを生成しています
UI実装については愚直にSVGを書いています😧

カードコンポーネント

https://github.com/suba327777/README.Mountain/blob/main/ui/card.go

マウンテンコンポーネント

https://github.com/suba327777/README.Mountain/blob/main/ui/mountain.go

テーマ関数

https://github.com/suba327777/README.Mountain/blob/main/ui/theme.go

GitHub Actions

GitHub Actionsでは以下の処理を行っています

  1. GitHub APIを叩き情報を取得
  2. APIの情報を元にSVG画像を生成
  3. ディレクトリに生成したSVG画像を書き込む
  4. ディレクトリにREADME.mdを生成する

以下、それらを実施しているmain.goとfile_writer.goのコードになります

main.go
https://github.com/suba327777/README.Mountain/blob/045a396c87ef833f924459f062f9e785c6d54651/main.go#L1-L27

file_writer.go
https://github.com/suba327777/README.Mountain/blob/045a396c87ef833f924459f062f9e785c6d54651/utils/file_writer.go#L1-L68

また、設定方法のusesで@releaseとしているのは、開発用のブランチとユーザに使ってもらうブランチを分けたかったためです
そのため、作業ブランチからmainブランチにマージされたらリリースブランチに向けてPRを作成するようにしています

https://github.com/suba327777/README.Mountain/blob/main/.github/workflows/release-pr.yml

おわりに

前々からGitHubに表示させるカードはどうやって実装しているのか気になっていたので、今回実装してみて面白かったです!

よろしければ、使っていただけると嬉しいです🥹

https://github.com/suba327777/README.Mountain

Discussion