如何解决通过 shell 脚本设置云构建默认替换变量
我使用了 shell 脚本,以便能够在 Google Cloud Platform 上创建我的资源。
看起来像这样:
import * as sinon from 'sinon';
import * as mailgun from 'mailgun-js';
import { EmailgunService } from './emailgun.service';
let sandbox = sinon.createSandbox();
const mailgunSendSpy = sandbox.stub().yields(null,{ message: 'hello',id: '100' });
describe('sendEmail method',() => {
let sender: any;
beforeEach(() => {
sender = sandbox.stub(mailgun.default({ apiKey: 'foo',domain: 'bar' }),'messages')
.returns({
send: mailgunSendSpy,});
});
afterEach(() => {
sandbox.restore();
});
it.only('should call send',async () => {
sandbox.spy(sender,"messages");
const emailgunService: EmailgunService = new EmailgunService();
const result = await emailgunService.sendEmail('test@test.com','test','Hello!');
});
});
我还为我的项目启用了 Cloud Build,并在其中定义了触发器。我的替换变量的某些值应该等于上面脚本中的 FILES_SOURCE 和 FUNCTIONS_BUCKET。如果我在执行 shell 脚本之前启用了 Cloud Build,是否可以从 shell 脚本以某种方式分配这些值(及其键)?
我可以看到我们有 gcloud builds 接口,但它似乎没有这样的选项。
解决方法
您必须引用用户定义的替换变量,因为默认替换是由 Cloud Build 自动定义的。关于 gcloud builds
接口,您可以设置 --substitutions
标志来指定您的用户定义变量,但查看您的示例,这些似乎不是固定的。
很遗憾,如果值来自 shell 脚本,您将无法指定用户定义的替换变量。但是,有一个解决方法,通过将值保存在文件中,然后根据需要读取它,您的 shell 脚本变量将保留整个构建步骤。
您尚未指定您打算如何使用这些变量,但这里有一个示例:
build.sh
REGION=us-east1
DEVSHELL_PROJECT_ID=sample-proj
FUNCTIONS_BUCKET=${DEVSHELL_PROJECT_ID}-functions-$(date +%s)
FILES_SOURCE=${DEVSHELL_PROJECT_ID}-source-$(date +%s)
# Store variables on a file
echo $FUNCTIONS_BUCKET > /workspace/functions-bucket &&
echo $FILES_SOURCE > /workspace/files-source
echo "Saved values."
cloudbuild.yaml
steps:
- id: "Read script and store values"
name: 'gcr.io/cloud-builders/gcloud'
entrypoint: 'bash'
args: ['./build.sh']
- id: "Read Values"
name: gcr.io/cloud-builders/gcloud
entrypoint: 'bash'
args:
- -c
- |
# Read from "/workspace"
echo "First we saved " $(cat /workspace/functions-bucket) &&
echo "Then we saved " $(cat /workspace/files-source)
注意:我们使用 /workspace
是因为 Cloud Build 默认将其用作工作目录。
参考:https://medium.com/google-cloud/how-to-pass-data-between-cloud-build-steps-de5c9ebc4cdd
,您无法在 Cloud Build 过程中覆盖替换变量。所以,你有两个解决方案
- 无论您使用“Linux”变量,Donnald 的答案都是正确的解决方案(您必须在每个步骤中从文件中读取值然后使用它)
- 或者您可以在 Cloud Build 中调用 Cloud Build。像这样
使用替换变量为您的核心构建创建 Cloud Build 文件
steps:
- name: 'gcr.io/cloud-builders/gcloud'
entrypoint: 'bash'
args:
- -c
- |
echo $_FUNCTIONS_BUCKET
echo $_FILES_SOURCE
...
substitutions:
_FUNCTIONS_BUCKET:
_FILES_SOURCE:
然后,创建一个用于初始化的文件:cloudbuild-init.yaml
steps:
- name: 'gcr.io/cloud-builders/gcloud'
entrypoint: 'bash'
args:
- -c
- |
REGION=us-east1
DEVSHELL_PROJECT_ID=sample-proj
FUNCTIONS_BUCKET=$${DEVSHELL_PROJECT_ID}-functions-$$(date +%s)
FILES_SOURCE=$${DEVSHELL_PROJECT_ID}-source-$$(date +%s)
gcloud builds submit --async --substitutions=_FUNCTIONS_BUCKET=$${FUNCTIONS_BUCKET},_FILES_SOURCE=$${FILES_SOURCE}
您可以注意到异步在完成初始化之前不等待底层 Cloud Build 结束。否则,您将支付两倍于构建成本的费用。另一方面,您不会在触发器中知道您的工作是否有效。
这里是权衡的问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。