Github Actions actions/checkoutの保存先について

## 概要

Github Actionsでソースコードをcloneする場合は`actions/checkout@v3`を使用しますが、ディレクトリを指定してcloneするときの挙動についてまとめます。

ディレクトリを指定する書式

```yml
        uses: actions/checkout@v3
        with:
          path: path/to/repo-1
```

`with`に`path`を与えると`path/to/repo-1`にリポジトリをcloneします。

その他の全書式はこちらを参照
https://github.com/actions/checkout

checkoutのバージョンによって挙動が大きく異なるので注意が必要です。

## デフォルトワークスペースについて

以下のワードにはデフォルトワークスペースパスが記載されており、このpathにcloneされます。この2つは同一のパスを格納しています、
- `${{ github.workspace }}`
- `${GITHUB_WORKSPACE}`

通常、デフォルトワークスペースには以下のパスが格納されています。(Github Actionsのランナーを用いる場合)
`/home/runner/work/<repo-name>/<repo-name>`

## actions/checkout@v1 (path無指定)

```yml
# リポジトリ名:My-Dev
      - name: Show workspace dir (before)
        run: |
          echo "${{ github.workspace }}"
        # /home/runner/work/My-Dev/My-Devを出力

      - name: No Path
        uses: actions/checkout@v1
      # /home/runner/work/My-Dev/My-Devにcloneされる

      - name: Show workspace dir (after)
        run: |
          echo "${{ github.workspace }}"
        # /home/runner/work/My-Dev/My-Devを出力
```

パスを指定せず、checkoutするとデフォルトワークスペースにcloneされます、
`/home/runner/work/My-Dev/My-Dev`

2段目の`My-Dev`直下に.gitを含むリポジトリ一式がcloneされます。
`/home/runner/work/My-Dev/My-Dev/.git`

`${{ github.workspace }}`はcloneの前後で`/home/runner/work/My-Dev/My-Dev`を指します。

## actions/checkout@v1 (path指定)

```yml
# リポジトリ名:My-Dev
      - name: Show workspace dir (before)
        run: |
          echo "${{ github.workspace }}"
        # /home/runner/work/My-Dev/My-Devを出力

      - name: No Path
        uses: actions/checkout@v1
        with:
          path: path/to/repo-1
      # /home/runner/work/My-Dev/path/to/repo-1にcloneされる

      - name: Show workspace dir (after)
        run: |
          echo "${{ github.workspace }}"
        # /home/runner/work/My-Dev/path/to/repo-1を出力
```

パスを指定した場合、以下に一式がcloneされます。
`/home/runner/work/My-Dev/path/to/repo-1/.git`

`${{ github.workspace }}`は
`home/runner/work/My-Dev/path/to/repo-1`を指します。

path無指定の場合の最大の違いは、
`${{ github.workspace }}/../path/to/repo-1/.git`にcloneされ、
`${{ github.workspace }}`も
`${{ github.workspace }}/../path/to/repo-1`に更新されてしまうことです！

ですので後続のスクリプトで`working-directory`文でディレクトリを変更する必要がありません。
逆に、その他のディレクトリを参照する場合は、`${{ github.workspace }}`からの相対パス指定する必要があります。

## actions/checkout@v2 or v3 (path無指定)
actions/checkout@v1 (path無指定)と同じ

## actions/checkout@v2 or v3 (path指定)

```yml
# リポジトリ名:My-Dev
      - name: Show workspace dir (before)
        run: |
          echo "${{ github.workspace }}"
        # /home/runner/work/My-Dev/My-Devを出力

      - name: No Path
        uses: actions/checkout@v3
        with:
          path: path/to/repo-1
      # /home/runner/work/My-Dev/My-Dev/path/to/repo-1にcloneされる

      - name: Show workspace dir (after)
        run: |
          echo "${{ github.workspace }}"
        # /home/runner/work/My-Dev/My-Devを出力
```

パスを指定した場合、以下に一式がcloneされます。
`/home/runner/work/My-Dev/My-Dev/path/to/repo-1/.git`

`${{ github.workspace }}`は
`/home/runner/work/My-Dev/My-Dev`を指します。

`${{ github.workspace }}/path/to/repo-1`にcloneされ、`${{ github.workspace }}`は変更されません。
このディレクトリにアクセスするためには後続のスクリプトで`working-directory`文でディレクトリ変更指定する必要があります。v2,v3の挙動のほうが素直ですね。

# まとめ

| actions/checkout@? |              clone先              |     `${{ github.workspace }}`の変更     |
| :----------------- | :-------------------------------- | :-------------------------------------- |
| v1(path無)         | `${{ github.workspace }}`         | なし                                    |
| v1(path有)         | `${{ github.workspace }}../path/` | `${{ github.workspace }}../path/`に変更 |
| v2, v3(path無)     | `${{ github.workspace }}`         | なし                                    |
| v2, v3(path有)     | `${{ github.workspace }}/path/`   | なし                                    |


Github Actions職人の皆様の参考になれば幸いです。