使用 AWS CodePipeline 和 AWS CDK 設定 CI/CD 管道 - AWS 方案指引

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 AWS CodePipeline 和 AWS CDK 設定 CI/CD 管道

創建者:康斯坦丁扎魯達夫 (AWS)、西澤佩雷拉 (AWS)、拉斯·金德 (AWS) 和亞沙達巴斯 (AWS)

程式碼儲存庫:AWS CodePipeline 搭配 CI/CD

環境:PoC 或試點

技術: DevOps

工作負載:開源

AWS 服務:AWS CodePipeline

首頁

透過持續整合和持續交付 (CI/CD) 自動化您的軟體建置和發行程序,可支援可重複的建置,並快速交付新功能給使用者。您可以快速輕鬆地測試每個代碼更改,並且可以在發布軟件之前 catch 並修復錯誤。透過測試和發行程序執行每項變更,您可以驗證應用程式或基礎結構程式碼的品質。CI/CD 體現了一套文化、一組作業原則和實務集合,協助應用程式開發團隊更頻繁且可靠地提供程式碼變更。此實作也稱為 CI/CD 管線。

此模式定義了 Amazon Web Services (AWS) 上可重複使用的持續整合和持續交付 (CI/CD) 管道。AWS CodePipeline 管道是使用 AWS Cloud Development Kit (AWS CDK) v2 編寫的。

使用時 CodePipeline,您可以透過 AWS 管理主控台界面、AWS Command Line Interface (AWS CLI) (AWS CLI)、AWS 或 AWS 開發套件,為軟體發行程序的不同階段建模。 CloudFormation此模式示範使用 AWS CDK 實作 CodePipeline 及其元件。除了建構程式庫之外,AWS CDK 還包含一個工具組 (CLI 命令cdk),這是與 AWS CDK 應用程式互動的主要工具。除其他功能外,此工具組還提供將一或多個堆疊轉換為 CloudFormation 範本,並將其部署到 AWS 帳戶的功能。

該管道包括用於驗證第三方庫安全性的測試,並有助於確保在指定的環境中快速自動發布。您可以通過驗證過程來提高應用程序的整體安全性。

此模式的目的是加速 CI/CD 管線的使用,以部署程式碼,同時確保您部署的資源遵循 DevOps 最佳實務。實作範例程式碼之後,您將擁有包 CodePipeline含 linting、測試、安全檢查、部署和部署後程序的 AWS。此模式還包括生成文件的步驟。開發人員可以使用 Makefile 在本機重現 CI/CD 步驟,並提高開發程序的速度。

先決條件和限制

先決條件

  • 有效的 AWS 帳戶

  • 在下面的一個基本的了解:

    • AWS CDK

    • AWS CloudFormation

    • AWS CodePipeline

    • TypeScript

限制

此模式 TypeScript 僅會將 AWS CDK 用於使用。它不涵蓋 AWS CDK 支援的其他語言。

產品版本

使用下列工具的最新版本:

  • AWS 命令列界面 (AWS CLI)

  • CFN_NAG

  • git-remote-codecommit

  • Node.js

架構

目標技術堆疊

  • AWS CDK

  • AWS CloudFormation

  • AWS CodeCommit

  • AWS CodePipeline

目標架構

管道是由 AWS CodeCommit 儲存庫 (SampleRepository) 中的變更觸發。在開始時,會 CodePipeline 建置構件、自行更新,並啟動部署程序。產生的管道會將解決方案部署到三個獨立的環境:

  • Dev — 在使用中開發環境中進行三步程式碼檢查

  • 測試 — 集成和回歸測試環境

  • 產品 — 生產環境

包括在開發階段的三個步驟是短信,安全性和單元測試。這些步驟並行運行以加快該過程。為了確保管線僅提供工作中的加工品,只要處理程序中的某個步驟失敗,它就會停止執行。開發階段部署之後,管道會執行驗證測試以驗證結果。在成功的情況下,管道會將成品部署到測試環境,其中包含部署後驗證。最後一步是將成品部署到 Prod 環境。

