本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
在 中建立和新增自訂動作 CodePipeline
AWS CodePipeline 包含許多動作,可協助您設定自動發行程序的建置、測試和部署資源。如果您的發行程序包含預設動作中未包含的活動 (例如內部開發的建置程序或測試套件),您可以建立該用途的自訂動作,並將其包含在管道中。您可以使用 AWS CLI 在與 AWS 您的帳戶相關聯的管道中建立自訂動作。
您可以為下列動作類別建立自訂 AWS CodePipeline 動作:
-
建置或轉換項目的自訂建置動作
-
將項目部署至一或多個伺服器、網站或儲存庫的自訂部署動作
-
設定和執行自動化測試的自訂測試動作
-
執行函數的自訂呼叫動作
當您建立自訂動作時,也必須建立任務工作者,以 CodePipeline 輪詢此自訂動作的任務請求、執行任務,並將狀態結果傳回 CodePipeline。只要該任務工作者可以存取 的公有端點,就可以位於任何電腦或資源上 CodePipeline。若要輕鬆管理存取和安全性,請考慮在 Amazon EC2執行個體上託管您的任務工作者。
下圖顯示管道的高階檢視,其中包含自訂建置動作:
當管道包含自訂動作作為階段的一部分時,管道將建立任務請求。自訂任務工作者偵測到該請求,並執行該任務 (在此範例中,為使用第三方建置軟體的自訂程序)。動作完成時,任務工作者會傳回成功結果或失敗結果。如果收到成功結果,管道會將修訂及其成品提供給下一個動作。如果傳回失敗,管道將不會提供管道中下一個動作的修訂。
注意
這些說明假設您已完成入門 CodePipeline 中的步驟。
建立自訂動作
若要使用 建立自訂動作 AWS CLI
-
開啟文字編輯器,並為自訂動作建立JSON檔案,其中包含動作類別、動作提供者,以及自訂動作所需的任何設定。例如,若要建立只需要一個屬性的自訂建置動作,您的JSON檔案可能如下所示:
{ "category": "Build", "provider": "
My-Build-Provider-Name
", "version": "1", "settings": { "entityUrlTemplate": "https://my-build-instance/job/{Config:ProjectName}/
", "executionUrlTemplate": "https://my-build-instance/job/{Config:ProjectName}/lastSuccessfulBuild/{ExternalExecutionId}/
" }, "configurationProperties": [{ "name": "ProjectName
", "required": true, "key": true, "secret": false, "queryable": false, "description": "The name of the build project must be provided when this action is added to the pipeline.
", "type": "String" }], "inputArtifactDetails": { "maximumCount":integer
, "minimumCount":integer
}, "outputArtifactDetails": { "maximumCount":integer
, "minimumCount":integer
}, "tags": [{ "key": "Project", "value": "ProjectA" }] }此範例透過在自訂動作上包含
Project
標籤索引鍵和ProjectA
值,將標籤新增到自訂動作。如需在 中標記資源的詳細資訊 CodePipeline,請參閱 標記 資源。JSON 檔案中包含兩個屬性,
entityUrlTemplate
以及executionUrlTemplate
。您可以按照 的格式參考URL範本中自訂動作的組態屬性中的名稱{Config:
,只要組態屬性是必要的,而不是秘密。例如,在上述範例中,name
}entityUrlTemplate
值是指組態屬性ProjectName
.-
entityUrlTemplate
:靜態連結,可提供動作服務提供者的相關資訊。在此範例中,建置系統包含每個建置專案的靜態連結。此連結格式會根據建置提供者而不同 (或者,如果您建立不同的動作類型 (例如測試),則為其他服務提供者)。您必須提供此連結格式,在新增自訂動作時,使用者可以選擇此連結,以將瀏覽器開啟到您網站上提供建置專案 (或測試環境) 特性的頁面。 -
executionUrlTemplate
:動態連結,可使用目前或最近執行動作的相關資訊予以更新。當您的自訂任務工作者更新任務狀態 (例如,成功、失敗或進行中) 時,也會提供將用來完成連結的externalExecutionId
。此連結可以用來提供動作執行的詳細資訊。
例如,當您在管道中檢視動作時,請參閱下列兩個連結:
在您新增自訂動作並指向
entityUrlTemplate
中的地址 (於建立自訂動作時所指定) 之後,會出現此靜態連結。在每次執行動作並指向
executionUrlTemplate
中的地址 (於建立自訂動作時所指定) 之後,會更新動態連結。如需這些連結類型以及
RevisionURLTemplate
和 的詳細資訊ThirdPartyURL
,請參閱 參考 CreateCustomActionType中的 ActionTypeSettings和 。 CodePipeline API 如需動作結構需求以及如何建立動作的詳細資訊,請參閱 CodePipeline 管道結構參考。 -
-
儲存JSON檔案並為其提供您容易記住的名稱 (例如,
MyCustomAction
.json)。 -
在已安裝 AWS CLI的電腦上,開啟終端機工作階段 (Linux、OS X、Unix) 或命令提示字元 (Windows)。
-
使用 AWS CLI 執行aws codepipeline create-custom-action-type命令,指定您剛建立的JSON檔案名稱。
例如,若要建立建置自訂動作:
重要
請確認在檔案名稱之前包含
file://
。這是此命令必要項目。aws codepipeline create-custom-action-type --cli-input-json file://
MyCustomAction
.json -
此命令會傳回您所建立自訂動作的整個結構,以及為您新增的
JobList
動作組態屬性。當您將自訂動作新增至管道時,可以使用JobList
指定提供者中您可以輪詢任務的專案。如果您未設定此項目,則會在自訂任務工作者輪詢任務時傳回所有可用的任務。例如,上述命令可能會傳回與下列類似的結構:
{ "actionType": { "inputArtifactDetails": { "maximumCount": 1, "minimumCount": 1 }, "actionConfigurationProperties": [ { "secret": false, "required": true, "name": "
ProjectName
", "key": true, "description": "The name of the build project must be provided when this action is added to the pipeline.
" } ], "outputArtifactDetails": { "maximumCount": 0, "minimumCount": 0 }, "id": { "category": "Build", "owner": "Custom", "version": "1", "provider": "My-Build-Provider-Name
" }, "settings": { "entityUrlTemplate": "https://my-build-instance/job/{Config:ProjectName}/
", "executionUrlTemplate": "https://my-build-instance/job/mybuildjob/lastSuccessfulBuild/{ExternalExecutionId}/
" } } }注意
作為create-custom-action-type命令輸出的一部分,
id
區段包含"owner": "Custom"
. CodePipeline automatic 指派Custom
為自訂動作類型的擁有者。當您使用 create-custom-action-type 命令或 update-pipeline 命令時,無法指派或變更此值。
建立自訂動作的任務工作者
自訂動作需要任務工作者,其將 CodePipeline 輪詢自訂動作的任務請求、執行任務,並將狀態結果傳回 CodePipeline。只要任務工作者可以存取 的公有端點,就可以位於任何電腦或資源上 CodePipeline。
有多種方式可以設計任務工作者。下列各節提供一些實用的指引,以開發 的自訂任務工作者 CodePipeline。
選擇和設定任務工作者的許可管理策略
若要在 中為自訂動作開發自訂任務工作者 CodePipeline,您將需要整合使用者和許可管理的策略。
最簡單的策略是透過使用IAM執行個體角色建立 Amazon EC2執行個體來新增自訂任務工作者所需的基礎設施,這可讓您輕鬆擴展整合所需的資源。您可以使用 與 的內建整合 AWS 來簡化自訂工作工作者與 之間的互動 CodePipeline。
設定 Amazon EC2執行個體
-
進一步了解 Amazon,EC2並判斷其是否適合您的整合。如需詳細資訊,請參閱 Amazon EC2 - Virtual Server Hosting。
-
開始建立您的 Amazon EC2執行個體。如需詳細資訊,請參閱開始使用 Amazon EC2 Linux 執行個體 。
另一個要考慮的策略是使用身分聯合與 IAM來整合現有的身分提供者系統和資源。如果您已有公司身分提供者,或已設定為使用 Web 身分提供者來支援使用者,則此策略特別有用。身分聯合可讓您授予 AWS 資源的安全存取權,包括 CodePipeline,而不必建立或管理IAM使用者。您可以使用功能和政策以符合密碼安全要求和輪換登入資料。您可以使用範例應用程式做為您自己設計的範本。
設定聯合身分
在執行自訂動作和工作工作者 AWS 帳戶 時,在 下使用下列其中一項。
如果使用者想要與 AWS 外部互動,則需要程式設計存取權 AWS Management Console。授予程式設計存取權的方式取決於存取 的使用者類型 AWS。
若要授與使用者程式設計存取權,請選擇下列其中一個選項。
哪個使用者需要程式設計存取權? | 到 | By |
---|---|---|
人力身分 (在 IAM Identity Center 中管理的使用者) |
使用暫時憑證簽署對 AWS CLI AWS SDKs、 或 的程式設計請求 AWS APIs。 |
請依照您要使用的介面所提供的指示操作。
|
IAM | 使用暫時憑證簽署對 AWS CLI AWS SDKs、 或 的程式設計請求 AWS APIs。 | 請遵循 IAM 使用者指南 中的將臨時憑證與 AWS 資源搭配使用的指示。 |
IAM | (不建議使用) 使用長期憑證簽署對 AWS CLI AWS SDKs、 或 的程式設計請求 AWS APIs。 |
請依照您要使用的介面所提供的指示操作。
|
您可以建立下列範例政策,以與自訂任務工作者搭配使用。此政策僅做為範例使用,並以現狀提供。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "codepipeline:PollForJobs", "codepipeline:AcknowledgeJob", "codepipeline:GetJobDetails", "codepipeline:PutJobSuccessResult", "codepipeline:PutJobFailureResult" ], "Resource": [ "arn:aws:codepipeline:
us-east-2
::actionType:custom/Build/MyBuildProject
/1/" ] } ] }
注意
考慮使用 AWSCodePipelineCustomActionAccess
受管政策。
開發自訂動作的任務工作者
選擇許可管理策略後,您應該考慮您的工作工作者將如何與 互動 CodePipeline。下列高階圖表顯示建置程序的自訂動作和任務工作者工作流程。
-
您的任務工作者會使用 CodePipeline 輪詢任務
PollForJobs
。 -
管道來源階段中的變更觸發管道時 (例如,開發人員確認變更時),即會開始自動化發行程序。程序會持續進行,直到自訂動作設定完成的階段為止。當它在此階段到達您的動作時, 會 CodePipeline 佇列任務。如果您的任務工作者再次呼叫
PollForJobs
以取得狀態,則會顯示此任務。從PollForJobs
取得任務詳細資訊,並將它傳遞回任務工作者。 -
任務工作者呼叫
AcknowledgeJob
傳送 CodePipeline 任務確認。 CodePipeline 傳回表示任務工作者應繼續任務 (InProgress
) 的確認,或者,如果您有一個以上的任務工作者輪詢任務,而另一個任務工作者已請求任務,則會傳回InvalidNonceException
錯誤回應。InProgress
確認後, CodePipeline 等待結果傳回。 -
作業工作者會啟動 修訂版的自訂動作,然後執行動作。除了任何其他動作之外,您的自訂動作還會將結果傳回給工作工作者。在建置自訂動作範例中,該動作會從 Amazon S3 儲存貯體提取成品、建置成品,並將成功建置的成品推回 Amazon S3 儲存貯體。
-
動作執行時,作業工作者可以使用
PutJobSuccessResult
連續字符 (作業工作者產生的作業狀態序列化,例如JSON格式為建置識別符或 Amazon S3 物件金鑰) 呼叫,以及用來填入 中連結ExternalExecutionId
的資訊executionUrlTemplate
。這將在管道進行時,使用特定動作詳細資訊的工作連結來更新管道的主控台檢視。雖然不需要,但為最佳實務,因為它可讓使用者檢視執行中自訂動作的狀態。呼叫
PutJobSuccessResult
之後,會將任務視為完成。在 中建立新的任務 CodePipeline ,其中包含連續字符。如果您的任務工作者再次呼叫PollForJobs
,則會顯示此任務。新的任務可以用來檢查動作的狀態,並以接續字符傳回,或在動作完成之後以不含接續字符傳回。注意
如果您的任務工作者執行所有適用於自訂動作的工作,則應該考慮將您的任務工作者處理分為至少兩個步驟。第一個步驟會建立您動作的詳細資訊頁面。在您建立詳細資訊頁面之後,即可序列化任務工作者的狀態,並根據大小限制將它傳回為接續字符 (請參閱 中的配額 AWS CodePipeline)。例如,您可以將動作的狀態寫入用來做為接續字符的字串。任務工作者處理的第二個步驟 (和後續步驟) 會執行動作的實際工作。最後一個步驟會將成功或失敗傳回 CodePipeline,而最後一個步驟沒有繼續權杖。
如需使用延續權杖的詳細資訊,請參閱 CodePipeline API 參考
PutJobSuccessResult
中的 規格。 -
自訂動作完成後,任務工作者 CodePipeline 會呼叫兩個 之一,將自訂動作的結果傳回至 APIs:
-
PutJobSuccessResult
沒有連續字符,表示自訂動作已成功執行 -
PutJobFailureResult
,這表示自訂動作未成功執行
根據結果,管道會繼續進行下一個動作 (成功) 或停止 (失敗)。
-
自訂任務工作者架構和範例
在您映射高階工作流程之後,即可建立任務工作者。雖然您自訂動作的特性最終會判斷您任務工作者所需的內容,但是自訂動作的大部分任務工作者都會包含下列功能:
-
CodePipeline 使用 輪詢任務
PollForJobs
。 -
CodePipeline 使用
AcknowledgeJob
、 和 確認任務PutJobSuccessResult
並將結果傳回給PutJobFailureResult
。 -
從管道的 Amazon S3 儲存貯體中擷取成品和/或將成品放入。若要從 Amazon S3 儲存貯體下載成品,您必須建立使用 Signature 第 4 版簽署 (Sig V4) 的 Amazon S3 用戶端。需要 Sig V4 AWS KMS。
若要將成品上傳到 Amazon S3 儲存貯體,您必須另外設定 Amazon S3
PutObject
請求以使用加密。encryption. AWS KMS uses 目前僅支援 AWS 金鑰管理服務 (AWS KMS) AWS KMS keys。為了知道要使用 AWS 受管金鑰 還是客戶受管金鑰上傳成品,您的自訂作業工作者必須查看作業資料並檢查加密金鑰屬性。如果已設定 屬性,您應該在設定 時使用該客戶受管金鑰 ID AWS KMS。如果金鑰屬性為 null,除非另有設定, AWS 受管金鑰 否則您可以使用 AWS 受管金鑰. CodePipeline uses。如需顯示如何在 Java 或 中建立 AWS KMS 參數的範例NET,請參閱使用 在 Amazon S3 AWS Key Management Service 中指定 AWS SDKs。如需 Amazon S3 儲存貯體的詳細資訊 CodePipeline,請參閱 CodePipeline 概念。
自訂工作工作者更複雜的範例可在 上取得 GitHub。此範例是開放原始碼,並以現狀提供。
-
適用於 的作業工作者範例 CodePipeline
:從 GitHub 儲存庫下載範例。
將自訂動作新增至管道
擁有作業工作者之後,您可以建立新的管道,並在使用建立管道精靈時選擇它、編輯現有管道並新增自訂動作,或使用 AWS CLI、 SDKs或 ,將自訂動作新增至管道APIs。
注意
如果自訂動作是建置或部署動作,則您可以在 Create Pipeline (建立管道) 精靈中建立包含該自訂動作的管道。如果您的自訂動作是在測試類別中,則您必須編輯現有管道予以新增。
將自訂動作新增至現有管道 (CLI)
您可以使用 AWS CLI 將自訂動作新增至現有管道。
-
開啟終端機工作階段 (Linux、macOS 或 Unix) 或命令提示字元 (Windows),然後執行 get-pipeline命令,將您要編輯的管道結構複製到 JSON 檔案。例如,針對名為
MyFirstPipeline
的管道,您會輸入下列命令:aws codepipeline get-pipeline --name
MyFirstPipeline
>pipeline.json
此命令不會傳回任何內容,但您建立的檔案應該會顯示在您執行命令的目錄中。
-
在任何文字編輯器中開啟 JSON 檔案,並修改檔案的結構,將自訂動作新增至現有階段。
注意
如果您想要您的動作與該階段中的另一個動作平行執行,則請確保您將與該動作相同的
runOrder
值指派給它。例如,若要修改管道結構以新增名為 Build 的階段,以及將建置自訂動作新增至該階段,您可以修改 JSON 以新增部署階段之前的建置階段,如下所示:
, { "name": "MyBuildStage", "actions": [ { "inputArtifacts": [ { "name": "MyApp" } ], "name": "MyBuildCustomAction", "actionTypeId": { "category": "Build", "owner": "Custom", "version": "1", "provider": "My-Build-Provider-Name" }, "outputArtifacts": [ { "name": "MyBuiltApp" } ], "configuration": { "ProjectName": "MyBuildProject" }, "runOrder": 1 } ] }
, { "name": "Staging", "actions": [ { "inputArtifacts": [ { "name": "MyBuiltApp" } ], "name": "Deploy-CodeDeploy-Application", "actionTypeId": { "category": "Deploy", "owner": "AWS", "version": "1", "provider": "CodeDeploy" }, "outputArtifacts": [], "configuration": { "ApplicationName": "CodePipelineDemoApplication", "DeploymentGroupName": "CodePipelineDemoFleet" }, "runOrder": 1 } ] } -
若要套用變更,請執行 update-pipeline命令,指定管道JSON檔案,如下所示:
重要
請確認在檔案名稱之前包含
file://
。這是此命令必要項目。aws codepipeline update-pipeline --cli-input-json file://
pipeline.json
此命令會傳回所編輯管道的整個結構。
-
開啟 CodePipeline 主控台,然後選擇您剛編輯的管道名稱。
此管道會顯示您的變更。下次您變更來源位置時,管道會透過修訂過的管道結構來執行該修訂版。