3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

R言語で毎月自動更新されるGitHubダッシュボードを作ってみた

3
Posted at

はじめに

GitHubのプロフィールページにも草(Contribution Graph)はありますが、詳細なコミット数やリポジトリの傾向など活動内容までは分かりませんよね。

image.png

R言語の勉強も兼ねて、R言語とGitHub APIを使用しGitHub活動内容を可視化してみました。
毎月1日にGitHub Actionsで自動更新される仕組みも作ったので、その実装もあわせて紹介しようと思います。

開発環境セットアップ(Windows環境)

以下の環境で動作確認しています。

  • R: 4.4.0
  • RStudio

リポジトリのクローンと依存パッケージのインストール

git clone git@github.com:ishi720/GithubDashboard.git
cd GithubDashboard

このプロジェクトでは renv でパッケージ管理をしています。Rコンソールで以下を実行するだけで、必要なパッケージが一括インストールされます。

renv::restore()

使用している主なパッケージは以下のとおりです。

パッケージ 用途
gh GitHub API の呼び出し
ggplot2 グラフの描画
dplyr / tidyr データの集計・整形
RColorBrewer カラーパレット
lubridate 日付・タイムゾーンの操作
ggwordcloud ワードクラウドの生成
jsonlite JSON出力

GitHub認証の設定

GitHub APIを呼び出すために、Personal Access Token(PAT)が必要です。.Renviron ファイルに以下のように記載します(このファイルは .gitignore に含まれているので誤ってコミットする心配はありません)。

GITHUB_PAT=ghp_xxxxxxxxxxxxxxxxxx

config.R の設定

config.R で分析対象ユーザー名と出力先を設定します。
TARGET_USERを書き換えるだけで使えます。
また、グラフで公開されると困る場合はプライベートリポジトリを含めないように設定できます。

# 分析対象のGitHubユーザー名
TARGET_USER <- "ishi720"

# 出力ディレクトリ
OUTPUT_DIR <- file.path(getwd(), "Documents")

# プライベートリポジトリを含めるかどうか
INCLUDE_PRIVATE_REPOS <- FALSE

コード

いくつかのRスクリプトを作成しました。
各スクリプトを実行することで、集計結果をアウトプットできます。

スクリプト 内容
LanguageAnalysis.R 言語別コード量(バイト数)の集計
CommitAnalysis.R 月別・曜日別・時間帯別コミット数の集計
Repoanalysis.R リポジトリ作成数の年月別推移
RepoListExport.R リポジトリ一覧のJSON出力
TagAnalysis.R リポジトリトピックのワードクラウド
IssuesAnalysis.R Issue作成数・解決数の集計

出力部分

各スクリプトで共通している出力のパターンは以下のような感じです。

# config.R を読み込んで OUTPUT_DIR を取得
source("config.R")

# グラフ作成
p <- ggplot(df, aes(x = month, y = commits)) +
  geom_bar(stat = "identity", fill = "#4A90D9") +
  theme_minimal()

# 保存
ggsave(file.path(OUTPUT_DIR, "commits_by_month.png"), p,
       width = 12, height = 6, dpi = 150)

ggsave() で PNG に書き出し、Documents/ フォルダにまとめて保存します。

コミット取得時のポイント:タイムゾーン変換

GitHub API はコミット日時を UTC で返しますが、活動パターンを分析するなら日本時間(JST)に変換しておく必要があります。

commit_date_utc <- as.POSIXct(
  commit$commit$author$date,
  format = "%Y-%m-%dT%H:%M:%SZ",
  tz = "UTC"
)
# UTCからJSTへ変換
commit_date <- with_tz(commit_date_utc, tzone = "Asia/Tokyo")

GitHub Actionsで定期実行する際に、深夜帯のコミットが翌日にカウントされたりして、曜日・時間帯分析がズレてしまいます。

READMEに直接出力した画像のリンクを貼る

保存した画像をREADMEに表示するには、GitHubのrawコンテンツのURLを使います。

<img src="https://raw.githubusercontent.com/ishi720/GithubDashboard/refs/heads/main/Documents/commits_heatmap.png" />

Documents/ に保存された画像をそのままREADMEに貼ることで、リポジトリのトップページがダッシュボードとして機能します。

GitHub Actionsで自動化

毎月1日 09:00(JST)に全スクリプトを自動実行し、結果を自動コミット・プッシュする仕組みを .github/workflows/monthly-update.yml に定義しています。

on:
  schedule:
    - cron: '0 0 1 * *'  # 毎月1日 UTC 0:00 = JST 9:00
  workflow_dispatch:       # 手動実行も可能

jobs:
  update-dashboard:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: r-lib/actions/setup-r@v2
        with:
          r-version: '4.4.0'

      - name: Install R packages
        run: |
          Rscript --vanilla -e 'install.packages(c("gh", "ggplot2", "dplyr", "scales", "RColorBrewer", "lubridate", "tidyr", "ggwordcloud"), repos = "https://cran.r-project.org")'

      - name: Create output directory
        run: mkdir -p Documents

      - name: Run Language Analysis
        run: Rscript --vanilla LanguageAnalysis.R

      - name: Run Commit Analysis
        run: Rscript --vanilla CommitAnalysis.R

      - name: Run Repository Analysis
        run: Rscript --vanilla Repoanalysis.R

      - name: Run RepoListExport Analysis
        run: Rscript --vanilla RepoListExport.R

      - name: Run Tag Analysis
        run: Rscript --vanilla TagAnalysis.R

      - name: Run Issues Analysis
        run: Rscript --vanilla IssuesAnalysis.R

      - name: Commit and push
        run: |
          git config user.name "github-actions[bot]"
          git add Documents/
          git diff --staged --quiet || git commit -m "Monthly dashboard update - $(date +'%Y-%m-%d')"
          git push

グラフの分析

実際に出力されたグラフをいくつか紹介します。

言語別コード量

書いた言語ごとのバイト数を集計しています。書いた量の多さというのも指標にはなりますが、きれいに書けばバイト数は少なくなるはずなので無駄なコードをリファクタリングしてバイト数を減らす楽しみも増えました。

language_bar.png

月別・言語別コミット数

月ごとにどの言語を触っていたかが積み上げ棒グラフで確認できます。自分自身の開発言語の興味が可視化されました。

commits_by_month_language.png

コミット時間帯ヒートマップ

曜日×時間帯のヒートマップです。平日だと週初めのせいか、月曜火曜のコミット量の多くなる傾向がありそうです。

commits_heatmap.png

年別リポジトリ作成数

年ごとのリポジトリ作成数の推移です。年々増えてきているのでアイディアを形にする力が上がってきていると読み取れますね。

repos_by_year.png

トピック ワードクラウド

リポジトリに設定したトピック(タグ)の出現頻度をワードクラウドで表示します。 ワードクラウドを育てていく感じでモチベーションが上がります。

topics_wordcloud.png

おわりに

R言語とGitHub APIを利用して自分のGitHub活動内容を可視化できました。
また、GitHub ActionsでREADMEに自動反映されるので、1度セットアップすれば放っておいても最新状態を保てて便利です。

自分のGitHub活動を可視化したい方はぜひ試してみてください!

ここまで読んで頂きありがとうございました。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?