Github Actionsはいいぞ!

Posted on 2020/08/02

ToC

これまでの経緯

以前、WordpressからHugoへの乗り換えの記事を書いたのですが、 その際に記事を全てMarkdown形式に変換してGithubで管理するように変更しました。
移行当初は、Githubから記事を取得して、ローカルでビルド。その後、Webサーバーにアップロードの 作業を行っていたのですが、「とにかく面倒くさい」のと「PCが無いとサイト更新ができない」ので、 ビルドとデプロイの作業をクラウド上で自動化するようにしていました。

これまでも動いてはいたのですが、Github ActionsManual triggers with workflow_dispatchというパラメータを渡してワークフローの 手動実行ができる機能が追加されたので、今回、自動化をさらに改善してみました。

サイト更新の自動化

自動化したい内容は、主に下記の2つです。

  • Hugoを使ったサイトのビルド処理 (Build処理)
  • ビルドコンテンツのWebサーバーへの配備 (Deploy処理)

ただ、実際にサイト公開するためのフローとしては、一旦、テスト環境にDeployして サイトの見た目や内容の見直しと確認を行ってから、本番環境にDeployするという 2段階ですすめることにしました。

graph LR id1[記事作成] --> id2[Gitへ登録] id2 --> id3[サイトBuild処理] id3 --> id4[テスト環境
Deploy] id3 -.テスト環境で
確認後.-> id5[本番環境
Deploy]

フローを見て分かる通り、テスト環境へのDeployまでは、Gitに記事をPushする毎に 実行しても良いのですが、本番環境へのDeployはテスト環境での結果を確認した上で 「手動」で実行したいという部分が大きなポイントになります。

第1世代 (AWS Codebuildでの自動化)

Codebuildには、パラメータを渡してビルドを手動で実行できる機能があったため 初期バージョンは、AWSの Codebuild サービスを利用して実現していました。

仕組みとしては、GithubCodebuildを連携して、Pushイベントをトリガーとして サイトのビルド処理を実行し、後続処理としてテスト環境へのDeployを実行しました。 また、ビルドの状況は、Codebuildの処理結果イベントをEventBridge経由で取得して、 Slack通知する仕組みとしていました。

/posts/2020/08/img/1f6bb570_hu7c1da5a97499f59081a2a8540ebf6696_85351_700x0_resize_lanczos_3.png

この方式でも大きな問題はなかったのですが、本番環境へのデプロイ時にAWSコンソールに ログインしてCodebuildのページを開く必要があり、オペレーションが少し煩わしいというのが 正直なところでした。
その他にも、レンタルサーバーの接続用のIDSecretの管理を別のAWSサービス (SSM Parameter Storeなど)を利用する必要があったり、サイトのビルド結果(Artifacts)を S3などで管理する必要があったりして、処理プロセスの割に各種のサービスを利用する必要があり 構成が少し複雑になるという課題を感じていました。

ちなみにAWSには、Deploy Pipelineを管理する Codedeployというサービスがあるのですが、 費用的に少し高いことと、それほど複雑なビルドPipelineでもないためCodebuildのみを利用して 安価に構築していました。

第2世代 (Github Actionsでの自動化)

workflow_dispatchの登場で、手動によるワークフロー実行ができるようになったので Codebuildによる本番環境へのDeployではなく、Github Actionsでの自動化に機能改善を図りました。

構成は、下記になります。
Githubだけで構成されているので、構成図が第1世代の時よりスッキリとしたように見えます。

/posts/2020/08/img/10fd499e_hubfc21842a06c32b4a6fd88c917be8a91_83585_700x0_resize_lanczos_3.png

また、一般的な処理やよく使うような処理についてはGitHub Marketplaceを含む Github Actionsがたくさん提供されているので、これらを活用することで独自実装をおこなうことなく 高度な処理が実現できることも大きなポイントです。
例えば、actions/checkout@v2では、ソースのチェックアウト時にsubmoduleも含めてチェックアウト するなど、実装すると+アルファになるような部分も非常に簡単に実現できました。
Github Actionsはいいぞ!

そして、Github には、シークレットの管理やビルド結果を管理する機能もあるため、これらを活用することで 構成的にもシンプル化が図れています。

番号処理利用したGitHub Actions
1Checkoutactions/checkout@v2
2HugoサイトBuildpeaceiris/actions-hugo
3ArtifactのUploadactions/upload-artifact@v2
4SlackのNotification8398a7/action-slack@v3
5ArtifactのDownloadactions/download-artifact@v2

処理の成功や失敗もこのような形で通知しています。

/posts/2020/08/img/1f92e071_hu409c7952447b9da4c836c43aa4e9359d_52926_450x0_resize_lanczos_3.png

実際に運用してみると…

はじめ数回は、調子よくBuildもDeployもできていたのですが、突然エラーがでてしまいBuildが全く できなくなってしまいました。(ちょっと焦りました…)

/posts/2020/08/img/e95d60cf_huea3bbb8a60e8e97cb28bf3d0a2dc5232_34301_600x0_resize_lanczos_3.png

エラーメッセージを見ると、「Githubで保持できるArtifactの容量上限に達しているよ」ということ なのですが、無料プランを利用している私の場合には500MBが上限のようです。
現時点では、GithubのUIを利用してArtifactsを一括削除することはできないようなので 1つずつのActionsの結果を開いて、ポチポチ削除して、無事復旧することができました。

Artifactsの作り過ぎには注意したほうが良さそうですが、第2世代の自動化によって サイト管理も結構便利になりました。 やっぱり、Github Actionsはいいぞ!


(実は、はじめはポチポチやっていたのですが、あまりに大変だったので途中で別の作戦に 切り替えたので、その話は別の機会にでも…)

参照