🦕

Deno製CLIツールをGitHub Actionsで使う

2021/08/21に公開

先日connpassで開催された、toranoana.deno #0で発表を行いました。
https://toranoana-lab.hatenablog.com/entry/2021/08/18/184057

その際、Deno製のCLIツールをGitHub Actionsで使う方法を紹介しました。
こちらにも記事として残しておきます。

GitHub Actions内でDeno製CLIを実行する方法

DenoのCLIツールとは要するにdeno installでインストールするDenoのスクリプトです。
GitHub Actionsでの実行には、以下の2種類が考えられます。

  1. deno installしてから実行する
  2. 直接deno runする

なお、どちらの場合も、事前にdenoland/setup-deno[1]を実行し、denoコマンドを使えるようにしておく必要があります。

deno installしてから実行する

普通(?)に考えられる方法です。
環境内に目的のコマンドをインストールし、それを実行します。

velociraptorの例

たとえば、Deno製タスクランナーのVelociraptorではこの方法が取られています。
https://velociraptor.run/docs/github-actions/

こちらがVelociraptorのGitHub Actions用リポジトリです。
https://github.com/jurassiscripts/setup-velociraptor

以下のaction.ymlが設定されています。

action.yml
name: Setup Velociraptor
description: Install Velociraptor scripts manager
author: JurassiScripts
branding:
  icon: terminal
  color: blue
inputs:
  velociraptor-version:
    description: Version to use
    default: latest
    required: false
  velociraptor-alias:
    description: Alias name
    default: vr
    required: false
runs:
  using: composite
  steps:
    - run: |
        case "${{ inputs.velociraptor-version }}" in
          "latest") ;; "") ;;
          *) VERSION=@${{ inputs.velociraptor-version }} ;;
        esac
        deno install --allow-all --name ${{ inputs.velociraptor-alias }} https://deno.land/x/velociraptor$VERSION/cli.ts
        echo "/home/runner/.deno/bin" >> $GITHUB_PATH
      shell: bash

内部でdeno installが実行されています。これにより、このアクション実行以降、ワークフロー内でvrを使えるようになります。

CIでの使用例はこちら。
https://zenn.dev/kawarimidoll/articles/b6570176eaaaea#ciでの使用

eggsの例

また、Denoのモジュールレジストリである https://nest.land のCLIツールであるeggsでも、この方法が説明されています。
https://docs.nest.land/eggs/publishing-a-module#automatic-publishing

直接deno runする

Denoのマニュアルでも示されている通り、オンラインで公開されてるファイルなら、ローカルに保存することなくdeno runで直接実行できます。

https://deno.land/manual@v1.13.1/getting_started/first_steps

つまり、GitHub Actions内でも、目的のコマンドをインストール不要で直接実行することが可能です。

例として、先日公開したDenoteというサービス用のワークフローを紹介しましょう[2]
https://zenn.dev/kawarimidoll/articles/e00d79b97042ee

以下のようにdeno run --allow-read --allow-net --no-check https://deno.land/x/denote/cli/denote.tsと記述することで、レジストリ上のファイルを直接実行しています。
それ以降のものはコマンドの引数です。

.github/workflows/denote_profile.yml
name: Denote profile
on:
  push:
    branches: [master]

jobs:
  build:
    runs-on: ubuntu-latest
    timeout-minutes: 5
    steps:
      - uses: actions/checkout@v2
      - uses: denoland/setup-deno@v1
      - run: >
          deno run --allow-read --allow-net --no-check
          https://deno.land/x/denote/cli/denote.ts register ./denote.yml
          --name kawarimidoll --token '${{ secrets.DENOTE_TOKEN }}'

deno install --allow-read --allow-net --no-check https://deno.land/x/denote/cli/denote.tsdenote register ...に分けても良いのですが、一気に実行することもできるというのがポイントです。

なお、コマンド上でsecrets.DENOTE_TOKEN[3]を渡していますが、実行ログでは以下のようにマスクされるのでご安心を。

おわりに

GitHub Actions上でDeno製のCLIツールを実行する方法を2種類紹介しました。
個人的には、単純にCLIを実行するだけであれば、後者のdeno runで直接実行する方式が好みです。

しかし、コマンドを複数回実行したい場合、都度パーミッションとURLを指定してdeno runを記述するのは煩雑です。
そのような場合はdeno installしてしまったほうが良いでしょう。

これらの方法を使えば、意外と簡単にDenoスクリプトの実行を自動化できます。
興味のある方は是非お試しください。

脚注
  1. ちなみにsetup-denoはNode.jsで動いている ↩︎

  2. toranoana.deno #0で発表したのもこれです ↩︎

  3. Repository environmentとして設定 ↩︎

Discussion