業務でAzure Filesに対してgithubのリポジトリ内容を継続的に反映させる場面があり、いい感じのGithub Actionsあるだろうと思っていたら意外になかったので、この際だから作ってみた。
ソースコードはこちら
Azure Files用のJavaScript SDKを使ってごにょごにょすればいけるかなー思っていたところ、Github ActionsはDockerコンテナ使ったアクションも作れるようなので、Azure CLIを使えば簡単にいけるなと思い、今回はDockerコンテナを使った自作アクションを構築した。
ただ、Dockerコンテナだと、Linux環境でしか動かなかったり(MacOS、Windowsでは動かない)、アクションを実行す際にコンテナのビルドおよび取得のレイテンシにより、速度が遅くなるなどいろいろ制限がある。
ディレクトリ構成
今回作成したアクションのディレクトリ構成はこんな感じ
├── .github
│ └── workflows
│ └── test.yml
├── Dockerfile
├── LICENSE
├── README.md
├── action.yml
└── entrypoint.sh
Dockerfileの作成
アクションの中でAzure CLIを実行させたいので、初めからAzure CLIがインストールされているMicrosoftの公式イメージをベースイメージとする。
FROM mcr.microsoft.com/azure-cli COPY entrypoint.sh /entrypoint.sh RUN chmod +x entrypoint.sh ENTRYPOINT ["/entrypoint.sh"]
アクションのメタデータファイルの作成
こちらを参考にし、アクションの入力、出力、エントリポイントなどを定義していく。
name: 'Azure Files Upload' description: 'This action uses the Azure CLI to upload the selected directory to Azure Files.' auther: 'rnakamine' branding: icon: 'upload-cloud' color: 'blue' inputs: connection_string: description: 'The connection string for the storage account.' required: true source: description: 'The directory to upload files from.' required: true destination: description: 'The destination of the upload operation.' required: true extra_args: description: 'Extra arguments. Can passing flags like `--pattern` or `--destination-path`' required: false runs: using: 'docker' image: 'Dockerfile'
name
アクションの名前
description
アクションの短い説明
auther
アクションの作者の名前
branding
アクションをパーソナライズして見分けられるようにするため、カラーとアイコンを指定してバッジを作成する。 カラーとアイコンはこちらから指定できる。(自分で画像もアップロードできたはず。。)
今回指定したのはこんな感じ
inputs
アクション実行時に使用するデータを指定できる。GithubはinputsパラメータをINPUT_<パラメータ名の大文字>
のような形で環境変数として保存する。
runs
Dockerアクションの場合は実行時に使用するイメージを設定する。 Dockerfileを使用する場合
runs: using: 'docker' image: 'Dockerfile'
パブリックなDockerレジストリから使用する場合
runs: using: 'docker' image: 'docker://debian:stretch-slim'
エントリポイントの作成
inputsで受け取ったパラメータを使用し、Azure CLIのaz storage file
コマンドを使用してAzure Filesに対して指定したディレクトリへファイルをアップロードさせている。
#!/bin/sh set -e if [ -z "$INPUT_CONNECTION_STRING" ]; then echo "connection_string is not set. Quitting." exit 1 fi if [ -z "$INPUT_SOURCE" ]; then echo "source is not set. Quitting." exit 1 fi if [ -z "$INPUT_DESTINATION" ]; then echo "destination is not set. Quitting." exit 1 fi EXTRA_ARGS=${INPUT_EXTRA_ARGS:""} az storage file upload-batch --connection-string $INPUT_CONNECTION_STRING --source $INPUT_SOURCE --destination $INPUT_DESTINATION $EXTRA_ARGS
extra_args
でさらに引数を追加できるようにしているので、inputsに無いaz storage file
コマンドのオプションはこちらで指定できる。
動作確認
usesで./
と指定して動作確認ができる。今回は以下のようにjobを作って動作確認した。
jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - uses: ./ with: connection_string: ${{ secrets.AZURE_STORAGE_CONNECTION_STRING }} source: . destination: test-share extra_args: "--dryrun"
あとは、リリースしてGithub ActionsのMarketplaceに登録しれば完了。リリースするまでの手順に関してはまた別のタイミングで記事を書いていければと思う。
感想
割とハードルが高いと思っていたが、意外とすんなり作ることができた。 今回作ったやつはそんなに大したことしていないが、自作アクションの作成までの流れを知れてよかった。 時間があれば、JavaScriptで作ってマルチプラットフォームで対応できるようにしたい。