# Github Action + S3 微型 CI/CD 實務 :::info 前情提要我們建立了一個文檔網站並透過 Github 管理服務文件,進一步希望能結合版本控制和快速部署環境 ::: [TOC] ## 學習目的 上線的網站如有新的資訊希望修改,除了透過 github進行版本控制,也希望能節省未來更新作業的部署流程 構想使用Github + Action 組合建構一個微型的 CI/CD 流程,達成自動化部署更新環境  ## 事前準備 需要準備以下內容: 1. AWS 帳號 2. Github 帳號 4. IDE tools ## Github Action 是什麼 GitHub Actions 是 GitHub 提供的一項功能,它允許自動化和客製化你的軟體開發工作流程。使用 GitHub Actions,可以在程式碼倉庫中設定各種操作(Actions),例如建置、測試、部署等,以回應各種事件,如程式碼推送、合併請求等。這使得整個軟體開發生命週期的自動化變得更加容易。 核心是透過 YAML 檔案定義的工作流程(workflow)。每個工作流程由一個或多個作業(jobs)組成,每個作業又包含一系列的步驟(steps)。每個步驟代表一個單獨的任務,可以是執行命令、呼叫操作、或其他自訂操作。 ## 建立 AWS 訪問金鑰 :::info 在前面我們為了讓 AWS S3 安全得只提供 Cloudfront 能夠訪問快取內容,設置了 cloudfront OAC 及限制了 S3 訪問權限。 我們需要讓 Github Action 能夠同步 push 上 Github 的文件 ::: 建立 AWS IAM User,我們只需要連線的 access key,在最小訪問控制權限內,這裡不需要勾選 「Provide user access to the AWS Management Console」  選擇直接附加策略,搜尋 S3 可以到預設的 policy 有一筆 「AmazonS3FullAccess」,這邊預計使用到 s3 sync、delete 的動作選擇該權限,「Create User」完成建立  選擇創建好的 IAM User 接著要建立訪問金鑰,選擇「Security credentials」  建立 Access Key 選擇「Create access key」  這裡會看到一排使用 key 的建議,我們需要讓 Github Action 上的運行環境使用 AWS CLI,這裡需要選擇第一個透過 CLI 訪問  完成後會得到一組 Access key & Secret access key 將這組 key 記下後續會用到  ## 建立 Github Action 訪問 key 首先我們將 AWS 的金鑰及 S3 Bucket 地址等 key&value 建立在 Github Repository secrets 裡  :::success AWS accesskey Name 的值為: AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_S3_BUCKET_NAME ::: ## 建立 Github Action 先建一個 workflows 在專案裡建立一個 folder 命名為「.github/workflows」該目錄提供存放 workflows 運行環境 YAML 文件,工作結構參考如下圖:  :::success 參考閱讀 [Github Action](https://docs.github.com/en/actions/quickstart) ::: 了解工作結構後,接著我們要開始編寫需要讓 Action 做哪些事情,在專案目錄下的「.github/workflows」裡面建立 <example>.yaml 文件  ```yaml //workflow 的名稱// name: s3Sync //定義工作流的觸發條件,工作流會在每次推送到 "main" 或 "master" 分支時觸發// on: push: branches: - main - master //定義一個名為 "build" 的工作,將在最新版本的 Ubuntu 操作系統上運行,這裡使用提供的免費 GitHub-hosted runners // jobs: build: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v2 //使用自定義行動 hannut91/aws-cli 的版本 1.18.43 來顯示 AWS 命令行界面(CLI)的版本// - name: version of aws-cli uses: hannut91/aws-cli@1.18.43 with: args: --version // 當前目錄的內容部署到 S3 存儲桶。並使用 AWS-Cli s3 sync 同步命令,刪除在 S3 存儲桶中存在但本地不存在的任何文件。使用環境變數 secrets 提供 AWS 憑證和區域作為環境變數。// - name: Deploy to S3 uses: hannut91/aws-cli@1.18.43 with: args: s3 sync . s3://${{ secrets.AWS_S3_BUCKET_NAME }}/ --delete env: AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} AWS_DEFAULT_REGION: ap-northeast-1 ``` :::info actions/checkout 是 GitHub Actions 中的一個預建動作,目的是將代碼存儲庫的內容檢出(checkout)到 GitHub Actions runner 的工作目錄中。這個動作通常是 GitHub Actions 工作流的一個開始階段,以確保工作目錄中包含代碼庫的最新版本。 具體動作執行以下操作: clone 或 update 指定的存儲庫 檢出指定的提交或分支 ::: :::info 在同步到 AWS S3 時會需要使用到 AWS CLI 指令集,參考在 Github Action Marketplase 上人家製作好的 [hannut91/aws-cli@1.18.43](https://github.com/hannut91/aws-cli) ::: ## 自動部署驗證 重新修改內容後提交 git push,在Github 控制板上 Actions 裡面將會看到 workflows 有一筆剛剛建立的 name 正在運行,點選後可以看到正在運行的流程狀態  成功運行完部署後,可以看到整體流程都沒有報錯,並可以分析每個流程所消耗的時間  AWS S3 上查看檔案異動時間驗證已完成部署  ## 延伸閱讀 [Doscify 架設私有文檔網站](https://hackmd.io/Ep_qspD6QmOVGUyrE5eAbg) [AWS S3+Cloudfront 建立靜態網站](https://hackmd.io/krdTdumATTWXnoCTxPaYJA) [Git & Github 版本控制](https://hackmd.io/7eIaOpMpSt6OMaC_TVBKlA) ---
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up