【AWS】使用 GitHub Action 自動化部屬 Hugo 靜態網頁至 S3

Hugo 是一項快速的現代化靜態網頁生成工具,也是由可愛的水獺 Golang 製作而成的!( 迷之音: 牠明明是地鼠 )。在 Hugo 的架構中,我們主要需要撰寫 YAML 格式的 data 並讓 Hugo 幫我們以 template 的方式塞進 HTML 中,基本上與 Flask Jinja2 template 或是 Django Template 相同的概念。這對於想要快速產生網站的需求來說,真的是一大利器!

對於熱愛新技術和自動化的我來說,當然要把 Hugo 尬 GitHub Action 迸出新滋味!( 年代梗 XD )

Hugo 是一項快速的現代化靜態網頁生成工具,也是由可愛的水獺 Golang 製作而成的!( 迷之音: 牠明明是地鼠 )。在 Hugo 的架構中,我們主要需要撰寫 YAML 格式的 data 並讓 Hugo 幫我們以 template 的方式塞進 HTML 中,基本上與 Flask Jinja2 template 或是 Django Template 相同的概念。這對於想要快速產生網站的需求來說,真的是一大利器!

對於熱愛新技術和自動化的我來說,當然要把 Hugo 尬 GitHub Action 迸出新滋味!( 年代梗 XD )


Hugo Installation

你/妳可以在官方安裝文件中找到更詳細以及更多作業系統的安裝方法,在這邊我就不重複介紹各種安裝方法了。我個人使用的作業系統就是 Window 10 + Scoop 做套件管理,這邊分享一下,簡簡單單的三行就可以安裝好 Hugo 囉!

1Set-ExecutionPolicy RemoteSigned -Scope CurrentUser # Optional: Needed to run a remote script the first time
2irm get.scoop.sh | iex
3scoop install hugo

儘管在本地端安裝簡單順利,但是我個人淺見認為在做 CI/CD Pipeline 時,要設定好 Hugo 環境還是有點小麻煩,所以為了讓我們的人生更快樂更幸福,選用好的第三方 GitHub Action 是很重要的!

Github Action

先條列好 CD Pipeline 中的所有任務是至關重要的:

  1. Get our source code ( GitHub Action )
  2. Setting up AWS credential ( GitHub Action )
  3. setup Hugo ( GitHub Action )
  4. Hugo Build ( Hugo CLI )
  5. Deploy to S3 ( AWS CLI )

CD Pipeline 中使用了三種 GitHub Action 來幫助我們設置環境

actions/checkout@v3 用於 pull source code. aws-actions/configure-aws-credentials@v1 用於設定 aws credential. peaceiris/actions-hugo@v2 用於安裝 Hugo.

AWS CLI

此外,為了讓 AWS CLI 擁有權限上船靜態網頁至 S3,需要額外建立擁有 programmatic access 的 AWS User,這邊給讀者參考官方建立教學,我就不在這裡過度撰寫細節了。

這步驟使用官方的 aws-actions/configure-aws-credentials@v1 GitHub Action 來設定,也就讓我們無須痛苦地跟 stdin 打交道了~

記得不要把 Credential 明文寫在 GitHub Action Script 中!!

放在 Github Secret 中確保 Credential 的加密和保護!

1- name: Configure AWS credentials
2  uses: aws-actions/configure-aws-credentials@v1
3  with:
4    aws-access-key-id: '${{ secrets.AWS_ACCESS_KEY_ID }}'
5    aws-secret-access-key: '${{ secrets.AWS_SECRET_ACCESS_KEY }}'
6    aws-region: '${{ secrets.AWS_REGION_ID }}'

Hugo Build

接著 Hugo Build 產生靜態網頁

對,沒錯使用第三方 Gthub Action 就是可以如此簡單的安裝並打包

1- name: setup hugo
2  uses: peaceiris/actions-hugo@v2
3  with:
4    hugo-version: latest
5    extended: true
6- name: Hugo Build
7  working-directory: ./
8  run: hugo

S3 Sync

最後,我們使用 AWS CLI aws s3 sync 同步地端與 s3 的檔案

1- name: Deploy
2  run: |
3    aws s3 sync --acl public-read ./public s3://${{ secrets.S3BUCKET_NAME }} --delete    

至於為何使用 aws s3 sync 而不是 aws s3 cp 呢?

因為 sync 可以對比新舊版本的檔案,並將不存在於新版本的檔案刪除,這對於常變動的圖檔或是靜態文本幫助方常大!

相較於其他自動化流程,這算是較簡單的 Pipeline 很適合初學者拿來當專案練習,除此之外,S3 + Cloudfront 也非常適合作為靜態網頁的部署,單純使用 S3 部屬的話,根本幾乎不需要費用!( 當然要用 route53 + cloudfront 的話就要大概 1020 塊的費用啦

All rights reserved,未經允許不得隨意轉載
使用 Hugo 建立
主題 StackJimmy 設計