Azure Blob Storage を使った Static website を GitHub Actions でデプロイする

はじめに

しばらく前に作った以下のレジュメサイトの DevOps を Travis CI から GitHub Actions に引っ越した。

cv.kheiakiyama.com

理由としては GitHub Actions を実用したかったためだ。

GitHub Actions のバックエンドが Azure Pipelines の fork 版

新 GitHub Actions 入門 - 生産性向上ブログ

と聞いていた背景と、普段 Azure Pipelines を利用している立場からも GitHub Actions との違いを知りたかった。

Travis CI で構成したときの記事は以下。
kheiakiyama.hateblo.jp

GitHub Actions のドキュメント

ドキュメントは日本語で用意されている。

help.github.com

ただ、Azure Pipelines を知っているせいか、「Artifact」 が「成果物」となっているなど、違和感が多々あり、英語のドキュメントを読むほうがしっくりくるかもしれない。

help.github.com

それにしても Azure Pipelines のドキュメントは英語のみなのに GitHub Actions は違うんですね。。

↓ Azure Pipelines のドキュメント
Azure Pipelines documentation | Microsoft Docs

GitHub Actions での実装

現物は GitHub 上のリンク を参照してもらうとして、定義ファイルの yaml に解説を追記しておく。

name: "release"
on: # rebuild master branch changes
  push:
    branches:
      - master

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2 # 利用する GitHub Actions を ダウンロードするための処理
    - uses: actions/setup-ruby@v1 # jekyll で使う ruby のインストール用 GitHub Action
      with:
        ruby-version: 2.5
    - name: Set up bundler
      run: gem install bundler
    - name: nokogiri dependencies # bundle install で nokogiri を正しくインストールするための依存ライブラリのインストール
      run: |
        sudo apt-get update
        sudo apt-get install libxml2 libxslt1-dev
    - name: jekyll build
      run: |
        bundle install --jobs 4
        ./scripts/cibuild
      env:
        NOKOGIRI_USE_SYSTEM_LIBRARIES: false
    - name: Upload jekyll output # Azure DevOps ではおなじみの Artifact にアップロード、次の Job に受け渡す
      uses: actions/upload-artifact@v1
      with:
        name: jekyll
        path: './_site'

  deploy:
    runs-on: ubuntu-latest
    needs: build
    steps:
    - uses: actions/checkout@v2
    - uses: kheiakiyama/install-azcopy-action@v1 # azcopy のインストール。詳細は別記事で。
      with: 
        version: 'v10'
    - name: Download jekyll output # build job でアップロードした Artifact をダウンロード。 name と同名の path にダウンロードされる
      uses: actions/download-artifact@v1
      with:
        name: jekyll
    - name: azcopy upload jekyll content # azcopy で Blob Storage にコンテンツをアップロード
      run: |
        azcopy --version | grep 'azcopy'
        azcopy --source ./jekyll --destination "$BLOB_CONTAINER_URL" --dest-key ${{ secrets.STORAGE_KEY }} --recursive --quiet --set-content-type
      env:
        BLOB_CONTAINER_URL: 'https://kheiakiyama.blob.core.windows.net/$web'
    - uses: azure/login@v1 # Azure CDN のパージのために azcli でログイン
      with:
        creds: ${{ secrets.AZURE_CREDENTIALS }}
    - name: Azure CLI script # Azure CDN パージ
      uses: azure/CLI@v1
      with:
        inlineScript: |
          az cdn endpoint purge -g kheiakiyama.com --profile-name kheiakiyama-cdn -n cv-kheiakiyama --content-paths '/*'

Travis CI の頃からこのリポジトリは public なのだが、GitHub Actions の実行ログにしてもシークレットは見えないので、特に問題ではない。
(Azure Resource の名前は見せているが、まあ特に問題ないかと)

感想

Azure DevOps の fork というのには納得で、Multi staging build の Azure Pipelines とほぼ同じ使い勝手だった。
Azure Pipelines でいうところの Task は GitHub Actions ではまだ充実していないところがあるという感じ。
Azure 関係の GitHub Actions は結構数がある様子。

GitHub Marketplace · Actions to improve your workflow · GitHub

開発者が 3rd Party の Actions を作れるので、今後 GitHub Actions がどの程度充実していって Azure Pipelines と差がついていくのかを見守っていきたい。