

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

# 自動為 Java 和 Python 專案建立動態 CI 管道
<a name="create-dynamic-ci-pipelines-for-java-and-python-projects-automatically"></a>

*Aromal Raj Jayarajan、Vijesh Vijayakumaran Nair、MAHESH RAGHUNANDANAN 和 Amarnath Reddy，Amazon Web Services*

## 總結
<a name="create-dynamic-ci-pipelines-for-java-and-python-projects-automatically-summary"></a>

此模式說明如何使用 AWS 開發人員工具，為 Java 和 Python 專案自動建立動態持續整合 (CI) 管道。

隨著技術堆疊多樣化和開發活動增加，建立和維護跨組織一致 CI 管道可能會變得困難。透過在 AWS Step Functions 中自動化程序，您可以確保 CI 管道的使用方式和方法一致。

為了自動建立動態 CI 管道，此模式使用以下變數輸入：
+ 程式設計語言 （僅限 Java 或 Python)
+ 管道名稱
+ 必要的管道階段

**注意**  
Step Functions 使用多個 AWS 服務協調管道建立。如需有關此解決方案中使用的 AWS 服務的詳細資訊，請參閱此模式**的工具**一節。

## 先決條件和限制
<a name="create-dynamic-ci-pipelines-for-java-and-python-projects-automatically-prereqs"></a>

**先決條件**
+ 作用中的 AWS 帳戶
+ 正在部署此解決方案的相同 AWS 區域中的 Amazon S3 儲存貯體
+ 具有建立此解決方案所需資源所需的 AWS CloudFormation 許可的 AWS Identity and Access Management (IAM) [委託人](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html) 

**限制**
+ 此模式僅支援 Java 和 Python 專案。
+ 在此模式中佈建的 IAM 角色遵循最低權限原則。必須根據 CI 管道需要建立的特定資源更新 IAM 角色的許可。

## Architecture
<a name="create-dynamic-ci-pipelines-for-java-and-python-projects-automatically-architecture"></a>

**目標技術堆疊**
+ AWS CloudFormation
+ AWS CodeBuild
+ AWS CodeCommit
+ AWS CodePipeline
+ IAM
+ Amazon Simple Storage Service (Amazon S3)
+ AWS Systems Manager
+ AWS Step Functions
+ AWS Lambda
+ Amazon DynamoDB

**目標架構 **

下圖顯示使用 AWS 開發人員工具自動建立 Java 和 Python 專案動態 CI 管道的範例工作流程。

