github Actions で自動 PR open や close

# はしがき

うちの会社から、gitlab -> github への platform を移行しました。
なので、gitlab から使っていた CI を全部 github に migration する必要があります。

https://qiita.com/dkdidudtn/items/8bdce6854a6e7c1e157f

先日アップロードしたことを活用して、branch を自動で作成や削除をします。

作業の段階はいかになります。

1. 毎日、master branch への merge 向けの branch や PR を作成
1. 毎日、master branch への merge 向けの branch や PR を削除

# CICD とは？

https://en.wikipedia.org/wiki/CI/CD

https://www.redhat.com/en/topics/devops/what-is-ci-cd?cicd=32h281b

Red Hat には以下に紹介されています。

```
CI/CD (継続的インテグレーションおよび継続的デリバリー/デプロイメントの略) は、ソフトウェア開発ライフサイクルを最適化し、加速することを目的としています。
```

継続的インテグレーション(continuous integration)は**コードの変更**を **共有ソースコードリポジトリ**に **自動的かつ頻繁に取り込む**手法

継続的デリバリーまたはデプロイメント (CD) は 2 つの部分からなるプロセスで、**コード変更の統合、テスト、デリバリー**を指します。

build, テスト、デプロイ...　などを自動化することで、アプリケーションのエラーをよく発見したり、開発を高速化します。


# github actions とは？

https://github.com/features/actions

```
GitHub Actions makes it easy to automate all your software workflows, now with world-class CI/CD. 
```

「CICD を通じて自動的にある作業(build, PR 生成, 配布 ...etc)を行う」と認識しました。

gitlab のように、ある yaml file の作成で、段階を分けて、コードを実行できそうです。

https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#onschedule

また、schedule を実装するとき、github actions は UTC なので、UTC で設定する必要があります。

# やり方

このやり方は gitlab の加入前提で行います。

1. github repository を作る
1. github setting
1. PR 作成 yaml file を生成や commit
1. PR 削除 yaml file を生成や commit
1. 結果

## github repository を作る

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582489/dc6b51cf-0ab7-6e00-41d9-bd5a2cabfff0.png)

dashboard 上の `+` をクリックして、New repository を作ります。

スクショのように oraganization を作って、repository を作っても構いません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582489/12e59b2b-eb21-47d7-a301-45ea042e0725.png)

ほかのユーザーから見えるように public で設定しました。
これで作ります。

## github setting

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582489/41cca3e1-206d-b60c-825e-677394f48cfe.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582489/75c149fe-04f4-9279-9284-ee97456e52fe.png)

setting > Actions > general に遷移します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582489/cee53752-8836-bd4a-58fd-a632708f6fe5.png)

Workflow で repository を Read and write できるように設定します。
PR もつくる予定なので、checkbox もチェックしておきます。

<details>
<summary>
organization の repository から変更できない場合
</summary>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582489/2b22f661-05b8-084e-8e05-a34b66a31f0d.png)

このように変更できない場合があります。

organization の setting を変更する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582489/af8619e6-2bf1-dd51-81e1-afc82bf67fc8.png)


上のスクショのように organization の setting > Actions > General に入って、設定を変更してください。

</details>

```
Pair GitHub Packages with Actions to simplify package management, including version updates, fast distribution with our global CDN, and dependency resolution, using your existing GITHUB_TOKEN.
```
github は `GITHUB_TOKEN` という token が使えるので、特に token を作る必要はありません。

## PR 作成 yaml file を生成や commit

`.github/workflows` から、以下のコードを活用して、yaml file を作ってください。

```yaml
name: Create Daily Release Branch

on:
  schedule:
    - cron: '0 9 * * *' 

jobs:
  build:
    name: build
    runs-on: ubuntu-latest

    env:
      GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

    steps:
      - uses: actions/checkout@v4
      
      - name: Set daily branch name
        id: set_branch_name
        run: |
          BRANCH_NAME="release/$(date --date 'tomorrow' +%Y-%m-%d)"
          echo "branch_name=$BRANCH_NAME" >> $GITHUB_OUTPUT

      - name: Git Setting
        run: |
          git config --global user.email "youremail@gmail.com"
          git config --global user.name "Ci Schedule Bot"

      - name: Create release branch and pr
        id: create_pr
        run: |
          git fetch origin main
          git checkout -b ${{ steps.set_branch_name.outputs.branch_name }} origin/main
          git commit --allow-empty -m "Release/${{ steps.set_branch_name.outputs.branch_name }}"
          git push origin ${{ steps.set_branch_name.outputs.branch_name }}
          pr_url=$(gh pr create -B main -t ${{ steps.set_branch_name.outputs.branch_name }} -b ${{ steps.set_branch_name.outputs.branch_name }})
          echo pr_url
```

毎日、18時(UTC 9時 -> JST 18時)に「明日」の pr 生成します。
gh を使うので、git の url 設定は必要ありません。また、gh pr create は pr の url を return しますので、actions 上から確認もできます。

## PR 削除 yaml file を生成や commit

`.github/workflows` から、以下のコードを活用して、yaml file を作ってください。

```yaml
name: Close Daily Release Branch

on:
  schedule:
    - cron: '0 0 * * *' 

jobs:
  build:
    name: build
    runs-on: ubuntu-latest

    env:
      GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

    steps:
      - uses: actions/checkout@v4
      
      - name: Set daily branch name
        id: set_branch_name
        run: |
          BRANCH_NAME="release/$(date --date 'yesterday' +%Y-%m-%d)"
          echo "branch_name=$BRANCH_NAME" >> $GITHUB_OUTPUT

      - name: Git Setting
        run: |
          git config --global user.email "youremail@gmail.com"
          git config --global user.name "Ci Schedule Bot"
          git remote set-url origin "https://github.com/yourgithublink.git"

      - name: Close release branch and pr
        run: |
          git fetch origin ${{ steps.set_branch_name.outputs.branch_name }}
          git push -d origin ${{ steps.set_branch_name.outputs.branch_name }}
```

毎日、9時(UTC 0時 -> JST 9時)に「昨日」の pr 削除します。

branch 削除には git を使うので、github link の設定が必要です。

## 結果

|branch|actions|pr|
|-|-|-|
|![スクリーンショット 2024-06-04 11.37.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582489/8891b039-4576-6bd6-4d06-60e6b2a61eed.png)|![スクリーンショット 2024-06-04 11.35.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582489/e26219e8-fdc7-0226-9c7a-869f10596060.png)|![スクリーンショット 2024-06-04 11.35.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582489/e9b345ce-35ed-f298-7af2-4e5a0d2b8073.png)|

確認が遅れていて、結果だけですが、うまく生成されて、branch の削除(pr close)もできました。

# まとめ

すでに実装されているコードがあって、すぐできまいた。

自分の repository から、確認するときは、すぐ確認できるように、設定しました。

# 参考したページ

https://cli.github.com/manual/gh_pr_create

https://qiita.com/dkdidudtn/items/8bdce6854a6e7c1e157f