下圖顯示從 CodeCommit 存放庫到建置與更新程序的工作流程 CodePipeline、三個 Dev 環境步驟,以及三個環境中每個環境中的後續部署與驗證。

開發環境包括 linting,安全性和單元測試,都包括部署和驗證。

工具

AWS 服務

  • AWS Cloud Development Kit (AWS CDK) 是一種軟體開發架構,可協助您在程式碼中定義和佈建 AWS 雲端基礎設施。

  • AWS 可 CloudFormation協助您設定 AWS 資源、快速且一致地佈建 AWS 資源,並在 AWS 帳戶和區域的整個生命週期中進行管理。在此模式中, CloudFormation 模板可用於創建 CodeCommit 存儲庫和 CodePipeline CI/CD 管道。

  • AWS CodeCommit 是一種版本控制服務,可協助您以私密方式存放和管理 Git 儲存庫,而無需管理自己的原始檔控制系統。

  • AWS CodePipeline 是 CI/CD 服務,可協助您快速建模和設定軟體發行的不同階段,並自動執行持續發行軟體變更所需的步驟。

  • AWS Command Line Interface (AWS CLI) (AWS CLI) 是一種開放原始碼工具,可協助您透過命令列殼層中的命令與 AWS 服務互動。

其他工具

  • cfn_nag 是一種開放原始碼工具,可在範本中尋找 CloudFormation 模式,以識別潛在的安全性問題。

  • git-remote-codecommit是通過擴展 Git 從 CodeCommit 存儲庫中推送和提取代碼的實用程序。

  • Node.js 是一個事件驅動的 JavaScript 運行時環境,旨在構建可擴展的網絡應用程序。

Code

此模式的程式碼可在 CodePipeline 具有 CI/CD 實務儲存庫的 GitHub AWS 中取得。

最佳實務

檢閱 AWS Identity and Access Management (IAM) 政策等資源,以確認這些資源符合您的組織最佳實務。

史诗

任務描述所需技能

在 macOS 或 Linux 上安裝工具。

如果您使用的是 MacOS 或 Linux,則可以通過在首選終端機中運行以下命令或使用 Linux 版自製軟件來安裝工具。

brew install brew install git-remote-codecommit brew install ruby brew-gem brew-gem install cfn-nag
DevOps 工程師

使用 AWS Cloud9 安裝工具。

如果您使用的是 AWS Cloud9,請執行下列命令來安裝工具。

gem install cfn-nag

注意:AWS Cloud9 應該已安裝 Node.js 和 npm。若要檢查安裝或版本,請執行下列命令。

node -v npm -v
DevOps 工程師

設定 AWS CLI。

若要設定 AWS CLI,請使用適用於您作業系統的指示:

DevOps 工程師
任務描述所需技能

下載或克隆代碼。

若要取得此模式所使用的程式碼,請執行下列其中一個動作:

  • 從軟件 GitHub 庫中的版本下載最新的源代碼,然後將下載的文件解壓縮到一個文件夾中。

  • 通過運行以下命令克隆項目。

git clone --depth 1 https://github.com/aws-samples/aws-codepipeline-cicd.git

從複製的.git存放庫中移除目錄。

cd ./aws-codepipeline-cicd rm -rf ./.git

稍後,您將使用新建立的 AWS CodeCommit 儲存庫做為遠端來源。

DevOps 工程師

Connect 到 AWS 帳戶。

您可以使用臨時安全令牌或 landing zone 身份驗證進行連接。若要確認您使用的是正確的帳戶和 AWS 區域,請執行下列命令。

AWS_REGION="eu-west-1" ACCOUNT_NUMBER=$(aws sts get-caller-identity --query Account --output text) echo "${ACCOUNT_NUMBER}"
DevOps 工程師

引導環境。

若要啟動 AWS CDK 環境,請執行下列命令。

npm install npm run cdk bootstrap "aws://${ACCOUNT_NUMBER}/${AWS_REGION}"

成功啟動環境後,應顯示以下輸出。

⏳ Bootstrapping environment aws://{account}/{region}... ✅ Environment aws://{account}/{region} bootstrapped

如需 AWS CDK 啟動安裝的詳細資訊,請參閱 AWS CDK 文件。