![\[使用 AWS 工具自動建立 Java 和 Python 專案動態 CI 管道的工作流程。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/bef2ccb8-68b3-4c0f-9ee7-4b93e9422d9c/images/b5ed003f-cf16-4130-8bfb-2bc2cb9a0d33.png)


該圖顯示以下工作流程：

1. AWS 使用者以 JSON 格式提供 CI 管道建立的輸入參數。此輸入會啟動 Step Functions 工作流程 (*狀態機器*)，以使用 AWS 開發人員工具建立 CI 管道。

1. Lambda 函數會讀取名為 **input-reference** 的資料夾，該資料夾存放在 Amazon S3 儲存貯體中，然後產生** buildspec.yml **檔案。此產生的檔案會定義 CI 管道階段，並存放在存放參數參考的相同 Amazon S3 儲存貯體中。

1. Step Functions 會檢查 CI 管道建立工作流程的相依性是否有任何變更，並視需要更新相依性堆疊。

1. Step Functions 在 CloudFormation 堆疊中建立 CI 管道資源，包括 CodeCommit 儲存庫、CodeBuild 專案和 CodePipeline 管道。

1. CloudFormation 堆疊會將所選技術堆疊 (Java 或 Python) 的範例原始碼和 **buildspec.yml** 檔案複製到 CodeCommit 儲存庫。

1. CI 管道執行時間詳細資訊會存放在 DynamoDB 資料表中。

**自動化和擴展**
+ 此模式僅適用於單一開發環境。需要在多個開發環境中使用組態變更。
+ 若要新增對多個 CloudFormation 堆疊的支援，您可以建立其他 CloudFormation 範本。如需詳細資訊，請參閱 [ CloudFormation 文件中的 AWS CloudFormation 入門](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/GettingStarted.html)。 CloudFormation 

## 工具
<a name="create-dynamic-ci-pipelines-for-java-and-python-projects-automatically-tools"></a>

**工具**
+ [AWS Step Functions](https://docs.aws.amazon.com/step-functions/latest/dg/welcome.html) 是一種無伺服器協同運作服務，可協助您結合 AWS Lambda 函數和其他 AWS 服務來建置業務關鍵應用程式。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 是一種運算服務，可協助您執行程式碼，而無需佈建或管理伺服器。它只會在需要時執行程式碼並自動擴展，因此您只需按使用的運算時間付費。
+ [AWS CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/welcome.html) 是一項全受管建置服務，可協助您編譯原始程式碼、執行單元測試，並產生準備好部署的成品。
+ [AWS CodeCommit](https://docs.aws.amazon.com/codecommit/latest/userguide/welcome.html) 是一種版本控制服務，可協助您私下存放和管理 Git 儲存庫，而無需管理您自己的來源控制系統。
+ [AWS CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/welcome.html) 可協助您快速建模和設定軟體版本的不同階段，並自動化持續發行軟體變更所需的步驟。
+ [AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) 可透過控制已驗證並獲授權使用的人員，協助您安全地管理對 AWS 資源的存取。
+ [AWS Key Management Service (AWS KMS)](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html) 可協助您建立和控制密碼編譯金鑰，以協助保護您的資料。
+ [Amazon Simple Storage Service (Amazon S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) 是一種雲端型物件儲存服務，可協助您儲存、保護和擷取任何數量的資料。
+ [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html) 可協助您設定 AWS 資源、快速一致地佈建資源，以及在整個 AWS 帳戶和區域的生命週期中管理這些資源。
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) 是一項全受管 NoSQL 資料庫服務，可提供快速、可預期且可擴展的效能。
+ [AWS Systems Manager 參數存放區](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html)為組態資料管理和秘密管理提供安全的階層式儲存。

**Code**

此模式的程式碼可在 GitHub [automated-ci-pipeline-creation](https://github.com/aws-samples/automated-ci-pipeline-creation) 儲存庫中使用。儲存庫包含建立此模式中概述的目標架構所需的 CloudFormation 範本。

## 最佳實務
<a name="create-dynamic-ci-pipelines-for-java-and-python-projects-automatically-best-practices"></a>
+ 請勿直接在 CloudFormation 範本或 Step Functions 動作組態中輸入登入資料 (*秘密*)，例如字符或密碼。如果您這麼做，資訊會顯示在 DynamoDB 日誌中。反之，請使用 AWS Secrets Manager 來設定和存放秘密。然後，視需要參考 CloudFormation 範本和 Step Functions 動作組態中存放在 Secrets Manager 中的秘密。如需詳細資訊，請參閱 [ AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html) Secrets Manager。
+ 為存放在 Amazon S3 中的 CodePipeline 成品設定伺服器端加密。如需詳細資訊，請參閱 [CodePipeline 文件中的為存放在 Amazon S3 for CodePipeline 中的成品設定伺服器端加密 CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/S3-artifact-encryption.html)。 CodePipeline 
+ 設定 IAM 角色時套用最低權限許可。如需詳細資訊，請參閱 IAM 文件中的[套用最低權限許可](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)。
+ 請確定您的 Amazon S3 儲存貯體不可公開存取。如需詳細資訊，請參閱《Amazon S3 [ S3 文件》中的設定 S3 儲存貯體的封鎖公開存取設定](https://docs.aws.amazon.com/AmazonS3/latest/userguide/configuring-block-public-access-bucket.html)。
+ 請務必為 Amazon S3 儲存貯體啟用版本控制。如需詳細資訊，請參閱《Amazon [ S3 文件》中的在 S3 儲存貯體中使用版本控制](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Versioning.html)。 Amazon S3 
+ 設定 IAM 政策時使用 IAM Access Analyzer。此工具提供可行的建議，協助您撰寫安全且實用的 IAM 政策。如需詳細資訊，請參閱 IAM 文件中的[使用 AWS Identity and Access Management Access Analyzer](https://docs.aws.amazon.com/IAM/latest/UserGuide/what-is-access-analyzer.html)。
+ 盡可能在設定 IAM 政策時定義特定存取條件。
+ 啟用 Amazon CloudWatch 記錄以進行監控和稽核。如需詳細資訊，請參閱 [ CloudWatch 文件中的什麼是 Amazon CloudWatch Logs？](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html)。 CloudWatch 

## 史詩
<a name="create-dynamic-ci-pipelines-for-java-and-python-projects-automatically-epics"></a>

### 設定先決條件
<a name="configure-the-prerequisites"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 Amazon S3 儲存貯體。 | 建立 Amazon S3 儲存貯體 （或使用現有的儲存貯體），以存放解決方案所需的 CloudFormation 範本、原始程式碼和輸入檔案。如需詳細資訊，請參閱 [Amazon S3 文件中的步驟 1：建立您的第一個 S3 儲存貯](https://docs.aws.amazon.com/AmazonS3/latest/userguide/creating-bucket.html)體。 Amazon S3 Amazon S3 儲存貯體必須位於您要部署解決方案的相同 AWS 區域。 | AWS DevOps | 
| 複製 GitHub 儲存庫。 | 在終端機視窗中執行下列命令，複製 GitHub [automated-ci-pipeline-creation](https://github.com/aws-samples/automated-ci-pipeline-creation) 儲存庫：<pre>git clone https://github.com/aws-samples/automated-ci-pipeline-creation.git</pre>如需詳細資訊，請參閱 GitHub 文件中的[複製儲存庫](https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository)。 | AWS DevOps | 
| 將解決方案範本資料夾從複製的 GitHub 儲存庫上傳至您的 Amazon S3 儲存貯體。 | 從複製的 **Solution-Templates** 資料夾複製內容，並將其上傳至您建立的 Amazon S3 儲存貯體。如需詳細資訊，請參閱 [Amazon S3 文件中的上傳物件](https://docs.aws.amazon.com/AmazonS3/latest/userguide/upload-objects.html)。 Amazon S3 請務必僅上傳 **Solution-Templates** 資料夾的內容。您只能在 Amazon S3 儲存貯體的根層級上傳檔案。 | AWS DevOps | 

### 部署解決方案
<a name="deploy-the-solution"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 在複製的 GitHub 儲存庫中使用 template.yml 檔案，建立 CloudFormation 堆疊來部署解決方案。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/create-dynamic-ci-pipelines-for-java-and-python-projects-automatically.html)建立堆疊時，它會列在 **Stacks** 頁面上，狀態為 **CREATE\$1IN\$1PROGRESS**。在完成此模式中的剩餘步驟之前，請務必等待堆疊的狀態變更為 **CREATE\$1COMPLETE**。 | AWS 管理員、AWS DevOps | 

### 測試設定
<a name="test-the-setup"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 執行您建立的步驟函數。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/create-dynamic-ci-pipelines-for-java-and-python-projects-automatically.html)**JSON 格式**<pre>{<br />  "details": {<br />    "tech_stack": "Name of the Tech Stack (python/java)",<br />    "project_name": "Name of the Project that you want to create with",<br />    "pre_build": "Choose the step if it required in the buildspec.yml file i.e., yes/no",<br />    "build": "Choose the step if it required in the buildspec.yml file i.e., yes/no",<br />    "post_build": "Choose the step if it required in the buildspec.yml file i.e., yes/no",<br />    "reports": "Choose the step if it required in the buildspec.yml file i.e., yes/no",<br />  }<br />}</pre>**Java JSON 輸入範例**<pre>{<br />  "details": {<br />    "tech_stack": "java",<br />    "project_name": "pipeline-java-pjt",<br />    "pre_build": "yes",<br />    "build": "yes",<br />    "post_build": "yes",<br />    "reports": "yes"<br />  }<br />}</pre>**Python JSON 輸入範例**<pre>{<br />  "details": {<br />    "tech_stack": "python",<br />    "project_name": "pipeline-python-pjt",<br />    "pre_build": "yes",<br />    "build": "yes",<br />    "post_build": "yes",<br />    "reports": "yes"<br />  }<br />}</pre> | AWS 管理員、AWS DevOps | 
| 確認已建立 CI 管道的 CodeCommit 儲存庫。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/create-dynamic-ci-pipelines-for-java-and-python-projects-automatically.html) | AWS DevOps | 
| 檢查 CodeBuild 專案資源。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/create-dynamic-ci-pipelines-for-java-and-python-projects-automatically.html) | AWS DevOps | 
| 驗證 CodePipeline 階段。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/create-dynamic-ci-pipelines-for-java-and-python-projects-automatically.html) | AWS DevOps | 
| 確認 CI 管道已成功執行。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/create-dynamic-ci-pipelines-for-java-and-python-projects-automatically.html) | AWS DevOps | 

### 清除您的資源
<a name="clean-up-your-resources"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 刪除 CloudFormation 中的資源堆疊。 | 在 CloudFormation 中刪除 CI 管道的資源堆疊。如需詳細資訊，請參閱 [ CloudFormation 文件中的刪除 AWS CloudFormation 主控台上的堆疊](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-console-delete-stack.html)。 CloudFormation 請務必刪除名為 **<project\$1name>-stack** 的堆疊。 | AWS DevOps | 
| 在 Amazon S3 和 CloudFormation 中刪除 CI 管道的相依性。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/create-dynamic-ci-pipelines-for-java-and-python-projects-automatically.html)請務必刪除名為 **pipeline-creation-dependencies-stack** 的堆疊。 | AWS DevOps | 
| 刪除 Amazon S3 範本儲存貯體。 | 刪除您在此模式**的設定先決條件**區段中建立的 Amazon s3 儲存貯體，該區段存放此解決方案的範本。如需詳細資訊，請參閱 Amazon S3 文件中的[刪除儲存貯](https://docs.aws.amazon.com/AmazonS3/latest/userguide/delete-bucket.html)體。 | AWS DevOps | 

## 相關資源
<a name="create-dynamic-ci-pipelines-for-java-and-python-projects-automatically-resources"></a>
+ [建立使用 Lambda 的 Step Functions 狀態機器](https://docs.aws.amazon.com/step-functions/latest/dg/tutorial-creating-lambda-state-machine.html) (AWS Step Functions 文件）
+ [AWS Step Functions WorkFlow Studio](https://docs.aws.amazon.com/step-functions/latest/dg/workflow-studio.html) (AWS Step Functions 文件）
+ [DevOps 和 AWS](https://aws.amazon.com/devops/)
+ [AWS CloudFormation 如何運作？](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-whatis-howdoesitwork.html) (AWS CloudFormation 文件）
+ [使用 AWS CodeCommit、AWS CodeBuild、AWS CodeDeploy 和 AWS CodePipeline 完成 CI/CD](https://aws.amazon.com/blogs/devops/complete-ci-cd-with-aws-codecommit-aws-codebuild-aws-codedeploy-and-aws-codepipeline/) (AWS 部落格文章）
+ [IAM 和 AWS STS 配額、名稱要求和字元限制](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-quotas.html) (IAM 文件）