Deno版dependabot（UDD）で自動アップデート

depandabotはライブラリを自動アップデートしてくれるGitHubの機能です。
dependabotは今のところDenoには対応していないようですが、3rd party製ツールである**UDD**を使うとdependabotと同じように自動アップデートをかけられます。

# Deno版dependabot、「UDD」の使い方

UDDは「Update Deno Dependencies」の略で、その名の通りDenoのモジュールをアップデートしてくれるツールです。

https://github.com/hayd/deno-udd

このツールをGitHub Actionsを通して動かすことで、dependabotのような自動アップデートができます。

#### workflowの書き方

GitHub Actionsでuddを動かすには、以下のようなworkflowファイルをリポジトリに設置します。

```yml:.github/workflows/update.yml
name: deno-udd

on:
  push:
    branches:
      - main
  schedule:
    - cron: "0 9 25 * *" # 毎月25日 9時 0分に実行（※毎日／毎週実行するように変更することもできる）

jobs:
  update-deno-dependencies:
    permissions: write-all
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@master
      - uses: denoland/setup-deno@v1
      - name: run deno-udd # UDDで一括アップデート
        id: run-deno-udd
        env:
          NO_COLOR: true
        run: |
          UDD_RESULT=`deno run -A https://deno.land/x/udd/main.ts $(find . -type f | grep -E ".*\.([mc]?(ts|js)|(ts|js)x?)$" -)`
          UDD_RESULT="${UDD_RESULT//'%'/'%25'}"
          UDD_RESULT="${UDD_RESULT//$'\n'/'%0A'}"
          UDD_RESULT="${UDD_RESULT//$'\r'/'%0D'}"
          echo "::set-output name=UDD_RESULT::$UDD_RESULT"
      - name: Create Pull Request # プルリクを開いてアップデートを反映させる
        uses: peter-evans/create-pull-request@v3
        with:
          commit-message: "chore(deps): update deno dependencies"
          title: Update Deno Dependencies
          body: |-
            Some external modules are stale.
            <details><summary>Details</summary><div>
            
            ```
            ${{ steps.run-deno-udd.outputs.UDD_RESULT }}
            ```
            
            </div></details>
          branch: deno-udd
          author: GitHub <noreply@github.com>
          delete-branch: true
```

上記のworkflowファイルを設定すると、自動で下の画像のようなプルリクエストが開かれ、外部ライブラリを自動アップデートしてくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678625/212fdeb6-724c-3375-780a-8e04914b4504.png)

便利ですね～

:::note warn
Deno標準ライブラリについては毎週新しいバージョンが公開されるため、毎週or毎日UDDを実行するように設定すると、毎週プルリクが開かれることになります。

リポジトリが増えてくるとこれが結構うるさいため、上記のworkflowでは毎月25日に実行されるように設定しています。
:::

#### テストが実行されない時

ただし上のworkflowには欠点があって、UDDのプルリクが開かれた時、push時に走るように設定したworkflowが実行されないという問題があります。（[参考](https://github.com/peter-evans/create-pull-request/issues/48)）
push時にテストが走るように設定していても実行されないので、ちょっと困ります。

これは`peter-evans/create-pull-request`側の問題のようで、GitHub Actions上で使うトークンの権限に関する制限のようです。
対策としては、以下↓のリンクに書いてある通り、GitHubのパーソナルアクセストークン（PAT）を設定する方法などがあるようです。

https://github.com/peter-evans/create-pull-request/blob/main/docs/concepts-guidelines.md#triggering-further-workflow-runs

または、UDDによって開かれたプルリクエストを**一旦closeしてからopenする**ことでも他のworkflowをトリガーできるようです。

#### deps.tsやimport-mapいらず？

Denoでは、依存関係を記述する場所を1か所にまとめてアップデートしやすくする手法として、`deps.ts`や`import-map.json`が[使われています](https://deno.land/manual/examples/manage_dependencies)。
ただUDDを使うとアップデートの手間もかからないですし、deps.tsやimport-mapは別に使わなくてもいいのかなと思います。（URLの入力に補完が効くので、import文に直接URLを書いてしまった方が楽）

もちろんPRのレビューの楽さからいうと、1か所に依存関係をまとてしまったほうがいいのかもしれませんが。

# まとめ

- dependabotはDeno非対応だが、代わりに使える3rd party製ツール（**UDD**）がある
- GitHub Actionsを使って動かす
- 使用されるトークンの権限によっては別のworkflowが実行されない
  - PATを設定するか、プルリク自体を一旦closeしてからopenすることで解決
- `deps.ts`や`import-map.json`が無くても大丈夫かも