Gitに自動で草を生やすスクリプトを組んでみた

<h2>自動で草を生やすスクリプト</h2>
毎日コードを書くことを決めたものの、コミットするのがめんどくさくなり、ふと自動で草生やしたら楽じゃないか？と思ったのでスクリプトを書きました

草の意味を考えるとあんまりよくないですが、お試しでやってみました

フォルダ構成は以下
リポジトリを作成したら、クローンして以下の構成を作ってください。

```terminal:フォルダ構成
D:.
│  daily_commit.py
│  README.md
│
└─.github
    └─workflows
            daily_commit.yml
```

<h2>ファイルの作成</h2>
<h3>daily_commit.py</h3>
毎日自動でコミットを行うPythonスクリプトを作成します

このスクリプトは、何らかのファイルを更新（または新規作成）し、コミット、プッシュします

```python:daily_commit.py
import os
import datetime
import random
import subprocess # subprocessモジュールをインポート

def create_and_commit():
    # ユーザー名とメールアドレスを取得
    git_username = os.environ.get('GIT_USERNAME')
    git_useremail = os.environ.get('GIT_USEREMAIL')

    if not git_username or not git_useremail:
        print("Error: GIT_USERNAME and GIT_USEREMAIL environment variables must be set.")
        return

    # タイムスタンプを使ってユニークなファイル名を作成
    timestamp = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
    filename = f"daily_update_{timestamp}.txt"
    
    # コミットメッセージ
    commit_message = f"Daily automated commit: {timestamp}"

    try:
        # 既存のファイルに追記するか、新しいファイルを作成
        with open("daily_log.txt", "a") as f:
            f.write(f"Commit on {timestamp}: {random.randint(1, 100)}\n")
        
        # Gitコマンドの実行
        # subprocess.run() を使用して、より安全にコマンドを実行
        subprocess.run(["git", "config", "user.name", git_username], check=True)
        subprocess.run(["git", "config", "user.email", git_useremail], check=True)
        subprocess.run(["git", "add", "."], check=True)
        subprocess.run(["git", "commit", "-m", commit_message], check=True)
        subprocess.run(["git", "push", "origin", "main"], check=True) # もしデフォルトブランチがmasterならmasterにしてください

        print(f"Successfully committed: {commit_message}")

    except subprocess.CalledProcessError as e:
        print(f"Git command failed: {e}")
        print(f"Error output: {e.stderr.decode()}")
    except Exception as e:
        print(f"An error occurred: {e}")

if __name__ == "__main__":
    create_and_commit()

```

<h3>daily_commit.yml</h3>
ここではGitHub Actionsを使うにあたって、必要な設定を書いていきます

使う人によって変更されるパラメータは以下です

<b>・schedule:</b>コミットプッシュする時間をUTCで設定します。この例では日本時間の9時に実行されます

<b>・GIT_USERNAME:</b>Gitに登録している名前をつけます

<b>・GIT_USEREMAIL:</b>Gitに登録してるメールアドレスをつけます

<b>・token:</b>後述するトークンの名前をつけます。ここでは仮でGH_TOKENとつけました。

```yml:daily_commit,yml
# .github/workflows/daily_commit.yml

name: Daily Automated Commit

on:
    # 毎日午前0時（UTC）に実行されます。
    # 日本時間（JST）で午前9時に実行したい場合は、このまま '0 0 * * *' を使用します。
    # 他の時間にしたい場合は、UTCとの時差を考慮して調整してください。
    # 例：日本時間の午後5時（JST 17時）に実行したい場合、UTCは8時なので '0 8 * * *' となります。
  schedule:
    - cron: '0 0 * * *' 
  workflow_dispatch:

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout repository
      uses: actions/checkout@v4
      with:
        fetch-depth: 0
        # GitHubトークンを設定してください
        token: ${{ secrets.GH_TOKEN }} 

    - name: Set up Python
      uses: actions/setup-python@v5
      with:
        python-version: '3.x'

    - name: Run daily commit script
      run: python daily_commit.py
      env:
          # ここをあなたのGitHubユーザー名とメールアドレスに置き換えてください
        GIT_USERNAME: TKWebSE
        GIT_USEREMAIL: writetechcode@yahoo.co.jp

```

諸々のフォルダやファイルを作成出来たらコミットプッシュします。

<h2>Gitの設定</h2>
GitHub Actionsで自動実行できるようにします
GitHub Actionsを使えばPCを常に起動しなくても自動で実行してくれるので、電気代節約になります

<br>
<h3>1.Personal Access Token (PAT) の生成</h3>

GitHubにログインし、Setting画面のDevelopperSettingsを開きます

そこで下記のPersonal access tokenのtokens(classic)を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927880/9026f245-71f3-4e02-bfcb-d83599af5b93.png)

次に下記を入力します

<b>・Note (メモ):</b> daily-commit-tokenなど、用途がわかる名前
<b>・Expiration (有効期限):</b> 毎日実行することを考えると、No expiration（期限なし）または十分な期間（例: 30日）を設定
<b>・Select scopes (スコープ):</b> repo のチェックボックスにフルアクセス権（すべてのサブオプションも含む）をつけます。これにより、リポジトリへの読み書き権限が付与されます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927880/3a6f6ed3-e547-4af5-afd5-a68b04b650d7.png)

これで、Generate token ボタンを押下。
表示されたトークンをコピーしておきます(この画面を閉じると、二度と表示されません)

<h3>2. GitHub Secrets への追加</h3>
生成したPATをGitHubリポジトリのSecretsとして保存します。これにより、トークンが直接コードに露出せず、安全に利用できます

まず、GitHubリポジトリにアクセスし、リポジトリのSettingsを開きます

開いたら、左側のメニューで Secrets and variables をクリックし、Actions を選択。New repository secret ボタンを押下

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927880/b09a9a2f-d4ec-471a-ac60-f99fe00460b1.png)

下記画面にて、以下を入力します
<b>・Name：</b>任意のわかりやすい名前(上のymlのtokenでつけたGH_TOKENをここでつけてます)
<b>・Secret：<b>先ほどコピーしたPATをここに貼り付け

入力したらAdd secretを押下して設定完了

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927880/73eb8d2b-1a4f-42ec-9878-842d7883bb6d.png)


<h2>動作確認</h2>
このスクリプトがちゃんと動くか試してみます

リポジトリに移動し、Actionsタブを押下。左側にあるDailyAutomatedCommitを押下。
Run Workflowで実行します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927880/48a81ab1-0c05-4662-a6ca-b1ee9bd41c6d.png)


実行後にコミット履歴を見ると、コミットされてました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927880/df1f8e44-febf-42e5-8e12-110f7ff003bb.png)

翌日確認しても、コミットされてました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927880/3b809aea-bbd1-4a0c-a8d2-6b3fdea7550c.png)