本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
CodeBuild 的建置規格參考
本主題提供關於建置規格 (Buildspec) 檔案的重要參考資訊。 buildspec 是組建命令和相關設定的集合,採用 YAML 格式,可供 CodeBuild 用來執行組建。您可以在原始程式碼中包含 buildspec,也可以在建立建置專案時定義 buildspec。如需組建規格運作方式的詳細資訊,請參閱 CodeBuild 的運作方式 。
Buildspec 檔案名稱和儲存位置
若您隨著來源碼併入組建規格,依預設,組建規格檔案的名稱會是
buildspec.yml
,並且放置在來源目錄的根目錄中。
您可以覆寫預設的組建規格檔案名稱和位置。例如,您可以:
對相同儲存庫中的不同組建使用不同的組建規格檔案,例如
buildspec_debug.yml
和
buildspec_release.yml
。
在來源目錄根目錄以外的位置儲存組建規格檔案,例如
config/buildspec.yml
,或儲存在 S3 儲存貯體中。S3 儲存貯體必須與建置專案位於相同的 AWS 區域。使用其 ARN 指定 buildspec 檔案 (例如,
arn:aws:s3:::
)。
<my-codebuild-sample2>
/buildspec.yml
您只可以為組建專案指定一個組建規格,而不論組建規格檔案的名稱。
若要覆寫預設的組建規格檔案名稱、位置或兩者,請執行下列其中一個動作:
執行 AWS CLI
create-project
或
update-project
命令,將
buildspec
值設定為相對於內建環境變數 值的替代 buildspec 檔案路徑
CODEBUILD_SRC_DIR
。您也可以在 AWS SDKs 中執行與
create project
操作相同的操作。如需詳細資訊,請參閱
建立組建專案
或
變更建置專案設定
。
執行 AWS CLI
start-build
命令,將
buildspecOverride
值設定為相對於內建環境變數 值的替代 buildspec 檔案路徑
CODEBUILD_SRC_DIR
。您也可以在 AWS SDKs 中執行與
start build
操作相同的操作。如需詳細資訊,請參閱
手動執行組建
。
在 AWS CloudFormation 範本中,將 資源
Source
中 的
BuildSpec
屬性設定為相對於內建環境變數 值的替代 buildspec 檔案
AWS::CodeBuild::Project
路徑
CODEBUILD_SRC_DIR
。如需詳細資訊,請參閱
AWS CloudFormation 《 使用者指南
》中的
AWS CodeBuild 專案來源
中的 BuildSpec 屬性。
Buildspec 語法
組建規格檔案必須以
YAML
如果命令包含 YAML 不支援的字元或字元字串,您必須以引號 (“”) 括住命令。下列命令用引號括起來,因為 YAML 中不允許冒號 (:) 後面跟著空格。命令中的引號被逸出 (\")。
"export PACKAGE_NAME=$(cat package.json | grep name | head -1 | awk -F: '{ print $2 }' | sed 's/[\",]//g')"
組建規格具有下列語法:
version: 0.2 run-as:Linux-user-nameenv: shell:shell-tagvariables:key: "value"key: "value" parameter-store:key: "value"key: "value" exported-variables: -variable-variablesecrets-manager:key:secret-id:json-key:version-stage:version-idgit-credential-helper: no | yes proxy: upload-artifacts: no | yes logs: no | yes batch: fast-fail: false | true # build-list: # build-matrix: # build-graph: # build-fanout: phases: install: run-as:Linux-user-nameon-failure: ABORT | CONTINUE | RETRY | RETRY-count| RETRY-regex| RETRY-count-regexruntime-versions:runtime:versionruntime:versioncommands: -command-commandfinally: -command-commandpre_build: run-as:Linux-user-nameon-failure: ABORT | CONTINUE | RETRY | RETRY-count| RETRY-regex| RETRY-count-regexcommands: -command-commandfinally: -command-commandbuild: run-as:Linux-user-nameon-failure: ABORT | CONTINUE | RETRY | RETRY-count| RETRY-regex| RETRY-count-regexcommands: -command-commandfinally: -command-commandpost_build: run-as:Linux-user-nameon-failure: ABORT | CONTINUE | RETRY | RETRY-count| RETRY-regex| RETRY-count-regexcommands: -command-commandfinally: -command-commandreports:report-group-name-or-arn: files: -location-locationbase-directory:locationdiscard-paths: no | yes file-format:report-formatartifacts: files: -location-locationname:artifact-namediscard-paths: no | yes base-directory:locationexclude-paths:excluded pathsenable-symlinks: no | yes s3-prefix:prefixsecondary-artifacts:artifactIdentifier: files: -location-locationname:secondary-artifact-namediscard-paths: no | yes base-directory:locationartifactIdentifier: files: -location-locationdiscard-paths: no | yes base-directory:locationcache: key:keyfallback-keys: -fallback-key-fallback-keyaction: restore | save paths: -path-path建置規格包含下列各項:
version
必要的映射。代表組建規格版本。建議您使用
0.2。注意
雖然仍支援版本 0.1,建議您盡可能使用版本 0.2。如需詳細資訊,請參閱Buildspec 版本。
選用的序列。僅供 Linux 使用者使用。指定在此 buildspec 檔案中執行命令的 Linux 使用者。 會
run-as授予指定的使用者讀取和執行許可。在 buildspec 檔案上方指定run-as時,它會全域套用到所有命令。如果您不想為所有 buildspec 檔案命令指定一個使用者,您可以在其中一個phases區塊中使用run-as來為階段中的命令指定一個使用者。如果未指定run-as,則會以根使用者身分執行所有命令。選用的序列。代表一或多個自訂環境變數的資訊。
注意
為了保護敏感資訊,CodeBuild 日誌中會隱藏下列項目:
AWS 存取金鑰 IDs。如需詳細資訊,請參閱AWS Identity and Access Management 《 使用者指南》中的管理 IAM 使用者的存取金鑰。
使用參數存放區指定的字串。如需詳細資訊,請參閱《Amazon EC2 Systems Manager Systems Manager 使用者指南》中的 Systems Manager 參數存放區和 Systems Manager 參數存放區主控台演練。
使用 指定的字串 AWS Secrets Manager。如需詳細資訊,請參閱金鑰管理。
env/variables 如果指定
env,且您想要以純文字定義自訂環境變數,則為必要。包含key/value純量的映射,其中的每個映射代表純文字的單一自訂環境變數。key為自訂環境變數的名稱,而value為該變數的值。重要
我們強烈建議不將敏感值儲存在環境變數中。環境變數可以使用 CodeBuild 主控台和 等工具以純文字顯示 AWS CLI。針對機密值,建議您改為使用
parameter-store或secrets-manager映射,如本節稍後所述。任何您設定的環境變數都會取代現有環境變數。例如,如果 Docker 影像已包含名為
MY_VAR且值為my_value的環境變數,而且您設定名為MY_VAR且值為other_value的環境變數,則my_value會取代為other_value。同樣地,如果 Docker 影像已包含名為PATH且值為/usr/local/sbin:/usr/local/bin的環境變數,而且您設定名為PATH且值為$PATH:/usr/share/ant/bin的環境變數,則/usr/local/sbin:/usr/local/bin會取代為文字值$PATH:/usr/share/ant/bin。請不要設定名稱開頭為
CODEBUILD_的任何環境變數。此字首保留供 內部使用。如果有多個位置定義同名的環境變數,則會決定值,如下所示:
開始建置操作呼叫中的值會採用最高優先順序。當您建立建置時,您可以新增或覆寫環境變數。如需詳細資訊,請參閱手動執行 AWS CodeBuild 組建。
組建專案定義中的值會採用下一個優先順序。當您建立或編輯專案時,您可以在專案層級新增環境變數。如需詳細資訊,請參閱在 中建立建置專案 AWS CodeBuild及在 中變更建置專案設定 AWS CodeBuild。
buildspec 宣告中的值會採用最低優先順序。
env/parameter-store 如果已指定 ,且您想要擷取存放在 Amazon EC2 Systems Manager 參數存放區的自訂環境變數
env,則為必要項目。包含索引鍵/值純量的映射,其中每個映射代表存放在 Amazon EC2 Systems Manager 參數存放區中的單一自訂環境變數。索引鍵是您稍後在建置命令中用來參考此自訂環境變數的名稱,而值是存放在 Amazon EC2 Systems Manager 參數存放區中的自訂環境變數名稱。若要存放敏感值,請參閱《Amazon EC2 Systems Manager 使用者指南》中的 Systems Manager 參數存放區和逐步解說:建立和測試字串參數 (主控台)。重要
若要允許 CodeBuild 擷取存放在 Amazon EC2 Systems Manager 參數存放區中的自訂環境變數,您必須將
ssm:GetParameters動作新增至 CodeBuild 服務角色。如需詳細資訊,請參閱允許 CodeBuild 與其他 AWS 服務互動。您從 Amazon EC2 Systems Manager 參數存放區擷取的任何環境變數都會取代現有的環境變數。例如,如果 Docker 影像已包含名為
MY_VAR且值為my_value的環境變數,而且您擷取名為MY_VAR且值為other_value的環境變數,則my_value會取代為other_value。同樣地,如果 Docker 影像已包含名為PATH且值為/usr/local/sbin:/usr/local/bin的環境變數,而且您擷取名為PATH且值為$PATH:/usr/share/ant/bin的環境變數,則/usr/local/sbin:/usr/local/bin會取代為文字值$PATH:/usr/share/ant/bin。請不要存放名稱開頭為
CODEBUILD_的任何環境變數。此字首保留供 內部使用。如果有多個位置定義同名的環境變數,則會決定值,如下所示:
開始建置操作呼叫中的值會採用最高優先順序。當您建立建置時,您可以新增或覆寫環境變數。如需詳細資訊,請參閱手動執行 AWS CodeBuild 組建。
組建專案定義中的值會採用下一個優先順序。當您建立或編輯專案時,您可以在專案層級新增環境變數。如需詳細資訊,請參閱在 中建立建置專案 AWS CodeBuild及在 中變更建置專案設定 AWS CodeBuild。
buildspec 宣告中的值會採用最低優先順序。
env/secrets-manager 如果您想要擷取存放在 中的自訂環境變數,則為必要項目 AWS Secrets Manager。
reference-key使用以下模式指定 Secrets Manager:
:<key><secret-id>:<json-key>:<version-stage>:<version-id>(必要) 做為秘密唯一識別符的名稱或 Amazon Resource Name (ARN)。若要存取您 AWS 帳戶中的秘密,只需要指定秘密名稱。若要存取不同 AWS 帳戶中的秘密,請指定秘密 ARN。
<json-key>(選用) 指定您要擷取其值之 Secrets Manager 金鑰/值對的金鑰名稱。如果您未指定
json-key,CodeBuild 會擷取整個秘密文字。<版本階段>(選用) 透過附加至版本的預備標籤,指定您要擷取的秘密版本。預備標籤在輪換程序期間用來追蹤不同版本。如果您使用
version-stage,請不要指定version-id。如果您不指定版本階段或版本 ID,則預設會擷取版本階段值為AWSCURRENT的版本。<version-id>(選用) 指定您要使用的秘密版本的唯一識別符。如果指定
version-id,則不要指定version-stage。如果您不指定版本階段或版本 ID,則預設會擷取版本階段值為AWSCURRENT的版本。在下列範例中,
secrets-manager: LOCAL_SECRET_VAR: "TestSecret:MY_SECRET_VAR"TestSecret是存放在 Secrets Manager 中的鍵/值對名稱。的金鑰TestSecret是MY_SECRET_VAR。您可以使用LOCAL_SECRET_VAR名稱在建置期間存取 變數。
如需詳細資訊,請參閱
AWS Secrets Manager 使用者指南
中的
什麼是 AWS Secrets Manager
。
env/
exported-variables
選用的映射。用於列出您想要匯出的環境變數。在
exported-variables
下以獨立行列指定您想要匯出的每個變數的名稱。建置期間您想要匯出的變數必須在容器中提供。您匯出的變數可為環境變數。
匯出的環境變數會與 搭配使用 AWS CodePipeline ,將環境變數從目前的建置階段匯出至管道中的後續階段。如需詳細資訊,請參閱
AWS CodePipeline 《 使用者指南
》中的
使用變數
。
建置期間,變數的值在
install
階段即開始提供。它可以在
install
階段開始和
post_build
結束之間進行更新。
post_build
階段結束後,匯出的變數值無法變更。
注意
無法匯出下列項目:
env/
git-credential-helper
選用的映射。用於指示 CodeBuild 是否使用其 Git 登入資料協助程式來提供 Git 登入資料。
yes
如果使用的話。否則為
no
或未指定。如需詳細資訊,請參閱 Git 網站上的
gitcredentials
。
注意
由公有 Git 儲存庫的 Webhook 觸發的建置不支援
git-credential-helper
。
phases/*/
run-as
選用的序列。在建置階段中用來指定可執行其命令的 Linux 使用者。如果也在 buildspec 檔案上方為所有命令全域指定
run-as
,則階段層級的使用者具有優先權。例如,如果全域
run-as
指定 User-1,而對於
install
階段,只有
run-as
陳述式指定 User-2,則 中的所有命令會以 User-1 執行,
但
install
階段中的命令除外,這些命令會以 User-2 執行。
phase/*/
on-failure
選用的序列。指定在階段期間發生失敗時要採取的動作。這可以是下列其中一個值:
RETRY
- 重試組建最多 3 次,並顯示符合規則表達式 的錯誤訊息
.*
。
RETRY-
count
- 以符合規則表達式 的錯誤訊息
計數
表示,在指定的次數內重試組建
.*
。請注意,
計數
必須介於 0 到 100 之間。例如,有效值包括
RETRY-4
和
RETRY-8
。
RETRY-
regex
- 重試建置最多 3 次,並使用
regex
包含規則運算式以符合指定的錯誤訊息。例如,有效值包括
Retry-.*Error: Unable to connect to database.*
和
RETRY-invalid+
。
RETRY-
count
-
regex
- 在指定的次數內重試組建,如
計數
所示。請注意,
計數
必須介於 0 到 100 之間。您也可以使用
regex
來包含規則表達式,以符合錯誤訊息。例如,有效值包括
Retry-3-.*connection timed out.*
和
RETRY-8-invalid+
。
如果未指定此屬性,則失敗程序會遵循轉換階段,如 所示
建置階段轉換
。
重要
使用 Lambda 運算或預留容量時,不支援
on-failure
屬性。此屬性僅適用於 CodeBuild 提供的 EC2 運算映像。
階段/*/
最終
選用的區塊。
finally
區塊中指定的命令會在
commands
區塊中的命令之後執行。即使
finally
區塊中的命令失敗,也會執行
commands
區塊中的命令。例如,如果
commands
區塊包含三個命令且第一個失敗,CodeBuild 會略過剩餘的兩個命令,並在
finally
區塊中執行任何命令。當
commands
和
finally
區塊中的所有命令成功執行時,此階段即成功。如果階段中的任何命令失敗,階段即失敗。
允許的建置階段名稱為:
選用的序列。Ubuntu 標準映像 5.0 或更新版本和 Amazon Linux 2 標準映像 4.0 或更新版本支援執行期版本。如已指定,此區段中至少要包含一個執行時間。使用特定版本指定執行時間,主要版本後面接著 ,
.x
以指定 CodeBuild 使用該主要版本搭配其最新的次要版本,或使用
latest
最新的主要和次要版本 (例如
ruby: 3.2
、
nodejs: 18.x
或
java: latest
)。您可以使用數字或環境變數指定執行時間。例如,如果您使用 Amazon Linux 2 標準映像 4.0,則以下指定已安裝 Java 版本 17、python 版本 3 的最新次要版本,以及 Ruby 環境變數中包含的版本。如需詳細資訊,請參閱
CodeBuild 提供的 Docker 映像
。
phases:
install:
runtime-versions:
java: corretto8
python: 3.x
ruby: "$MY_RUBY_VAR"
您可以在 buildspec 檔案的
runtime-versions
區段中指定一或多個執行時間。如果您的執行階段依存於另一個執行時間,您也可以在 buildspec 檔案中指定其相依的執行時間。如果您未在 buildspec 檔案中指定任何執行時間,CodeBuild 會選擇您所使用的映像中可用的預設執行時間。如果您指定一或多個執行時間,CodeBuild 只會使用這些執行時間。如果未指定相依執行時間,CodeBuild 會嘗試為您選擇相依執行時間。
如果兩個指定的執行時間發生衝突,則建置會失敗。例如,
android: 29
和
java:
openjdk11
相衝突,所以如果指定這兩個,則組建會失敗。
如需可用執行時間的詳細資訊,請參閱
可用的執行時間
。
注意
如果您指定
runtime-versions
區段並使用 Ubuntu Standard Image 2.0 或更新版本以外的映像,或 Amazon Linux 2 (AL2) 標準映像 1.0 或更新版本,則建置會發出警告 "
Skipping install of runtimes. Runtime version selection is not supported by this build image
."。
report-group-name-or-arn
選用的序列。指定傳送報告的目標報告群組。一個專案最多可以擁有五個報告群組。指定現有報告群組的 ARN,或新報告群組的名稱。如果您指定名稱,CodeBuild 會使用專案名稱和您以 格式指定的名稱來建立報告群組
<project-name>-<report-group-name>
。您也可以使用 buildspec 中的環境變數來設定報告群組名稱,例如
$REPORT_GROUP_NAME
。如需詳細資訊,請參閱
報告群組命名
。
reports/<report-group>/
files
必要的序列。代表包含由建立產生之測試結果原始資料的位置。包含一系列純量,每個純量代表 CodeBuild 可以尋找測試檔案的個別位置,相對於原始建置位置,或者,如果設定,則為
base-directory
。位置可能包括下列:
單一檔案 (例如,
my-test-report-file.json
)。
子目錄中的單一檔案 (例如,
my-subdirectory
/my-test-report-file.json
或
my-parent-subdirectory
/
my-subdirectory
/my-test-report-file.json
)。
'**/*'
代表遞迴的所有檔案。
my-subdirectory
/*
代表名為
my-subdirectory
的子目錄中的所有檔案。
my-subdirectory
/**/*
代表從名為
my-subdirectory
開始的子目錄遞迴的所有檔案。
reports/<report-group>/
file-format
選用的映射。代表報告檔案格式。如果未指定,則會使用
JUNITXML
。此值不區分大小寫。可能值為:
reports/<report-group>/
base-directory
選用的映射。代表一個或多個最上層目錄,相對於原始建置位置,CodeBuild 用來判斷在何處尋找原始測試檔案。
reports/<report-group>/
discard-paths
選用。指定報告檔案目錄是否在輸出中平面化。如果未指定或包含
no
,則報告檔案會以完整的目錄結構輸出。如果包含
yes
,則所有的測試檔案都會放置在相同的輸出目錄中。例如,如果測試結果的路徑是
com/myapp/mytests/TestResult.xml
,則指定
yes
會將此檔案置於
/TestResult.xml
中。
選用的序列。代表 CodeBuild 尋找建置輸出的位置,以及 CodeBuild 如何準備上傳到 S3 輸出儲存貯體的相關資訊。例如,如果您正在建置 Docker 映像並將其推送至 Amazon ECR,或者正在對原始程式碼執行單元測試,但未建置它,則不需要此序列。
注意
Amazon S3 中繼資料具有名為 的 CodeBuild 標頭
x-amz-meta-codebuild-buildarn
,其中包含發佈成品至 Amazon S3
buildArn
的 CodeBuild 組建的 。
buildArn
新增 以允許來源追蹤通知,並參考產生成品的建置。
單一檔案 (例如,
my-file.jar
)。
子目錄中的單一檔案 (例如,
my-subdirectory
/my-file.jar
或
my-parent-subdirectory
/
my-subdirectory
/my-file.jar
)。
'**/*'
代表遞迴的所有檔案。
my-subdirectory
/*
代表名為
my-subdirectory
的子目錄中的所有檔案。
my-subdirectory
/**/*
代表從名為
my-subdirectory
開始的子目錄遞迴的所有檔案。
當您指定組建輸出成品位置時,CodeBuild 可以在組建環境中找到原始組建位置。您不需要在組建成品輸出位置前方附加原始組建位置的路徑或指定
./
之類內容。如果要知道此位置的路徑,您可以在組建期間執行
echo $CODEBUILD_SRC_DIR
之類命令。每個組建環境的位置可能稍有不同。
artifacts/
name
選用名稱。指定組建成品的名稱。當下列其中一項成立時,會使用此名稱。
您可以使用 CodeBuild API 來建立組建,並在更新專案、建立專案或啟動組建時,在
ProjectArtifacts
物件上設定
overrideArtifactName
旗標。
您可以使用 CodeBuild 主控台來建立組建、在 buildspec 檔案中指定名稱,並在建立或更新專案時選取
啟用語意版本控制
。如需詳細資訊,請參閱
建立組建專案 (主控台)
。
您可以在組建時計算的組建規格檔案中指定名稱。組建規格檔案中指定的名稱使用 Shell 命令語言。例如,您可以將日期和時間附加到成品名稱,讓它一律是唯一的。唯一成品名稱可防止覆寫成品。如需詳細資訊,請參閱
Shell 命令語言
。
name: $AWS_REGION-$(date +%Y-%m-%d)
您可以將路徑資訊新增至名稱,以便根據名稱中的路徑將具名成品放置在目錄中。在此範例中,建置成品會放置在 下的輸出中
builds/<build number>/my-artifacts
。
version: 0.2 phases: build: commands: - rspec HelloWorld_spec.rb artifacts: files: - '**/*' name: builds/$CODEBUILD_BUILD_NUMBER/my-artifacts
選用。指定組建成品目錄是否在輸出中平面化。如果未指定或包含
no
,則會以完整的目錄結構輸出組建成品。如果包含
yes
,則所有組建成品都會放置在相同的輸出目錄中。例如,如果組建輸出成品中的文件路徑是
com/mycompany/app/HelloWorld.java
,則會指定
yes
將此文件放置在
/HelloWorld.java
中。
選用的映射。代表一個或多個最上層目錄,相對於原始建置位置,CodeBuild 用來判斷要包含在建置輸出成品中的檔案和子目錄。有效值包含:
選用的映射。代表 CodeBuild 將從建置成品中排除
base-directory
的一或多個路徑。星號 (
*
) 字元符合不超過資料夾邊界之名稱元件的零個或多個字元。雙星號 (
**
) 會比對所有目錄中名稱元件的零個或多個字元。
exclude-paths 的範例包括下列項目:
選用。如果輸出類型為
ZIP
,請指定內部符號連結是否保留在 ZIP 檔案中。如果其中包含
yes
,則來源中的所有內部符號連結都會保留在成品 ZIP 檔案中。
選用。指定當成品輸出至 Amazon S3 儲存貯體且命名空間類型為 時所使用的字首
BUILD_ID
。使用時,儲存貯體中的輸出路徑為
<s3-prefix>/<build-id>/<name>.zip
。
選用的序列。代表一或多個成品定義,做為成品識別符與成品定義之間的映射。此區塊中的每個成品識別符必須符合專案的
secondaryArtifacts
屬性中定義的成品。每個個別的定義具有與以上
artifacts
區塊相同的語法。
注意
即使只有已定義的次要成品,也一律需要 artifacts/files 序列。
例如,如果您的專案具有以下結構:
"name": "sample-project", "secondaryArtifacts": [ "type": "S3", "location": "
<output-bucket1>
",
"artifactIdentifier": "artifact1",
"name": "secondary-artifact-name-1"
"type": "S3",
"location": "
<output-bucket2>
",
"artifactIdentifier": "artifact2",
"name": "secondary-artifact-name-2"
則您的 buildspec 如下所示:
version: 0.2 phases: build: commands: - echo Building... artifacts: files: - '**/*' secondary-artifacts: artifact1: files: - directory/file1 name: secondary-artifact-name-1 artifact2: files: - directory/file2 name: secondary-artifact-name-2
選用的序列。代表搜尋或還原快取時所使用的主索引鍵。CodeBuild 會完全符合主索引鍵。
以下是金鑰的範例:
key: npm-key-$(codebuild-hash-files package-lock.json) }
選用的序列。當無法使用主索引鍵找到快取時,代表循序使用的備用索引鍵清單。最多支援五個備用金鑰,每個金鑰都使用字首搜尋進行比對。如果未提供 金鑰 ,則會忽略此序列。
以下是備用金鑰的範例:
fallback-keys: - npm-key-$(codebuild-hash-files package-lock.json) } - npm-key- - npm-
選用的序列。指定要在快取上執行的動作。有效值包含:
單一檔案 (例如,
my-file.jar
)。
子目錄中的單一檔案 (例如,
或
my-subdirectory
/my-file.jar
)。
my-parent-subdirectory
/
my-subdirectory
/my-file.jar
'**/*'
代表遞迴的所有檔案。
代表名為
my-subdirectory
/*
my-subdirectory
的子目錄中的所有檔案。
代表從名為
my-subdirectory
/**/*
my-subdirectory
開始的子目錄遞迴的所有檔案。
重要
因為建置規格宣告必須為有效的 YAML,因此建置規格宣告中的間距相當重要。若您組建規格宣告中的空格數無效,組建會立即失敗。您可以使用 YAML 驗證程式來測試您的組建規格宣告是否為有效的 YAML。
如果您在建立或更新建置專案時使用 AWS CLI或 AWS SDKs 宣告 buildspec,則 buildspec 必須是以 YAML 格式表示的單一字串,以及必要的空格和換行逸出字元。下一節提供一個範例。
如果您使用 CodeBuild 或 AWS CodePipeline 主控台而非 buildspec.yml 檔案,您只能插入
build
階段的命令。不要使用前述語法,您應該在單一行中列出要在組建階段期間執行的所有命令。針對多個命令,以
&&
區隔每個命令 (例如,
mvn test && mvn
package
)。
您可以使用 CodeBuild 或 CodePipeline 主控台來指定組建環境中組建輸出成品的位置,而非 buildspec.yml 檔案。不要使用前述語法,而是應該在單一行中列出所有位置。針對多個位置,以逗號區隔每個位置 (例如,
buildspec.yml, target/my-app.jar
)。
Buildspec 範例
以下是 buildspec.yml 檔案的範例。
version: 0.2 variables: JAVA_HOME: "/usr/lib/jvm/java-8-openjdk-amd64" parameter-store: LOGIN_PASSWORD: /CodeBuild/dockerLoginPassword phases: install: commands: - echo Entered the install phase... - apt-get update -y - apt-get install -y maven finally: - echo This always runs even if the update or install command fails pre_build: commands: - echo Entered the pre_build phase... - docker login -u User -p $LOGIN_PASSWORD finally: - echo This always runs even if the login command fails build: commands: - echo Entered the build phase... - echo Build started on `date` - mvn install finally: - echo This always runs even if the install command fails post_build: commands: - echo Entered the post_build phase... - echo Build completed on `date` reports: arn:aws:codebuild:your-region:your-aws-account-id:report-group/report-group-name-1: files: - "**/*" base-directory: 'target/tests/reports' discard-paths: no reportGroupCucumberJson: files: - 'cucumber/target/cucumber-tests.xml' discard-paths: yes file-format: CUCUMBERJSON # default is JUNITXML artifacts: files: - target/messageUtil-1.0.jar discard-paths: yes secondary-artifacts: artifact1: files: - target/artifact-1.0.jar discard-paths: yes artifact2: files: - target/artifact-2.0.jar discard-paths: yes cache: paths: - '/root/.m2/**/*'以下是上述 buildspec 的範例,以單一字串表示,可與 AWS CLI或 AWS SDKs搭配使用。
"version: 0.2\n\nenv:\n variables:\n JAVA_HOME: \"/usr/lib/jvm/java-8-openjdk-amd64\\"\n parameter-store:\n LOGIN_PASSWORD: /CodeBuild/dockerLoginPassword\n phases:\n\n install:\n commands:\n - echo Entered the install phase...\n - apt-get update -y\n - apt-get install -y maven\n finally:\n - echo This always runs even if the update or install command fails \n pre_build:\n commands:\n - echo Entered the pre_build phase...\n - docker login -u User -p $LOGIN_PASSWORD\n finally:\n - echo This always runs even if the login command fails \n build:\n commands:\n - echo Entered the build phase...\n - echo Build started on `date`\n - mvn install\n finally:\n - echo This always runs even if the install command fails\n post_build:\n commands:\n - echo Entered the post_build phase...\n - echo Build completed on `date`\n\n reports:\n reportGroupJunitXml:\n files:\n - \"**/*\"\n base-directory: 'target/tests/reports'\n discard-paths: false\n reportGroupCucumberJson:\n files:\n - 'cucumber/target/cucumber-tests.xml'\n file-format: CUCUMBERJSON\n\nartifacts:\n files:\n - target/messageUtil-1.0.jar\n discard-paths: yes\n secondary-artifacts:\n artifact1:\n files:\n - target/messageUtil-1.0.jar\n discard-paths: yes\n artifact2:\n files:\n - target/messageUtil-1.0.jar\n discard-paths: yes\n cache:\n paths:\n - '/root/.m2/**/*'"以下是
build階段中的命令範例,可與 CodeBuild 或 CodePipeline 主控台搭配使用。echo Build started on `date` && mvn install在這些範例中:
純文字的自訂環境變數,已設定
JAVA_HOME的金鑰和/usr/lib/jvm/java-8-openjdk-amd64的值。
dockerLoginPassword您儲存在 Amazon EC2 Systems Manager 參數存放區中名為 的自訂環境變數,稍後會在建置命令中使用金鑰 進行參考LOGIN_PASSWORD。您無法變更這些組建階段名稱。在此範例中執行的命令為
apt-get update -y和apt-get install -y maven(安裝 Apache Maven)、mvn install(將原始程式碼編譯、測試和封裝為建置輸出成品,並在其內部儲存庫中安裝建置輸出成品)、docker login(使用對應於dockerLoginPassword您在 Amazon EC2 Systems Manager 參數存放區中設定之自訂環境變數值的密碼登入 Docker) 和數個echo命令。此處包含這些echo命令,以顯示 CodeBuild 如何執行命令及其執行順序。
files代表要上傳至組建輸出位置的檔案。在此範例中,CodeBuild 會上傳單一檔案messageUtil-1.0.jar。您可以在組建環境中名為target的相對目錄中找到messageUtil-1.0.jar檔案。因為已指定discard-paths: yes,系統會直接上傳messageUtil-1.0.jar(並且不會上傳到中繼target目錄)。檔案名稱 (messageUtil-1.0.jar) 及相對目錄名稱 (target) 是以 Apache Maven 建立及存放組建輸出成品的方式為基礎,僅適用於此範例。在您自己的案例中,檔案名稱及目錄可能會有所不同。
reports代表在建置期間產生報告的兩個報告群組:
arn:aws:codebuild:your-region:your-aws-account-id:report-group/report-group-name-1指定報告群組的 ARN。以測試框架產生的測試結果位於target/tests/reports目錄。檔案格式為JunitXml,且路徑不會從包含測試結果的檔案移除。
reportGroupCucumberJson指定新的報告群組。如果專案的名稱為my-project,則會在組件執行時會建立名稱為my-project-reportGroupCucumberJson的報告群組。以測試框架產生的測試結果位於cucumber/target/cucumber-tests.xml。測試檔案格式為CucumberJson,且路徑不會從包含測試結果的檔案移除。Buildspec 版本
下表列出組建規格版本與版本之間的變更。