LoginSignup
0

posted at

updated at

Deno版dependabot(UDD)で自動アップデート

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

Deno版dependabot、「UDD」の使い方

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

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

workflowの書き方

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

.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

便利ですね~

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

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

テストが実行されない時

ただし上のworkflowには欠点があって、UDDのプルリクが開かれた時、push時に走るように設定したworkflowが実行されないという問題があります。(参考
push時にテストが走るように設定していても実行されないので、ちょっと困ります。

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

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

deps.tsやimport-mapいらず?

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

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

まとめ

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
0