上週我們介紹了 AWS CICD 的架構與運作流程,這次將深入介紹如何建立 CodeBuild 的部分!
CodeBuild 簡介
AWS CodeBuild 的主要功能是編譯、建構並測試程式碼,確保應用程式能在不同環境中順利運行。詳細的建構流程會依據指定的 buildspec.yml 文件進行,這個文件定義了安裝、建構、測試和後處理的各個階段,因此 buildspec.yml 是必不可少的。
建構規範 buildspec.yml
buildspec.yml 文件通常位於程式碼的根目錄下,其中包含了建構過程的各個階段。基本上,buildspec.yml 的結構與其他 CI 系統的配置文件相似,因此如果你有舊的 CI 流程,可以直接參考並改寫成適用於 AWS 的版本。
接下來,我們來看看 buildspec.yml 的各個部分:
版本 version
指定使用的 buildspec 版本,例如 version: 0.2。
設定檔 env
在這一部分,我們可以定義環境變數,這些變數會在建構過程中被引用。有些變數名稱是 AWS 預設的,因此需要特別注意,可以參考 AWS 的環境變數文檔。
階段 phases
建構過程分為四個階段,按順序執行:
install:安裝依賴項,如 SDK、工具、庫等。pre_build:執行建構前的操作,如檢查環境變數、設置配置等。build:實際的建構步驟,如編譯代碼、運行測試、確認 Coding Style 等。post_build:建構後的操作,如部署或將建構產物上傳到 S3。
緩存 cache
這一部分用來定義如何緩存建構過程中的檔案,從而加速後續建構。通常會緩存依賴項,例如 node_modules 或 vendor 等。
建構產物 artifacts
此部分定義了建構完成後需要保存或傳送的檔案。例如,二進位檔、壓縮包(zip、jar)或目錄結構等。
此外,appspec.yml 文件是下一步 CodeDeploy 部署過程的必要文件,記得在 artifacts 中指定此檔案。
建構規範範例
以下是一個簡單的 buildspec.yml 範例:
version: 0.2
env:
GITHUB_TOKEN: "***"
phases:
install:
on-failure: ABORT
runtime-versions:
php: 7.4
nodejs: 10
commands:
- REPO_URL=$(echo ${CODEBUILD_SOURCE_REPO_URL} | sed 's@^https://@@')
- git remote add origin <https://${GITHUB_TOKEN}@$>{REPO_URL}
- BUILD_BRANCH=$(echo ${CODEBUILD_WEBHOOK_BASE_REF} | sed 's@^refs/heads/@@')
- php -v
- apt-get update
- apt-get install -y memcached libmemcached-tools libmemcached-dev
- pecl install memcached
pre_build:
on-failure: ABORT
commands:
- composer config -g github-oauth.github.com ${GITHUB_TOKEN}
- composer install --prefer-dist --optimize-autoloader
- ./scripts/codebuild.sh frontInstall
- ./scripts/codebuild.sh endInstall
build:
on-failure: ABORT
commands:
- composer phpcs
- composer test
post_build:
on-failure: ABORT
commands:
- ls -la
cache:
paths:
- 'vendor/**/*'
- 'node_modules/**/*'
artifacts:
files:
- 'app/**/*'
- 'scripts/**/*'
- 'vendor/**/*'
- 'appspec.yml'
最後結束前的確認
在開心寫完並將 buildspec.yml 檔案推送至 Git 之前,記得先在本地環境測試一遍。即使你是將舊有的 CI 文件改寫,也必須確保它能正常運行。CodeBuild 的環境變數眾多且容易混淆,若未事先確認,可能會出現錯誤,且一旦上傳至 AWS 測試,每次執行都會產生費用,雖然費用不高,但仍需注意。
這篇就介紹到這裡,下次會繼續介紹 CICD 流程的其他部分。
參考資料
- https://www.ernestchiang.com/zh/notes/aws/codebuild/#文件
- https://shazi.info/一條龍佈署-cicd-從-github-跑-travis-到-aws-codedeploy-travis-到-codedeploy/
- https://aws.plainenglish.io/how-to-run-local-builds-using-the-aws-codebuild-agent-13bd78dacbf2
- https://docs.aws.amazon.com/codebuild/latest/userguide/build-env-ref-env-vars.html