DevOps 工程師

合成模板。

若要合成 AWS CDK 應用程式,請使用指cdk synth令。

npm run cdk synth

您應該會看到下列輸出。

Successfully synthesized to <path-to-directory>/aws-codepipeline-cicd/cdk.out Supply a stack id (CodePipeline, Dev-MainStack) to display its template.
DevOps 工程師

部署 CodePipeline 堆疊。

現在您已啟動並合成 CloudFormation 範本,您可以進行部署。部署將建立 CodePipeline 管線和 CodeCommit 儲存庫,這將成為管線的來源和觸發程序。

npm run cdk -- deploy CodePipeline --require-approval never

執行命令之後,您應該會看到成功部署 CodePipeline 堆疊和輸出資訊。會CodePipeline.RepositoryName為您提供 AWS 帳戶中 CodeCommit 儲存庫的名稱。

CodePipeline: deploying... CodePipeline: creating CloudFormation changeset... ✅ CodePipeline Outputs: CodePipeline.RepositoryName = SampleRepository Stack ARN: arn:aws:cloudformation:REGION:ACCOUNT-ID:stack/CodePipeline/STACK-ID
DevOps 工程師

設置遠程 CodeCommit 存儲庫和分支。

成功部署後, CodePipeline 將啟動管道的第一次執行,您可以在 AWS CodePipeline 主控台找到該管道。由於 AWS CDK 且 CodeCommit 未啟動預設分支,因此此初始管道執行將會失敗,並傳回下列錯誤訊息。

The action failed because no branch named main was found in the selected AWS CodeCommit repository SampleRepository. Make sure you are using the correct branch name, and then try again. Error: null

要修復此錯誤,請將遠程原點設置為SampleRepository,然後創建所需的main分支。

RepoName=$(aws cloudformation describe-stacks --stack-name CodePipeline --query "Stacks[0].Outputs[?OutputKey=='RepositoryName'].OutputValue" --output text) echo "${RepoName}" # git init git branch -m master main git remote add origin codecommit://${RepoName} git add . git commit -m "Initial commit" git push -u origin main
DevOps 工程師
任務描述所需技能

提交變更以啟動管線。

成功的初始部署之後,您應該擁有一個完整的 CI/CD 管線,並將分mainSampleRepository做為來源分支。一旦您將變更提交至main分支,管線就會啟動並執行下列動作順序:

  1. 從 CodeCommit 存儲庫中獲取代碼。

  2. 建置您的程式碼。

  3. 更新管道本身(UpdatePipeline)。

  4. 運行三個並行作業進行 linting,安全性和單元測試檢查。

  5. 在成功的情況下,管道會將Main堆疊部署./lib/main-stack.ts至 Dev 環境。

  6. 針對已部署的資源執行部署後檢查。您可以在 CodePipeline 控制台中按照所有 CodePipeline 步驟和結果進行操作。

  7. 在成功的情況下,管道將重複測試和 Prod 環境的部署和驗證。

DevOps 工程師
任務描述所需技能

使用生成文件運行開發過程。

您可以使用make命令在本機執行整個管線,也可以執行個別步驟 (例如make linting)。

若要測試使用make,請執行下列動作:

  • 實施本地管道:make

  • 僅運行單元測試:make unittest

  • 部署到當前帳戶:make deploy

  • 清理環境:make clean

應用 DevOps 程式開發人員、
任務描述所需技能

刪除 AWS CDK 應用程式資源。

若要清理 AWS CDK 應用程式,請執行下列命令。

cdk destroy --all

請注意,在啟動載入期間建立的 Amazon 簡易儲存服務 (Amazon S3) 儲存貯體不會自動刪除。他們需要允許刪除的保留政策,或者您需要在 AWS 帳戶中手動刪除它們。

DevOps 工程師

故障診斷

問題解決方案

範本未如預期般運作。

如果出現問題並且模板不起作用,請確保您具有以下內容:

  • 工具的正確版本。

  • 存取目標 AWS 帳戶 (網路連線)。

  • 目標 AWS 帳戶擁有足夠的許可。

相關資源