我们希望从 Bitbucket Pipelines 迁移到 Google Cloud Build 以测试、构建和推送 Docker 镜像。
我们如何在没有 CryptoKey 的情况下使用环境变量?例如:
- printf "https://registry.npmjs.org/:_authToken=${NPM_TOKEN}\nregistry=https://registry.npmjs.org" > ~/.npmrc
我们希望从 Bitbucket Pipelines 迁移到 Google Cloud Build 以测试、构建和推送 Docker 镜像。
我们如何在没有 CryptoKey 的情况下使用环境变量?例如:
- printf "https://registry.npmjs.org/:_authToken=${NPM_TOKEN}\nregistry=https://registry.npmjs.org" > ~/.npmrc
要在构建步骤的一部分中使用环境变量,args
您需要:
有关这两点的更详细说明,请参见下面的中断。
虽然 David Bendory 也链接到的Using encrypted resources文档(您可能基于您的假设)展示了如何使用通过 指定的加密环境变量来执行此操作secretEnv
,但这不是必需的,它也适用于普通环境变量。
在您的特定情况下,您需要将构建步骤修改为如下所示:
# you didn't show us which builder you're using - this is just one example of
# how you can get a shell using one of the supported builder images
- name: 'gcr.io/cloud-builders/docker'
entrypoint: 'bash'
args: ['-c', 'printf "https://registry.npmjs.org/:_authToken=%s\nregistry=https://registry.npmjs.org" $$NPM_TOKEN > ~/.npmrc']
请注意要格式化的字符串中 的用法%s
以及环境变量如何作为参数传递给printf
. 我不知道可以直接在格式字符串中包含环境变量值的方法。
或者,您可以使用echo
如下:
args: ['-c', 'echo "https://registry.npmjs.org/:_authToken=$${NPM_TOKEN}\nregistry=https://registry.npmjs.org" > ~/.npmrc']
详细解释:
我在顶部的第一点实际上可以分为两部分:
$
字符,以便 Cloud Build 不会尝试在此处执行替换如果您不这样做 2. 您的构建将失败并出现以下错误:合并替换和验证构建时出错:验证构建时出错:模板“NPM_TOKEN”中的键不是有效的内置替换
您应该通读替换变量值文档并确保您了解它是如何工作的。然后你需要意识到你没有在这里执行替换,至少不是 Cloud Build 替换。您要求外壳执行替换。
在这种情况下, 2. 实际上是您从替换变量值文档($$
计算结果为文字字符$
)中获得的唯一有用信息。
如果您经常使用 shell,我在顶部的第二点可能很明显。这 两个问题很好地解释了需要使用单引号的原因。基本上:“您需要使用单引号来防止在调用 shell 中发生插值。”
听起来您想使用加密的秘密:https ://cloud.google.com/cloud-build/docs/securing-builds/use-encrypted-secrets-credentials