ワイのGitHubリポジトリおすすめ設定(2022年 決定版)

# はじめに
はじめまして、「拳で」 と申します。
[NRI OpenStandia Advent Calendar 2022](https://qiita.com/advent-calendar/2022/nri-openstandia)の13日目は **ワイのGitHubリポジトリおすすめ設定(2022年 決定版)** というタイトルでお送りいたします!

2022年も終わりが近づき、「年末年始に何か開発でもしてみようかな？」と思っている方も多いのではないでしょうか。
新しくGitHubリポジトリを作成する際に、 **<font color="MediumVioletRed">「拳で」 がおすすめするぜひ入れてほしい設定</font>** を色々と紹介させていただきました!

開発用途などでフィットする設定は変わってくるかと思いますが、参考までにご覧いただければ幸いです:dizzy:
また、皆様のおすすめの設定がございましたらぜひコメントで教えていただけると大変喜びます🙇‍♂️

:::note warn
補足
記事内で特に説明の無い設定項目はデフォルト設定のままとなります。
:::

# TL;DR
- [設定チートシート](https://qiita.com/john-Q/items/8b42d56b0be4ec63edb4#%E8%A8%AD%E5%AE%9A%E3%83%81%E3%83%BC%E3%83%88%E3%82%B7%E3%83%BC%E3%83%88)を見てね!
- 各テンプレートは[jonghyo/astro-docs-template](https://github.com/jonghyo/astro-docs-template)　←　ここに入れてるので見てね!

# 前提条件
今回は以下のような用途、条件のリポジトリを想定しています。

<table>
  <thead>
    <tr>
      <th>項目</th><th>条件</th>
    </tr>
  </thead>
  <tr>
    <td> 人数 </td> <td>個人・少人数</td>
  </tr>
  <tr>
    <td> 開発目的 </td> <td>プライベート開発</td>
  </tr>
  <tr>
    <td> 開発内容 </td> <td>Webアプリ開発</td>
  </tr>
  <tr>
    <td> リポジトリ種別 </td> <td>Public</td>
  </tr>
  <tr>
    <td> ブランチ戦略 </td>
    <td> 

[GitHub-flow](https://docs.github.com/ja/get-started/quickstart/github-flow) 

   </td>
  </tr>
  <tr>
    <td>バージョニング </td>
    <td> セマンティックバージョニング</td>
  </tr>
  <tr>
    <td> 方針 </td> <td>

[GitHub無料枠](https://github.co.jp/pricing.html)で使える機能を活用する

</td>
  </tr>
</table>

# 設定対象
今回紹介する設定対象は以下2つです。
1. [Repository Settings](https://qiita.com/john-Q/items/8b42d56b0be4ec63edb4#1-repository-settings)
1. [Repository Templates](https://qiita.com/john-Q/items/8b42d56b0be4ec63edb4#2-repository-templates)
<img width="1000" alt="設定対象" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671490/6353bef1-aff8-382c-c4d3-a0cee605df93.png">

# 1. Repository Settings
おすすめの設定内容をシートにまとめました💡
よろしければ、ご活用ください🙇‍♂️
各設定の選定理由をこの章で紹介します。
## 設定チートシート
<img width="1000" alt="GitHubリポジトリおすすめ設定チートシート" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671490/c7841f36-ff00-3f24-eee8-27e90120fde0.png">

## 1.1 General
### 1.1.1 General
#### Require contributors to sign off on web-based commits 
<img width="700" alt="signoff" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671490/867ba280-cff1-af24-3604-ab283267cf21.png">

**<font color="LimeGreen">必要に応じて有効</font>**

**機能について**
GitHubのWeb上で編集を行う場合、コミット時にサインオフを求める機能です。
詳細は[リポジトリの強制コミット サインオフを有効または無効にする
](https://docs.github.com/ja/repositories/managing-your-repositorys-settings-and-features/managing-repository-settings/managing-the-commit-signoff-policy-for-your-repository#enabling-or-disabling-compulsory-commit-signoffs-for-your-repository)をご覧ください。

**推奨シーン**
- OSS開発など様々な開発者のコミットが想定されるとき

**理由**
- OSS開発などにおいて、コミッターの方に著作権やライセンスなどの条件に賛同した上で署名してもらうため
- ただし、GitHubのWeb上からの設定しか効果がないです😇
- プライベート開発だと、ここまでガチることもないので無効のケースが多いです

https://stackoverflow.com/questions/1962094/what-is-the-sign-off-feature-in-git-for

### 1.1.2 Features
#### Discussions
<img width="500" alt="discussion" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671490/d29cc47a-7690-54a8-c8cf-607da8507e01.png">

**<font color="LimeGreen">有効</font>**

**機能について**
<img width="600" alt="GitHub Discussions" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671490/b4dd2bf6-14ef-f1a6-557b-bfdfbda6fb52.png">
GitHub上で課題などについて、メンバと議論するための機能です。GitHub公式では以下のような使い分けを推奨しています。
- GitHub Discussions： 仕様や処理方式などの議論、方針決め
- GitHub Issues: 方針決定後の作業の管理・分類

詳細は[What is GitHub Discussions? A complete guide](https://resources.github.com/devops/process/planning/discussions/)をご覧ください。

**推奨シーン**
- チームメンバと処理方式などを議論する用

**理由**
- GitHubが推奨する使い方に則って、「議論 → GitHub Discussions」「作業 → GitHub Issues」とすることで着手可能な作業が何なのか管理しやすいようにするため

### 1.1.3 Pull Requests
#### Allow rebase merging
<img width="600" alt="rebase merging" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671490/99fbe6c0-86e5-4b36-3dfc-2e7d653f930e.png">

**<font color="Crimson">無効</font>**


**機能について**
<img width="700" alt="Rebase and merge" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671490/da83a7a5-9eea-a520-b3bd-6c1dc1a96af4.png">
Pull Requestのマージ時に、Rebase and mergeが選択できます。これを行うと、merge commitではなくrebaseされます。

[GithubでのWeb上からのマージの仕方3種とその使いどころ](https://qiita.com/ko-he-8/items/94e872f2154829c868df)の記事がわかりやすいです。

**推奨シーン**
- 全シーン

**理由**
- ブランチの分岐や何をマージしたか記録を残したいため

#### Always suggest updating pull request branches
<img width="700" alt="Rebase and merge" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671490/8989e4a2-8828-1010-718f-76892b7dc527.png">

**<font color="LimeGreen">有効</font>**

**機能について**
<img width="700" alt="Rebase and merge" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671490/c22df68a-ba08-ef47-0a3d-2655de040273.png">
Pull Request作成後に、ベースブランチが更新された場合、ソースブランチの更新を提案してくれるようになります。

[コピペで学ぶチュートリアル: GitHub Pull Request の update手法2種類を試す](https://zenn.dev/richardimaoka/articles/6c36be1256c4fa)の記事がわかりやすいです。

**推奨シーン**
- 全シーン

**理由**
- Pull Request作成後にブランチに更新があった場合、簡単にupdateできるようにするため

#### Automatically delete head branches 
<img width="700" alt="delete head branches " src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671490/2824de17-1464-9d39-aaa9-44b2d882a656.png">

**<font color="LimeGreen">有効</font>**

**機能について**
Pull Requestをマージすると、ソースブランチを自動的に削除するようになります。

**推奨シーン**
- 全シーン

**理由**
- マージ済みの不要になったブランチを手動で削除するのが面倒なので

### 1.1.4 Pushes
#### Limit how many branches and tags can be updated in a single push
<img width="700" alt="pushes" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671490/45970041-683f-e7a8-f511-15a7fd11c3fe.png">

**<font color="LimeGreen">有効</font>**

**機能について**
複数のブランチが一度のpushでまとめて更新される場合、ブロックする機能です。

**推奨シーン**
- 全シーン

**理由**
- ``git push origin –mirror``などで誤ってリモートリポジトリを破壊しないため。詳細は[Block potentially destructive Git pushes](https://github.blog/changelog/2022-06-15-block-potentially-destructive-git-pushes/)が参考になります。

## 1.2 Access
### 1.2.1 Moderation options
#### Code review limits
<img width="700" alt="Code review limits" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671490/3488f323-0903-fe32-ab81-da184f8606bf.png">

**<font color="LimeGreen">有効</font>**

**機能について**
Pull Requestの「承認」「変更要求」を明示的に許可したユーザだけが行えるようになります。

**推奨シーン**
- 全シーン

**理由**
- Publicリポジトリで開発する際に、意図しないユーザによるPull Requestの承認が行われないようにするため

## 1.3 Branches
### 1.3.1 Default branch
<img width="600" alt="default branch" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671490/9b3e10e6-7a77-7448-9a8e-af79cb521552.png">

main

**機能について**
リポジトリのデフォルトブランチを指定する機能です。

**推奨シーン**
- 全シーン

**理由**
- 深い理由なし。昨今一般的な、``main``をデフォルトブランチとする。

### 1.3.2 Branch protection rules
#### Branch name pattern
main

#### Require a pull request before merging
**<font color="LimeGreen">有効</font>**

その他以下のような設定を使ってます。
<img width="700" alt="Protect matching branches" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671490/98920679-3e5f-b115-9cb8-17caf35cbf9b.png">
※Require branches to be up to data before mergingは適宜、自分が定義したCIパイプラインのワークフロー名などを指定してください。

**機能について**
指定したブランチへマージする際のルールを設定できます。

**推奨シーン**
- 全シーン

**理由**
- デフォルトブランチへのマージは、変更内容をレビューするためPull Requestを必須としたい。
- レビュー承認を必須とすることで、未レビューのコードがマージされることを避けたい。
- レビュー承認後にコードに変更があった場合、再度レビューを行いたい。
- CIパイプラインの実行結果もマージ条件としたい。
- レビュー指摘に全て対応完了してから、マージしたい。

## 1.4 Tags
### 1.4.1 Protected tags
<img width="600" alt="tags" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671490/ba9db860-0d8e-bd7f-e663-a92434441a5f.png">

[0-9].[0-9].[0-9]

**機能について**
指定した正規表現にマッチするタグの削除を抑止します。

**推奨シーン**
- 全シーン

**理由**
- セマンティックバージョニングに従ってつけたタグを保護するため

## 1.5 Actions
### 1.5.1 General
#### Actions permissions
Allow OWNER, and select non-OWNER, actions and reusable workflows
<img width="700" alt="Actions permissions" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671490/00978346-460e-604a-19ee-3c4da5e5d167.png">

- Allow actions created by GtiHub: **<font color="LimeGreen">有効</font>**
- Allow actions by Marketplace verified creators: **<font color="LimeGreen">有効</font>**

**機能について**
指定したルールに基づいて、GitHub Actionsのworkflowの実行を許可します。

**推奨シーン**
- 全シーン

**理由**
- 悪意のあるworkflowなどが混入しないようにするため。
- 基本的にプロジェクトで必要なworkflowは作成するため、認証済みのworkflowのみ使えれば基本OK。

## 1.6 Codespaces
### 1.6.1 Prebuilds
#### Access and cost control
以下のように設定しています。
<img width="700" alt="Prebuilds" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671490/621f917a-f39c-951d-8944-2c0f437b1a6a.png">

**機能について**
Visual Studio Code/実行基盤をブラウザから利用できる[Codespaces](https://github.com/features/codespaces)のdevcontainerを高速起動するため、事前にビルドするための設定を行います。

**推奨シーン**
- 全シーン

**理由**
- On configuration changeとすることでprebuildの実行を最小限とする
    - GitHub Actionsで実行されるため、prebuildしすぎるとGitHub Actionsの実行時間無償枠が減ってしまう。
        - 参考：[プレビルドの構成](https://docs.github.com/ja/codespaces/prebuilding-your-codespaces/configuring-prebuilds#prerequisites)
    - devcontainer内のライブラリなどは更新されないため、定義自分で更新する。
- Reduce prebuild available to only specific regionsを有効化することで、よく使うリージョン以外にdevcontainerが生成されストレージを食うことを抑止する
    - 無料枠はストレージ15GB/月となっている。　
        - 参考： [個人用アカウントに含まれる月間ストレージとコア時間](https://docs.github.com/ja/billing/managing-billing-for-github-codespaces/about-billing-for-github-codespaces#monthly-included-storage-and-core-hours-for-personal-accounts)

## 1.7 Security
### 1.7.1 Code security and analysis
#### Dependabot
<img width="700" alt="dependabot" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671490/207a151b-330a-7ad1-ec95-2a65cb39f77f.png">

- Dependabot alerts: **<font color="LimeGreen">有効</font>**
- Dependabot security updates: **<font color="LimeGreen">有効</font>**
- Dependabot version updates: **<font color="LimeGreen">有効</font>**

**機能について**
<img width="500" alt="Dependabot logo" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671490/008e0c31-8056-b4af-3165-e153c9de92df.png">

[Dependabot](https://github.com/dependabot/dependabot-core)を用いて、依存ライブラリの脆弱性チェックなどが実施できるようになります。

**推奨シーン**
- 全シーン

**理由**
- 依存ライブラリの脆弱性チェックやセキュリティアップデート・バージョンアップを自動検知できるようにするため。

#### Code scanning
<img width="500" alt="code scanning" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671490/39004cbf-24f0-775a-4707-56bb758e5569.png">

**<font color="LimeGreen">有効</font>**

**機能について**
GitHub Actionsのworkflowでソースコードの静的解析を行います。

**推奨シーン**
- 全シーン

**理由**
- ソースコードの静的解析を実施し、コードの品質を高めるため

### 1.7.2 Secrets
#### Actions
<img width="500" alt="Secrets" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671490/67df2e55-3ce2-84b4-7371-3387bdb7424d.png">

- ACTIONS_RUNNER_DEBUG: true
- ACTIONS_STEP_DEBUG: true

**機能について**
上記環境変数を定義することで、GitHub Actionsのworkflowログがデバッグログレベルまで確認できるようになります。

**推奨シーン**
- 全シーン

**理由**
- GitHub Actionsのworkflowログは標準では、大した情報量がないためworkflowが失敗したときに原因を把握できるようにするため
    - 参考： [[GitHub]Actionsの動作確認時は忘れずにACTIONS_RUNNER_DEBUGとACTIONS_STEP_DEBUGを設定しよう](https://dev.classmethod.jp/articles/set-secrets-before-actions-test/)

# 2. Repository Templates
以下2つのテンプレートについて紹介します。
- GitHub Issue Template
- GitHub Actions

## 2.1 GitHub Issue Template
<img width="500" alt="issue template" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671490/a66ad430-8227-3465-f0ae-b0dd9bb5335f.png">

リポジトリの **Settings > General > Features > Issues > Set up templates** をクリックします。
ワイは[codeforamerica/howto](https://github.com/codeforamerica/howto/blob/master/issue_template.md)を参考にIssueテンプレートを作ってます。

```md:feature_request.md
#### Description
A clear and concise description of what the issue is about.

#### Screenshots
![Downhill Windmills](http://i.giphy.com/KO8AG2EByqkFi.gif)

#### Files
A list of relevant files for this issue. This will help people navigate the project and offer some clues of where to start.

#### To Reproduce
If this issue is describing a bug, include some steps to reproduce the behavior.

#### Tasks
Include specific tasks in the order they need to be done in. Include links to specific lines of code where the task should happen at.
- [ ] Task 1
- [ ] Task 2
- [ ] Task 3

Remember to use helpful labels and milestones. If you use the "help wanted" label, Code for America will [promote it widely](http://www.codeforamerica.org/geeks/civicissues).
```

他にも[devspace/awesome-github-templates](https://github.com/devspace/awesome-github-templates)に参考になるテンプレートが色々あります:v:

## 2.2 GitHub Actions
### Dependabot version updates
<img width="800" alt="dependabot" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671490/b727756f-c274-2e7d-8b15-5e184e22368c.png">

リポジトリの **Settings > Security > Code security and analysis > Dependabot version updates > Set up templates** をクリックします。

以下のような定義を作成します。
※利用するpackage-ecosystemやディレクトリ構成に応じて都度調整ください

```yml:dependabot.yml
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for all configuration options:
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates

version: 2
updates:
  - package-ecosystem: "npm"
    directory: "/"
    schedule:
      interval: "daily" #インターバルや実行時間帯はお好みで
      time: "06:00"
      timezone: "Japan"
    commit-message:
      prefix: "Common"
      include: "scope"
    labels:
      - "dependencies"  #ラベルは適宜選択・作成する
  - package-ecosystem: "npm"
    directory: "src/"   #Dependabotはリポジトリ全体を再帰的にチェックしてくれないので、検査対象のディレクトリを都度指定する
    schedule:
      interval: "daily"
      time: "06:00"
      timezone: "Japan"
    commit-message:
      prefix: "Frontend"
      include: "scope"
    labels:
      - "dependencies"
```

### パッチバージョンの自動マージ
<img width="800" alt="dependabot pull request" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671490/f336012e-f47f-095e-151c-095757efec3c.png">

Dependabotにバージョンアップチェックをしてもらうようになると、上図のようにPull Requestがどんどん溜まっていくのでパッチバージョンのバージョンアップPull Requestの自動マージを導入します。

:::note warn
注意
パッチバージョンであっても自動マージはバグや障害の原因の1つになり得るので、自動テストなどとセットで導入をおすすめします。自動マージの導入はメリット・デメリットを把握した上でご検討ください。
:::

リポジトリルート直下の``.github/workflows``配下に自動マージのworkflowを作成します。

```yml:dependabot-auto-merge.yml
ame: Dependabot auto-merge
on: pull_request_target

permissions:
  pull-requests: write
  contents: write

jobs:
  dependabot:
    runs-on: ubuntu-22.04
    if: ${{ github.actor == 'dependabot[bot]' }}
    steps:
      - name: Dependabot metadata
        id: metadata
        uses: dependabot/fetch-metadata@v1.3.5
        with:
          github-token: '${{ secrets.GITHUB_TOKEN }}'
      - name: Enable auto-merge for Dependabot PRs
        if: ${{ steps.metadata.outputs.update-type == 'version-update:semver-patch' }}
        run: gh pr merge --auto --merge "$PR_URL"
        env:
          PR_URL: ${{github.event.pull_request.html_url}}
          GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
```

以下記事が参考になります。

https://dev.classmethod.jp/articles/github-dependabot-auto-merge/

### Code scanning
リポジトリの **Settings > Security > Code security and analysis > Code scanning > Set up** をクリックします。
<img width="800" alt="code scanning" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671490/6acfaaff-68b7-4e19-d1b4-8b4f571817a3.png">


様々なworkflowが選択できますが、ワイはGitHub公式が提供する **CodeQL Analysis** を利用しています。
<img width="800" alt="code scanning" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671490/b96dcfd4-0d97-1d77-8b99-4b441121c1c5.png">


生成されたworkflowを適宜修正してpushします。

<details><summary>codeql.yml</summary>

```yml:codeql.yml
# For most projects, this workflow file will not need changing; you simply need
# to commit it to your repository.
#
# You may wish to alter this file to override the set of languages analyzed,
# or to provide custom queries or build logic.
#
# ******** NOTE ********
# We have attempted to detect the languages in your repository. Please check
# the `language` matrix defined below to confirm you have the correct set of
# supported CodeQL languages.
#
name: "CodeQL"

on:
  push:
    branches: [ "main" ]　　#適宜実行タイミングを変更
  pull_request:
    # The branches below must be a subset of the branches above
    branches: [ "main" ]
  schedule:
    - cron: '22 7 * * 2'  #適宜実行頻度・時間帯を変更

jobs:
  analyze:
    name: Analyze
    runs-on: ubuntu-latest
    permissions:
      actions: read
      contents: read
      security-events: write

    strategy:
      fail-fast: false
      matrix:
        language: [ 'javascript' ] #適宜言語を変更
        # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
        # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support

    steps:
    - name: Checkout repository
      uses: actions/checkout@v3

    # Initializes the CodeQL tools for scanning.
    - name: Initialize CodeQL
      uses: github/codeql-action/init@v2
      with:
        languages: ${{ matrix.language }}
        # If you wish to specify custom queries, you can do so here or in a config file.
        # By default, queries listed here will override any specified in a config file.
        # Prefix the list here with "+" to use these queries and those in the config file.

        # Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
        # queries: security-extended,security-and-quality


    # Autobuild attempts to build any compiled languages  (C/C++, C#, Go, or Java).
    # If this step fails, then you should remove it and run the build manually (see below)
    - name: Autobuild
      uses: github/codeql-action/autobuild@v2

    # ℹ️ Command-line programs to run using the OS shell.
    # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun

    #   If the Autobuild fails above, remove it and uncomment the following three lines.
    #   modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance.

    # - run: |
    #   echo "Run, Build Application using script"
    #   ./location_of_script_within_repo/buildscript.sh

    - name: Perform CodeQL Analysis
      uses: github/codeql-action/analyze@v2
      with:
        category: "/language:${{matrix.language}}"
```

</details>

# まとめ
おすすめのGitHubリポジトリ設定を紹介させていただきました!
この機会にGitHubリポジトリの設定を見直して快適な開発ライフを過ごしましょう:star2:

[GitHub Docs -REST API- Repositories](https://docs.github.com/en/rest/repos?apiVersion=2022-11-28)
いずれ、APIを使って簡単にリポジトリ設定ができるように整備したい...