建構設定檔包含讓 Cloud Build 依據您的規格執行工作的操作說明。例如,您的建構設定檔可以包含建構、封裝和推送 Docker 映像檔的操作說明。
本頁說明 Cloud Build 設定檔的結構定義。如需建立及使用建構設定檔的操作說明,請參閱建立基本建構設定檔。
建構設定檔的結構
建構設定檔使用 Cloud Build API 的 Build 資源進行建構。
您可以使用 YAML 或 JSON 語法編寫建構設定檔。如果您使用 curl 等第三方 http 工具提交建構要求,請使用 JSON 語法。
建構設定檔的結構如下:
YAML
steps:
- name: string
args: [string, string, ...]
env: [string, string, ...]
allowFailure: boolean
allowExitCodes: [string (int64 format), string (int64 format), ...]
dir: string
id: string
waitFor: [string, string, ...]
entrypoint: string
secretEnv: string
volumes: object(Volume)
timeout: string (Duration format)
script: string
automapSubstitutions: boolean
results: object(Results)
- name: string
...
- name: string
...
timeout: string (Duration format)
queueTtl: string (Duration format)
logsBucket: string
options:
env: [string, string, ...]
secretEnv: string
volumes: object(Volume)
sourceProvenanceHash: enum(HashType)
machineType: enum(MachineType)
diskSizeGb: string (int64 format)
substitutionOption: enum(SubstitutionOption)
dynamicSubstitutions: boolean
automapSubstitutions: boolean
logStreamingOption: enum(LogStreamingOption)
logging: enum(LoggingMode)
defaultLogsBucketBehavior: enum(DefaultLogsBucketBehavior)
pool: object(PoolOption)
pubsubTopic: string
requestedVerifyOption: enum(RequestedVerifyOption)
substitutions: map (key: string, value: string)
tags: [string, string, ...]
serviceAccount: string
secrets: object(Secret)
availableSecrets: object(Secrets)
artifacts: object(Artifacts)
goModules: [object(GoModules), ...]
mavenArtifacts: [object(MavenArtifact), ...]
pythonPackages: [object(PythonPackage), ...]
npmPackages: [object(npmPackage), ...]
images:
- [string, string, ...]
JSON
{
"steps": [
{
"name": "string",
"args": [
"string",
"string",
"..."
],
"env": [
"string",
"string",
"..."
],
"allowFailure": "boolean",
"allowExitCodes: [
"string (int64 format)",
"string (int64 format)",
"..."
],
"dir": "string",
"id": "string",
"waitFor": [
"string",
"string",
"..."
],
"entrypoint": "string",
"secretEnv": "string",
"volumes": "object(Volume)",
"timeout": "string (Duration format)",
"script" : "string",
"automapSubstitutions" : "boolean",
"results": "object(Results)"
},
{
"name": "string"
...
},
{
"name": "string"
...
}
],
"timeout": "string (Duration format)",
"queueTtl": "string (Duration format)",
"logsBucket": "string",
"options": {
"sourceProvenanceHash": "enum(HashType)",
"machineType": "enum(MachineType)",
"diskSizeGb": "string (int64 format)",
"substitutionOption": "enum(SubstitutionOption)",
"dynamicSubstitutions": "boolean",
"automapSubstitutions": "boolean",
"logStreamingOption": "enum(LogStreamingOption)",
"logging": "enum(LoggingMode)"
"defaultLogsBucketBehavior": "enum(DefaultLogsBucketBehavior)"
"env": [
"string",
"string",
"..."
],
"secretEnv": "string",
"volumes": "object(Volume)",
"pool": "object(PoolOption)"
"requestedVerifyOption": "enum(RequestedVerifyOption)"
},
"substitutions": "map (key: string, value: string)",
"tags": [
"string",
"string",
"..."
],
"serviceAccount": "string",
"secrets": "object(Secret)",
"availableSecrets": "object(Secrets)",
"artifacts": "object(Artifacts)",
"goModules": [object(GoModules), ...],
"mavenArtifacts": ["object(MavenArtifact)", ...],
"pythonPackages": ["object(PythonPackage)", ...],
"npmPackages": ["object(npmPackage)", ...],
"images": [
"string",
"string",
"..."
]
}
建構設定檔的每個區段都定義您想讓 Cloud Build 執行的一部分工作:
建構步驟
建構步驟指定您想讓 Cloud Build 執行的動作。對於每個建構步驟,Cloud Build 都會執行 docker 容器做為 docker run 的執行個體。建構步驟與指令碼中的指令類似,可讓您在建構中靈活執行任意操作說明。如果您可以將建構工具封裝至容器,即表示 Cloud Build 可將其做為建構的一部分來執行。根據預設,Cloud Build 會在同一部機器上依序執行建構的所有步驟。如果有可以並行執行的步驟,請使用 waitFor 選項。
您可以在設定檔中包含最多 300 個建構步驟。
在建構設定檔中使用 steps 欄位可指定建構步驟。以下提供的設定種類程式碼片段可以在 steps 欄位中設定:
YAML
steps:
- name: 'gcr.io/cloud-builders/kubectl'
args: ['set', 'image', 'deployment/mydepl', 'my-image=gcr.io/my-project/myimage']
env:
- 'CLOUDSDK_COMPUTE_ZONE=us-east4-b'
- 'CLOUDSDK_CONTAINER_CLUSTER=my-cluster'
- name: 'gcr.io/cloud-builders/docker'
args: ['build', '-t', 'gcr.io/my-project-id/myimage', '.']
JSON
{
"steps": [
{
"name": "gcr.io/cloud-builders/kubectl",
"args": [
"set",
"image"
"deployment/mydepl"
"my-image=gcr.io/my-project/myimage"
],
"env": [
"CLOUDSDK_COMPUTE_ZONE=us-east4-b",
"CLOUDSDK_CONTAINER_CLUSTER=my-cluster"
]
},
{
"name": "gcr.io/cloud-builders/docker",
"args": [
"build",
"-t",
"gcr.io/my-project-id/myimage",
"."
]
}
]
}
name
請使用建構步驟的 name 欄位指定雲端建構工具,該工具是執行常用工具的容器映像檔。您可以在建構步驟中使用建構工具來執行您的工作。
下列程式碼片段顯示呼叫 bazel、gcloud 和 docker 建構工具的建構步驟:
YAML
steps:
- name: 'gcr.io/cloud-builders/bazel'
...
- name: 'gcr.io/cloud-builders/gcloud'
...
- name: 'gcr.io/cloud-builders/docker'
...
JSON
{
"steps": [
{
"name": "gcr.io/cloud-builders/bazel"
...
},
{
"name": "gcr.io/cloud-builders/gcloud"
...
},
{
"name": "gcr.io/cloud-builders/docker"
...
}
]
}
args
建構步驟的 args 欄位會取得引數清單並將其傳送至 name 欄位參照的建構工具。系統會將已傳送至建構工具的引數傳送至在建構工具中執行的工具,進而讓您叫用工具支援的任何指令。如果建構步驟中使用的建構工具擁有進入點,系統會將 args 做為該進入點的引數使用。如果建構工具並未定義進入點,系統會將 args 中的第一個元素做為進入點使用,並將其餘元素做為引數使用。
每個步驟最多可建立 100 個引數。引數長度上限為 10,000 個字元。
以下程式碼片段會叫用 docker build 指令並安裝 Maven 依附元件:
YAML
steps:
- name: 'gcr.io/cloud-builders/mvn'
args: ['install']
- name: 'gcr.io/cloud-builders/docker'
args: ['build', '-t', 'gcr.io/my-project-id/myimage', '.']
JSON
{
"steps": [
{
"name": "gcr.io/cloud-builders/mvn",
"args": [
"install"
]
},
{
"name": "gcr.io/cloud-builders/docker",
"args": [
"build",
"-t",
"gcr.io/my-project-id/myimage",
"."
]
}
]
}
env
建構步驟的 env 欄位會取得要在執行步驟時使用的環境變數清單。變數的格式為 KEY=VALUE。
在下列建構設定中,建構步驟的 env 欄位會先設定 Compute Engine 區域與 GKE 叢集,然後再執行 kubectl:
YAML
steps:
- name: 'gcr.io/cloud-builders/docker'
args: ['build', '-t', 'gcr.io/myproject/myimage', '.']
- name: 'gcr.io/cloud-builders/kubectl'
args: ['set', 'image', 'deployment/myimage', 'frontend=gcr.io/myproject/myimage']
env:
- 'CLOUDSDK_COMPUTE_ZONE=us-east1-b'
- 'CLOUDSDK_CONTAINER_CLUSTER=node-example-cluster'
JSON
{
"steps": [
{
"name": "gcr.io/cloud-builders/docker",
"args": [
"build",
"-t",
"gcr.io/myproject/myimage",
"."
]
},
{
"name": "gcr.io/cloud-builders/kubectl",
"args": [
"set",
"image",
"deployment/myimage",
"frontend=gcr.io/myproject/myimage"
],
"env": [
"CLOUDSDK_COMPUTE_ZONE=us-east1-b",
"CLOUDSDK_CONTAINER_CLUSTER=node-example-cluster"
]
}
]
}
allowFailure
在建構步驟中,如果將 allowFailure 欄位的值設為 true,且建構步驟失敗,只要該建構中的所有其他建構步驟都成功,建構就會成功。
如果建構中的所有建構步驟都將 allowFailure 設為 true,且所有建構步驟都失敗,建構的狀態仍為 Successful。
allowExitCodes 的優先順序高於這個欄位。
下列程式碼片段可讓建構作業在第一個步驟失敗時成功執行:
YAML
steps:
- name: 'ubuntu'
args: [ '-c', 'exit 1']
allowFailure: true
- name: 'ubuntu'
args: ['echo', 'Hello World']
JSON
{
"steps": [
{
"name": "ubuntu",
"args": [
"-c",
"exit -1"
],
"allowFailure": true,
},
{
"name": "ubuntu",
"args": [
"echo",
"Hello World"
]
}
]
}
allowExitCodes
使用 allowExitCodes 欄位指定步驟傳回特定結束代碼時,可忽略建構步驟失敗。
如果建構步驟失敗,且結束代碼與您在 allowExitCodes 中提供的值相符,Cloud Build 會允許這個建構步驟失敗,但不會導致整個建構作業失敗。
如果所有建構步驟都失敗,但每個步驟都以您在 allowExitCodes 欄位中指定的程式碼結束,則建構仍會成功。
不過,如果建構步驟失敗,並產生另一個結束代碼 (與您在 allowExitCodes 中指定的值不符),則整體建構作業就會失敗。
與建構作業相關的結束代碼取決於您的軟體。舉例來說,「1」是 Linux 中常見的結束代碼。您也可以在指令碼中定義自己的結束代碼。allowExitCodes 欄位接受的數字上限為 255。
這個欄位的優先順序高於 allowFailure。
如果第一個步驟失敗,且結束代碼符合下列其中一項,下列程式碼片段可讓建構作業成功:
YAML
steps:
- name: 'ubuntu'
args: ['-c', 'exit 1']
allowExitCodes: [1]
- name: 'ubuntu'
args: ['echo', 'Hello World']
JSON
{
"steps": [
{
"name": "ubuntu",
"args": [
"-c",
"exit 1"
],
"allowExitCodes": [1],
},
{
"name": "ubuntu",
"args": [
"echo",
"Hello World"
]
}
]
}
dir
在建構步驟中使用 dir 欄位,設定執行步驟容器時要使用的目前使用的目錄。如果您在建構步驟中設定 dir 欄位,系統會將目前使用的目錄設定為 /workspace/<dir>。如果這個值是相對路徑,即表示該值與建構的目前使用的目錄相對。如果這個值是絕對路徑,其可能位於建構的工作目錄之外,在此情況下,路徑的內容可能不會在建構步驟執行中保留 (除非指定該路徑的磁碟區)。
以下程式碼片段會將建構步驟的目前使用的目錄設定為 /workspace/examples/hello_world:
YAML
steps:
- name: 'gcr.io/cloud-builders/go'
args: ['install', '.']
env: ['PROJECT_ROOT=hello']
dir: 'examples/hello_world'
JSON
{
"steps": [
{
"name": "gcr.io/cloud-builders/go",
"args": [
"install",
"."
],
"env": [
"PROJECT_ROOT=hello"
],
"dir": "examples/hello_world"
}
]
}
ID
使用 id 欄位可設定建構步驟的唯一 ID。id 與 waitFor 欄位搭配使用,可設定應執行建構步驟的順序。如需使用 waitFor 和 id 的操作說明,請參閱「設定建構步驟順序」。
waitFor
在建構步驟中使用 waitFor 欄位可指定在執行建構步驟之前必須執行的步驟。如果並未提供 waitFor 的值,建構步驟會等待建構要求中之前的所有建構步驟都成功完成才會執行。如需使用 waitFor 和 id 的操作說明,請參閱「設定建構步驟順序」。
entrypoint
如果您不想使用建構工具的預設進入點,在建構步驟中使用 entrypoint 可指定進入點。如果您並未設定這個欄位,Cloud Build 會使用建構工具的進入點。以下程式碼片段會設定 npm 建構步驟的進入點:
YAML
steps:
- name: 'gcr.io/cloud-builders/npm'
entrypoint: 'node'
args: ['--version']
JSON
{
"steps": [
{
"name": "gcr.io/cloud-builders/npm",
"entrypoint": "node",
"args": [
"--version"
]
}
]
}
secretEnv
這是使用 Cloud KMS 加密編譯金鑰加密的環境變數清單。這些值必須在建構的密碼中指定。如要瞭解如何使用這個欄位,請參閱在建構要求中使用加密的變數一文。
volumes
磁碟區是一種 Docker 容器磁碟區,可以掛接到建構步驟,以便跨建構步驟保存檔案。Cloud Build 執行建構步驟時,會將 workspace 磁碟區自動掛接到 /workspace。您可以針對步驟使用 volumes 欄位,指定要掛接到建構步驟容器的其他磁碟區。
例如,下面的建構設定檔會在第一個步驟中將檔案寫入磁碟區,並在第二個步驟中讀取該檔案。如果這兩個步驟並未指定 /persistent_volume 路徑做為永久磁碟區,第一個步驟會在該路徑寫入檔案,然後系統會在第二個步驟執行之前捨棄該檔案。透過在兩個步驟中指定相同名稱的磁碟區,系統會將第一個步驟中 /persistent_volume 的內容保留到第二個步驟。
YAML
steps:
- name: 'ubuntu'
volumes:
- name: 'vol1'
path: '/persistent_volume'
entrypoint: 'bash'
args:
- '-c'
- |
echo "Hello, world!" > /persistent_volume/file
- name: 'ubuntu'
volumes:
- name: 'vol1'
path: '/persistent_volume'
args: ['cat', '/persistent_volume/file']
JSON
{
"steps": [
{
"name": "ubuntu",
"volumes": [
{
"name": "vol1",
"path": "/persistent_volume"
}
],
"entrypoint": "bash",
"args": [
"-c",
"echo \"Hello, world!\" > /persistent_volume/file\n"
]
},
{
"name": "ubuntu",
"volumes": [
{
"name": "vol1",
"path": "/persistent_volume"
}
],
"args": [
"cat",
"/persistent_volume/file"
]
}
]
}
timeout
在建構步驟中使用 timeout 欄位可設定執行步驟的時間限制。如果未設定這個欄位,步驟會執行到完成或建構自身逾時為止。建構步驟的 timeout 欄位不得超過為建構作業指定的 timeout 值。
timeout 以秒為單位指定 (使用Duration格式),最多可有 9 個小數位數,並應以 s 結尾 (例如:3.5s)。
在下列建構設定中,ubuntu 步驟會在 500 秒後逾時:
YAML
steps:
- name: 'ubuntu'
args: ['sleep', '600']
timeout: 500s
- name: 'ubuntu'
args: ['echo', 'hello world, after 600s']
JSON
{
"steps": [
{
"name": "ubuntu",
"args": [
"sleep",
"600"
],
"timeout": "500s"
},
{
"name": "ubuntu",
"args": [
"echo",
"hello world, after 600s"
]
}
]
}
script
在建構步驟中使用 script 欄位,指定要在步驟中執行的殼層指令碼。如果在建構步驟中指定 script,則無法在同一步驟中指定 args 或 entrypoint。如需使用 script 欄位的操作說明,請參閱「執行 Bash 指令碼」。
automapSubstitutions
如果設為 true,系統會自動對應所有替代項目,並在單一步驟中將這些項目設為環境變數。如果設為 false,請忽略該步驟的替代項目。如需範例,請參閱「取代變數值」。
結果
允許建構步驟儲存資料,然後在建構完成後,將該資料附加至建構結果中的認證。儲存的資料必須是鍵/值組合,其中鍵為字串,值為 JSON 物件。結果必須包含下列欄位:
name:結果的名稱。這個名稱會顯示在建構結果中的認證內。您也可以在建構步驟中,使用這個名稱參照結果。舉例來說,您可以在同一個建構步驟中,使用script將值附加至結果。attestationContent:(選用) 驗證名稱。這個值可以是任何值,並會顯示在建構結果中的認證結果內。只有在您打算驗證建構認證時,才需要這個欄位。attestationType:(選用) 認證類型。這個值可以是任何值,並會顯示在建構結果中的認證結果內。只有在您打算驗證建構認證時,才需要這個欄位。
下列建構作業會使用結果設定輸出認證,讓使用者驗證建構作業是否只使用含有支援前置字串的網址建構映像檔。在本範例中,結果定義為 allowlisted_prefixes。接著,allowlisted_prefixes 會設為 allowlisted_prefixes 和 [\"github.com\", \"gitlab.com\"] 的鍵/值組合,然後附加為建構結果的認證。
YAML
steps:
- name: "gcr.io/cloud-builders/docker"
id: "build-step"
args: ["build", "-t", "us-docker.pkg.dev/my-project/demo/helloworld-image", "."]
- name: "ubuntu"
id: "check-source-fetch-urls"
results:
- name: "allowlisted_prefixes"
attestationContent: "remote_fetch_allow_list"
attestationType: "https://cloudbuild.googleapis.com/attestations/build_content_restrictions"
script: |
#!/bin/bash
prefixes="[\"github.com\", \"gitlab.com\"]"
echo "allowlisted_prefixes=$prefixes" >> $RESULTS
cat $RESULTS
images:
- "us-docker.pkg.dev/my-project/demo/helloworld-image"
options:
requested_verify_option: VERIFIED
defaultLogsBucketBehavior: REGIONAL_USER_OWNED_BUCKET
JSON
{
"steps": [
{
"name": "gcr.io/cloud-builders/docker",
"id": "build-step",
"args": [
"build",
"-t",
"us-docker.pkg.dev/my-project/demo/helloworld-image",
"."
]
},
{
"name": "ubuntu",
"id": "check-source-fetch-urls",
"results": [
{
"name": "allowlisted_prefixes",
"attestationContent": "remote_fetch_allow_list",
"attestationType": "https://cloudbuild.googleapis.com/attestations/build_content_restrictions"
}
],
"script": "#!/bin/bash\nprefixes=\"[\\\"github.com\\\", \\\"gitlab.com\\\"]\"\necho \"allowlisted_prefixes=$prefixes\" >> $RESULTS\ncat $RESULTS\n"
}
],
"images": [
"us-docker.pkg.dev/my-project/demo/helloworld-image"
],
"options": {
"requested_verify_option": "VERIFIED",
"defaultLogsBucketBehavior": "REGIONAL_USER_OWNED_BUCKET"
}
}
timeout
在建構步驟外使用 timeout 欄位,設定執行建構的整體時間限制。如果過了這個時間,建構工作就會停止,且建構狀態會是 TIMEOUT。
如果未設定 timeout,建構作業會使用 60 分鐘的預設 timeout。timeout 的最大值為 24 小時。timeout 以秒為單位指定,使用 Duration 格式,最多可有 9 個小數位數,並應以 s 結尾 (例如:3.5s)。
在下面的程式碼片段中,timeout 設定為 660 秒,以免建構因休眠而逾時:
YAML
steps:
- name: 'ubuntu'
args: ['sleep', '600']
timeout: 660s
JSON
{
"steps": [
{
"name": "ubuntu",
"args": [
"sleep",
"600"
]
}
],
"timeout": "660s"
}
queueTtl
使用 queueTtl 欄位指定建構可排入佇列的時間長度。如果建構作業在佇列中等待的時間超過 queueTtl 中設定的值,建構作業就會過期,且建構狀態會設為 EXPIRED。如未提供值,Cloud Build 會使用預設值 3600s (1 小時)。queueTtl會從 createTime開始計算。queueTtl 必須以秒為單位指定,且不得超過九個小數位數,結尾必須是「s」,例如 3.5s。
在下列程式碼片段中,timeout 會設為 20s,而 queueTtl 會設為 10s。queueTtl 會在建構要求送達時 (createTime) 開始計時,timeout 則會在建構開始時 (startTime) 開始計時。因此,除非
建構作業在 + 前啟動,否則 queueTtl 會在 createTime + 10s 到期。
YAML
steps:
- name: 'ubuntu'
args: ['sleep', '5']
timeout: 20s
queueTtl: 10s
JSON
{
"steps": [
{
"name": "ubuntu",
"args": [
"sleep",
"5"
]
}
],
"timeout": "20s",
"queueTtl": "10s"
}
logsBucket
為建構設定 logsBucket 欄位可指定必須寫入建構記錄的 Cloud Storage 值區。如果您未設定這個欄位,Cloud Build 會使用 defaultLogsBucketBehavior 的值,將建構記錄儲存在 Cloud Storage 中 Cloud Build 建立的值區。
以下程式碼片段會設定 Cloud Build,將建構記錄儲存在 Cloud Storage 的自訂 bucket 中。
YAML
steps:
- name: 'gcr.io/cloud-builders/go'
args: ['install', '.']
logsBucket: 'gs://mybucket'
JSON
{
"steps": [
{
"name": "gcr.io/cloud-builders/go",
"args": [
"install",
"."
]
}
],
"logsBucket": "gs://mybucket"
}
options
請使用 options 欄位為建構指定下列選用引數:
enableStructuredLogging:
在建構記錄傳送至 Logging 時,啟用指定建構記錄欄位對應至 LogEntry 欄位。
舉例來說,如果建構記錄包含 message,則訊息會顯示在產生的記錄項目的 textPayload 或 jsonPayload.message 中。無法對應的建構記錄欄位會顯示在記錄項目中
jsonPayload。詳情請參閱「將建構記錄檔欄位對應至記錄項目欄位」。
env:這個版本中所有建構步驟都會使用的全域環境變數定義清單。如果變數同時定義於全域和建構步驟中,變數會使用建構步驟值。元素格式為 KEY=VALUE,環境變數 KEY 的值為 VALUE。
secretEnv:
使用 Cloud Key Management Service 加密編譯金鑰加密的環境變數清單,適用於這項建構作業的所有建構步驟。
這些值必須在建構版本的 Secret 中指定。
volumes:要為所有建構步驟全域掛接的磁碟區清單。每個磁碟區都會在建構程序開始前建立為空白磁碟區。建構完成後,系統會捨棄磁碟區及其內容。全域磁碟區名稱和路徑不得與建構步驟中定義的磁碟區衝突。在只有一個步驟的建構作業中使用全域磁碟區無效,因為這表示建構要求設定有誤。
pubsubTopic:
您可以提供 Pub/Sub 主題名稱,接收建構狀態通知。如果未提供名稱,Cloud Build 會使用預設主題名稱 cloud-builds。以下程式碼片段指定 Pub/Sub 主題名稱為 my-topic:
YAML
steps:
- name: 'gcr.io/cloud-builders/docker'
args: ['build', '-t', 'gcr.io/myproject/myimage', '.']
options:
pubsubTopic: 'projects/my-project/topics/my-topic'
JSON
{
"steps": [
{
"name": "gcr.io/cloud-builders/docker",
"args": [
"build",
"-t",
"gcr.io/myproject/myimage",
"."
]
}
],
"options": {
"pubsubTopic": "projects/my-project/topics/my-topic"
}
}
sourceProvenanceHash:設定 sourceProvenanceHash 選項,為原始碼來源指定雜湊演算法。以下程式碼片段指定雜湊演算法為 SHA256:
YAML
steps:
- name: 'gcr.io/cloud-builders/docker'
args: ['build', '-t', 'gcr.io/myproject/myimage', '.']
options:
sourceProvenanceHash: ['SHA256']
JSON
{
"steps": [
{
"name": "gcr.io/cloud-builders/docker",
"args": [
"build",
"-t",
"gcr.io/myproject/myimage",
"."
]
}
],
"options": {
"sourceProvenanceHash": ["SHA256"]
}
}
machineType:
Cloud Build 提供四種高 CPU 使用率虛擬機器類型來執行建構:兩種機器類型有 8 個 CPU,另外兩種則有 32 個 CPU。Cloud Build 也提供兩種額外的虛擬機器類型,分別搭載 1 個 CPU 和 2 個 CPU,可供您執行建構作業。預設機型為 e2-standard-2,包含 2 個 CPU。如果要求高效率 CPU 虛擬機器,可能會增加建構的啟動時間。新增 machineType 選項可要求 CPU 效率較高的虛擬機器:
YAML
steps:
- name: 'gcr.io/cloud-builders/docker'
args: ['build', '-t', 'gcr.io/myproject/myimage', '.']
options:
machineType: 'E2_HIGHCPU_8'
JSON
{
"steps": [
{
"name": "gcr.io/cloud-builders/docker",
"args": [
"build",
"-t",
"gcr.io/myproject/myimage",
"."
]
},
],
"options": {
"machineType": "E2_HIGHCPU_8"
}
}
如要進一步瞭解如何使用 machineType 選項,請參閱加速建構。
diskSizeGb:
使用 diskSizeGb 選項針對建構要求自訂磁碟大小。您可以要求的大小上限為 4000 GB。
以下程式碼片段要求 200 GB 的磁碟大小:
YAML
steps:
- name: 'gcr.io/cloud-builders/docker'
args: ['build', '-t', 'gcr.io/myproject/myimage', '.']
options:
diskSizeGb: '200'
JSON
{
"steps": [
{
"name": "gcr.io/cloud-builders/docker",
"args": [
"build",
"-t",
"gcr.io/myproject/myimage",
"."
]
}
],
"options": {
"diskSizeGb": '200'
}
}
logStreamingOption:請使用這個選項指定是否希望將建構記錄串流至 Cloud Storage。根據預設,Cloud Build 會在建構完成時收集建構記錄;這個選項可指定您是否要透過建構程序即時串流建構記錄。以下程式碼片段指定系統會將建構記錄串流至 Cloud Storage:
YAML
steps:
- name: 'gcr.io/cloud-builders/go'
args: ['install', '.']
options:
logStreamingOption: STREAM_ON
JSON
{
"steps": [
{
"name": "gcr.io/cloud-builders/go",
"args": [
"install",
"."
]
}
],
"options": {
"logStreamingOption": "STREAM_ON"
}
}
logging:
使用這個選項指定是否要將建構記錄儲存在 Cloud Logging 或 Cloud Storage 中:
GCS_ONLY:建構記錄會傳送至 Cloud Storage bucket。CLOUD_LOGGING_ONLY:建構記錄會傳送至 Logging 儲存空間。LEGACY:建構作業記錄檔會傳送至這兩個位置的 bucket。如果logging未定義,Cloud Build 會使用這個值。NONE:不會儲存建構記錄。
如要進一步瞭解建構記錄儲存空間的優點和注意事項,請參閱「建構記錄儲存空間選項」。
以下程式碼片段指定系統會將建構記錄儲存在 Cloud Storage 中:
YAML
steps:
- name: 'gcr.io/cloud-builders/docker'
args: ['build', '-t', 'gcr.io/myproject/myimage', '.']
options:
logging: GCS_ONLY
JSON
{
"steps": [
{
"name": "gcr.io/cloud-builders/docker",
"args": [
"build",
"-t",
"gcr.io/myproject/myimage",
"."
]
}
],
"options": {
"logging": "GCS_ONLY"
}
}
如果 logging 已設為將建構記錄傳送至 Cloud Storage,請使用這個欄位。
當 logging 的值為 GCS_ONLY、Legacy 或未定義時,建構記錄會傳送至 Cloud Storage 中的 bucket。在本例中,Cloud Build 會評估 logsBucket 和 defaultLogsBucketBehavior 欄位,判斷要將建構記錄傳送至哪個 Cloud Storage bucket:
logsBucket |
defaultLogsBucketBehavior |
建構記錄的儲存位置 |
|---|---|---|
| 已指定 bucket | 值遭到忽略 | 在 logsBucket 中指定的值區 |
| 沒有值 | REGIONAL_USER_OWNED_BUCKET |
在 Cloud Build 建立且使用者擁有的 bucket 中 |
| 沒有值 | LEGACY_BUCKET |
在 Cloud Build 建立及擁有的值區中 Google Cloud |
詳情請參閱「建構記錄儲存選項」。
以下建構設定會將 defaultLogsBucketBehavior 欄位設為 REGIONAL_USER_OWNED_BUCKET 值:
YAML
steps:
- name: 'gcr.io/cloud-builders/docker'
args: [ 'build', '-t', 'us-central1-docker.pkg.dev/myproject/myrepo/myimage', '.' ]
options:
defaultLogsBucketBehavior: REGIONAL_USER_OWNED_BUCKET
JSON
{
"steps": [
{
"name": "gcr.io/cloud-builders/docker",
"args": [
"build",
"-t",
"us-central1-docker.pkg.dev/myproject/myrepo/myimage",
"."
]
}
],
"options": {
"defaultLogsBucketBehavior": "REGIONAL_USER_OWNED_BUCKET"
}
}
dynamicSubstitutions:
使用這個選項,在替代變數中明確啟用或停用 bash 參數擴展。如果建構作業是由觸發條件叫用,dynamicSubstitutions 欄位一律會設為 true,因此不需要在建構設定檔中指定。如果手動叫用建構作業,則必須將 dynamicSubstitutions 欄位設為 true,才能在執行建構作業時解讀 Bash 參數擴充。
automapSubstitutions:
自動將所有替代項目對應至環境變數,這些變數會在整個建構過程中提供使用。如需範例,請參閱「取代變數值」。
substitutionOption:您將設定這個選項和下方的 substitutions 欄位,指定替代檢查發生錯誤時的行為。
pool:
將這個欄位的值設為私有集區的資源名稱,即可執行建構作業。如需在私人集區中執行建構作業的操作說明,請參閱「在私人集區中執行建構作業」一文。
requestedVerifyOption:
將 requestedVerifyOption 的值設為 VERIFIED,即可啟用並驗證建構作業的認證和來源中繼資料生成作業。設定完成後,只有在產生認證和出處時,建構作業才會標示為 SUCCESS。
substitutions
在建構設定檔中使用 substitutions 可在建構時間替換特定變數。對於值在建構時間之前仍未知的變數,或者以不同變數值重複使用現有建構要求而言,替代變數很實用。根據預設,如果有遺失的 substitution 變數或遺失的 substitution,建構會傳回錯誤,不過,您可以使用 ALLOW_LOOSE 選項略過這項檢查。
以下程式碼片段使用 substitutions 輸出「hello world」。ALLOW_LOOSE substitution 選項已設定,表示如果有遺失的 substitution 變數或遺失的 substitution,建構不會傳回錯誤。
YAML
steps:
- name: 'ubuntu'
args: ['echo', 'hello ${_SUB_VALUE}']
substitutions:
_SUB_VALUE: world
options:
substitution_option: 'ALLOW_LOOSE'
JSON
{
"steps": [
{
"name": "ubuntu",
"args": [
"echo",
"hello ${_SUB_VALUE}"
]
}
],
"substitutions": {
"_SUB_VALUE": "world"
},
"options": {
"substitution_option": "ALLOW_LOOSE"
}
}
如需使用 substitutions 的其他操作說明,請參閱「取代變數值」。
tags
請使用 tags 欄位將建構分組,並篩選建構。以下設定會設定名為 mytag1 和 mytag2 的兩個標記:
YAML
steps:
- name: 'gcr.io/cloud-builders/docker'
...
- name: 'ubuntu'
...
tags: ['mytag1', 'mytag2']
JSON
{
"steps": [
{
"name": "gcr.io/cloud-builders/docker"
},
{
"name": "ubuntu"
}
],
"tags": [
"mytag1",
"mytag2"
]
}
availableSecrets
在建構要求中,使用這個欄位參照 Secret Manager 或 Cloud KMS 中的一或多個密鑰。Cloud Build 可以在建構程序中,使用這些密鑰執行動作,例如登入帳戶。
Secret Manager
如要在建構設定檔中使用 Secret Manager 密鑰,請在建構設定檔的 availableSecrets 欄位中新增 secretManager 欄位。secretManager 欄位包含一或多個 versionName 和 env 欄位配對:
versionName:Secret Manager 中 Secret 的路徑。env:建構步驟可用來參照 Secret 的本機名稱 (環境變數)。
建構步驟中的 secretEnv 欄位會指定該步驟可使用的環境變數。
下列設定顯示如何使用儲存在 Secret Manager 中的 Docker 使用者名稱和密碼登入 Docker:
YAML
steps:
- name: 'gcr.io/cloud-builders/docker'
entrypoint: 'bash'
args: ['-c', 'docker login --username=$$USERNAME --password=$$PASSWORD']
secretEnv: ['USERNAME', 'PASSWORD']
availableSecrets:
secretManager:
- versionName: projects/PROJECT_ID/secrets/DOCKER_PASSWORD_SECRET_NAME/versions/DOCKER_PASSWORD_SECRET_VERSION
env: 'PASSWORD'
- versionName: projects/PROJECT_ID/secrets/DOCKER_USERNAME_SECRET_NAME/versions/DOCKER_USERNAME_SECRET_VERSION
env: 'USERNAME'
JSON
{
"steps": [
{
"name": "gcr.io/cloud-builders/docker",
"entrypoint": "bash",
"args": [
"-c",
"docker login --username=$$USERNAME --password=$$PASSWORD"
],
"secretEnv": [
"USERNAME",
"PASSWORD"
]
}
],
"availableSecrets": {
"secretManager": [{
"versionName": "projects/PROJECT_ID/secrets/DOCKER_PASSWORD_SECRET_NAME/versions/DOCKER_PASSWORD_SECRET_VERSION",
"env": "PASSWORD"
}, {
"versionName": "projects/PROJECT_ID/secrets/DOCKER_USERNAME_SECRET_NAME/versions/DOCKER_USERNAME_SECRET_VERSION",
"env": "USERNAME"
}]
}
}
詳情請參閱「使用 Secret」。
Cloud KMS
如要在建構設定檔中使用 Cloud KMS 金鑰,請在建構設定檔的 availableSecrets 欄位中新增 inline 欄位。inline 欄位包含一或多個 kmsKeyName 和 envMap 配對:
kmsKeyName:Cloud KMS 金鑰的路徑。envMap:建構步驟可用來參照密鑰的本機名稱 (環境對應)。
建構步驟中的 secretEnv 欄位會指定該步驟可使用的環境變數。
下列設定說明如何使用儲存在 Cloud KMS 中的 Docker 使用者名稱和密碼登入 Docker。
YAML
steps:
- name: 'gcr.io/cloud-builders/docker'
entrypoint: 'bash'
args: ['-c', 'docker login --username=$$USERNAME --password=$$PASSWORD']
secretEnv: ['USERNAME', 'PASSWORD']
- name: 'gcr.io/cloud-builders/docker'
entrypoint: 'bash'
args: ['-c', 'docker pull $$USERNAME/IMAGE:TAG']
secretEnv: ['USERNAME']
availableSecrets:
inline:
- kmsKeyName: projects/PROJECT_ID/locations/global/keyRings/USERNAME_KEYRING_NAME/cryptoKeys/USERNAME_KEY_NAME
envMap:
USERNAME: 'ENCRYPTED_USERNAME'
- kmsKeyName: projects/PROJECT_ID/locations/global/keyRings/PASSWORD_KEYRING_NAME/cryptoKeys/PASSWORD_KEY_NAME
envMap:
PASSWORD: 'ENCRYPTED_PASSWORD'
JSON
{
"steps": [
{
"name": "gcr.io/cloud-builders/docker",
"entrypoint": "bash",
"args": [
"-c",
"docker login --username=$$USERNAME --password=$$PASSWORD"
],
"secretEnv": [
"USERNAME",
"PASSWORD"
]
},
{
"name": "gcr.io/cloud-builders/docker",
"entrypoint": "bash",
"args": [
"-c",
"docker pull $$USERNAME/REPOSITORY:TAG"
],
"secretEnv": [
"USERNAME"
]
}
],
"availableSecrets": {
"inline": [{
"kmsKeyName": "projects/PROJECT_ID/locations/global/keyRings/USERNAME_KEYRING_NAME/cryptoKeys/USERNAME_KEY_NAME",
"envMap": {
"USERNAME": "ENCRYPTED_USERNAME"
}
},
{
"kmsKeyName": "projects/PROJECT_ID/locations/global/keyRings/PASSWORD_KEYRING_NAME/cryptoKeys/PASSWORD_KEY_NAME",
"envMap": {
"PASSWORD": "ENCRYPTED_PASSWORD"
}
}]
}
}
secrets
Secret 會將包含加密值的一組私密環境變數,與用來解密值的 Cloud KMS 金鑰配對。
serviceAccount
使用這個欄位指定要在建構時使用的 IAM 服務帳戶。詳情請參閱「設定使用者指定的服務帳戶」。
您無法在這個欄位中指定舊版 Cloud Build 服務帳戶。
images
建構設定檔中的 images 欄位指定要由 Cloud Build 推送至 Artifact Registry 的一或多個 Linux Docker 映像檔。您的建構可能會執行工作而不產生任何 Linux Docker 映像檔,但如果您建構映像檔而不將映像檔推送至登錄檔,系統會在建構完成時捨棄映像檔。如果建構期間未產生指定圖片,建構就會失敗。如要進一步瞭解如何儲存映像檔,請參閱「在 Artifact Registry 中儲存構件」。
以下建構設定會設定 images 欄位來儲存建構的映像檔:
YAML
steps:
- name: 'gcr.io/cloud-builders/docker'
args: ['build', '-t', 'gcr.io/myproject/myimage', '.']
images: ['gcr.io/myproject/myimage']
JSON
{
"steps": [
{
"name": "gcr.io/cloud-builders/docker",
"args": [
"build",
"-t",
"gcr.io/myproject/myimage",
"."
]
}
],
"images": [
"gcr.io/myproject/myimage"
]
}
artifacts
artifacts 欄位指定在所有建構步驟成功完成後,要儲存在 Cloud Storage 或 Artifact Registry 中的一或多個構件。
objects
在 artifacts 欄位中,object 欄位會指定要儲存在 Cloud Storage 中的一或多個成果。詳情請參閱「將建構構件儲存在 Cloud Storage」一文。
以下建構設定會設定 artifacts 欄位,將建構的 Go 套件儲存至 gs://mybucket/:
YAML
steps:
- name: 'gcr.io/cloud-builders/go'
args: ['build', 'my-package']
artifacts:
objects:
location: 'gs://mybucket/'
paths: ['my-package']
JSON
{
"steps": [
{
"name": "gcr.io/cloud-builders/go",
"args": [
"build",
"my-package"
]
}
],
"artifacts": {
"objects": {
"location": "gs://mybucket/",
"paths": [
"my-package"
]
}
}
}
goModules
您可以使用 goModules 欄位,將非容器 Go 模組上傳至 Artifact Registry 中的 Go 存放區。詳情請參閱「建構及測試 Go 應用程式」。
repository_location 欄位會指定用來儲存套件的 Artifact Registry 存放區。module_path 欄位會指定包含要上傳 Go 模組的本機目錄。這個目錄必須包含 go.mod 檔案。
建議使用 module_path 值的絕對路徑。您可以使用 . 參照目前的工作目錄,但不得省略或留空這個欄位。如需使用 module_path 的更多操作說明,請參閱「建構及測試 Go 應用程式」。
以下建構設定會設定 goModules 欄位,將 example.com/myapp 中的模組上傳至 Artifact Registry 存放區 quickstart-go-repo:
YAML
artifacts:
goModules:
- repositoryName: 'quickstart-go-repo'
repositoryLocation: 'us-central1'
repositoryProjectId: 'argo-local-myname'
sourcePath: '/workspace/myapp'
modulePath: 'example.com/myapp'
moduleVersion: 'v1.0.0'
JSON
{
"artifacts": {
"goModules": [
{
"repositoryName": "quickstart-go-repo",
"repositoryLocation": "us-central1",
"repositoryProjectId": "argo-local-myname",
"sourcePath": "/workspace/myapp",
"modulePath": "example.com/myapp",
"moduleVersion": "v1.0.0"
}
]
}
}
mavenArtifacts
您可以使用 mavenArtifacts 欄位,將非容器 Java 構件上傳至 Artifact Registry 中的 Maven 存放區。詳情請參閱「建構及測試 Java 應用程式」。
範例:將資料夾中的所有 Maven 檔案上傳至 Artifact Registry 存放區
下列建構設定會將 mavenArtifacts 欄位設為將 /workspace/target/com/mycompany/app/my-app-1/1.0.0/ 資料夾中的所有檔案上傳至 Artifact Registry 存放區 https://us-central1-maven.pkg.dev/my-project-id/my-java-repo:
YAML
artifacts:
mavenArtifacts:
- repository: 'https://us-central1-maven.pkg.dev/my-project-id/my-java-repo'
deployFolder: '/workspace/target'
artifactId: 'my-app-1'
groupId: 'com.mycompany.app'
version: '1.0.0'
JSON
{
"artifacts": {
"mavenArtifacts": [
{
"repository": "https://us-central1-maven.pkg.dev/my-project-id/my-java-repo",
"deployFolder": "/workspace/target",
"artifactId": "my-app-1",
"groupId": "com.mycompany.app",
"version": "1.0.0"
}
]
}
}
如要將 Maven 檔案部署至 /workspace/target/com/mycompany/app/my-app-1/1.0.0/,請在 Maven 部署指令中新增 -DaltDeploymentRepository=local::default::file:./workspace/target 選項。
範例:將封裝的 Maven 檔案上傳至 Artifact Registry 存放區
以下建構設定會設定 mavenArtifacts 欄位,將封裝的檔案 my-app-1.0-SNAPSHOT.jar 上傳至 Artifact Registry 存放區 https://us-central1-maven.pkg.dev/my-project-id/my-java-repo:
YAML
artifacts:
mavenArtifacts:
- repository: 'https://us-central1-maven.pkg.dev/my-project-id/my-java-repo'
path: '/workspace/my-app/target/my-app-1.0-SNAPSHOT.jar'
artifactId: 'my-app-1'
groupId: 'com.mycompany.app'
version: '1.0.0'
JSON
{
"artifacts": {
"mavenArtifacts": [
{
"repository": "https://us-central1-maven.pkg.dev/my-project-id/my-java-repo",
"path": "/workspace/my-app/target/my-app-1.0-SNAPSHOT.jar",
"artifactId": "my-app-1",
"groupId": "com.mycompany.app",
"version": "1.0.0"
}
]
}
}
pythonPackages
您可以使用 pythonPackages 欄位將 Python 套件上傳至 Artifact Registry。
詳情請參閱「建構及測試 Python 應用程式」。
以下建構設定會設定 pythonPackages 欄位,將 Python 套件 dist/my-pkg.whl 上傳至 Artifact Registry 存放區 https://us-east1-python.pkg.dev/my-project/my-repo:
YAML
artifacts:
pythonPackages:
- repository: 'https://us-east1-python.pkg.dev/my-project/my-repo'
paths: ['dist/my-pkg.whl']
JSON
{
"artifacts": {
"pythonPackages": [
{
"repository": "https://us-east1-python.pkg.dev/my-project/my-repo",
"paths": ["dist/my-pkg.whl"]
}
]
}
}
npmPackages
使用 npmPackages 欄位設定 Cloud Build,將建構的 npm 套件上傳至 Artifact Registry 中支援的存放區。您必須提供 repository 和 packagePath 的值。
repository 欄位會指定 Artifact Registry 存放區,用於儲存套件。packagePath 欄位指定包含要上傳 npm 套件的本機目錄。這個目錄必須包含 package.json 檔案。
建議使用 packagePath 值的絕對路徑。您可以使用 . 參照目前的工作目錄,但不得省略或留空這個欄位。如需使用 npmPackages 的更多說明,請參閱「建構及測試 Node.js 應用程式」。
以下建構設定會設定 npmPackages 欄位,將 /workspace/my-pkg 目錄中的 npm 套件上傳至 Artifact Registry 存放區 https://us-east1-npm.pkg.dev/my-project/my-repo。
YAML
artifacts:
npmPackages:
- repository: 'https://us-east1-npm.pkg.dev/my-project/my-repo'
packagePath: '/workspace/my-pkg'
JSON
{
"artifacts": {
"npmPackages": [
{
"repository": "https://us-east1-npm.pkg.dev/my-project/my-repo",
"packagePath": "/workspace/my-pkg"
}
]
}
}
oci
使用 oci 欄位設定 Cloud Build,將 OCI 映像檔上傳至 Artifact Registry 中支援的存放區。您必須提供 file 和 registryPath 的值。
registryPath 欄位會指定用來儲存映像檔的 Artifact Registry 存放區。file 欄位會指定包含要上傳 OCI 映像檔的本機目錄。這個目錄必須包含 OCI 映像檔。
建議使用 file 值的絕對路徑。您可以使用 . 參照目前的工作目錄,但不得省略或留空這個欄位。
以下建構設定會設定 oci 欄位,將 /.pack/layout-repo/my-app 目錄中的 OCI 映像檔上傳至 Artifact Registry 存放區 https://us-east1-docker.pkg.dev/my-project/my-repo。
YAML
artifacts:
oci:
- file: '/.pack/layout-repo/my-app'
registryPath: 'https://us-east1-docker.pkg.dev/my-project/my-repo'
tags: ["primary_image"]
JSON
{
"artifacts": {
"oci": [
{
"file": "/.pack/layout-repo/my-app",
"registryPath": "https://us-east1-docker.pkg.dev/my-project/my-repo",
"tags": ["primary_image"]
}
]
}
}
genericArtifacts
使用 genericArtifacts 欄位,在 Artifact Registry 的一般存放區中,將未指定類型的檔案上傳為新套件。如果您要上傳一般檔案 (例如文字檔案或二進位檔),或是要上傳的套件不是 Artifact Registry 支援的存放區類型,這項設定就很有幫助。
folder 欄位會指定包含要上傳至一般存放區檔案的資料夾。registryPath 欄位是 Artifact Registry 通用存放區的地址,可接收來自資料夾的檔案。
以下建構設定會設定 genericArtifacts 欄位,將 /workspace/binaryOut 資料夾上傳至 Artifact Registry 一般存放區 projects/my-project/locations/us-east1/repositories/my-repo/packages/my-pkg/versions/my-version。
YAML
artifacts:
genericArtifacts:
- folder: '/workspace/binaryOut'
registryPath: 'projects/my-project/locations/us-east1/repositories/my-repo/packages/my-pkg/versions/my-version'
JSON
{
"artifacts": {
"genericArtifacts": [
{
"folder": "/workspace/binaryOut",
"registryPath": "projects/my-project/locations/us-east1/repositories/my-repo/packages/my-pkg/versions/my-version"
}
]
}
}
您可以將一般構件設定為建構依附元件,讓 Cloud Build 在建構作業開始前下載依附元件。詳情請參閱「將一般構件指定為依附元件」。
使用 Dockerfile
如果您使用 gcloud CLI 或建構觸發條件在 Cloud Build 中執行 Docker 版本,則可使用 Dockerfile,不必另外提供建構設定檔。如要進一步調整 Docker 建構作業,除了 Dockerfile 之外,您也可以提供建構設定檔。如需如何使用 Dockerfile 建構 Docker 映像檔的操作說明,請參閱「快速入門:建構」。
Cloud Build 網路
Cloud Build 執行每個建構步驟時,會將步驟的容器連結至名為 cloudbuild 的本機 Docker 網路。cloudbuild 網路會代管應用程式預設憑證 (ADC), Google Cloud 服務可使用這些憑證自動尋找您的憑證。如果您執行巢狀 Docker 容器,並想將 ADC 公開給基礎容器,或在 docker 步驟中使用 gcloud,請在 Docker build 步驟中使用 --network 旗標:
YAML
steps:
- name: 'gcr.io/cloud-builders/docker'
args: ['build', '--network=cloudbuild', '.']
JSON
{
"steps": [
{
"name": "gcr.io/cloud-builders/docker",
"args": [
"build",
"--network=cloudbuild",
"."
]
}
]
}