如何在VSTS CI

时间:2018-03-12 11:29:22

标签: amazon-web-services continuous-integration azure-devops build-definition aws-device-farm

我尝试在Microsoft的 Visual Studio Team Services (VSTS)上设置包含 AWS CLI 任务的CI。我有一些构建iOS应用程序的步骤,这些步骤已成功执行。然后,我想使用AWS CLI命令将生成的.ipa文件上传到AWS Device Farm

要将文件上传到AWS,我跟着this documentation,其中声明我必须先运行aws devicefarm create-upload ...命令。此命令在VSTS上成功执行,并输出JSON格式的响应,如下所示:

{
    "upload": {
        "arn": "arn:aws:devicefarm:us-west-2:123456789012:upload:070fc3ca-7ec1-4741-9c1f-d3e044efc506/dd72723a-ae9e-4087-09e6-f4cea3599514",
        "name": "MyAppiOSUITests_20180309.3.ipa",
        "created": 1520601466.978,
        "type": "IOS_APP",
        "status": "INITIALIZED",
        "url": "https://prod-us-west-2-uploads.s3-us-west-2.amazonaws.com/arn%3Aaws%3Adevicefarm%3Aus-west-2%3A123456789012%3Aproject%3A070fc3ca-c7e1-4471-91cf-d3e4efc50604/uploads/arn%3Aaws%3Adevicefarm%3Aus-west-2%3A123456789012%3Aupload%3A070fc3ca-7ec1-4741-9c1f-d3e044efc506/dd72723a-ae9e-4087-09e6-f4cea3599514/app.apk?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20170824T224008Z&X-Amz-SignedHeaders=host&X-Amz-Expires=86400&X-Amz-Credential=AKIAEXAMPLEPBUMBC3GA%2F20170824%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Signature=05050370c38894ef5bd09f5d009f36fc8f96fa4bb04e1bba9aca71b8dbe49a0f"
    }
}

这基本上意味着这个命令只是准备上传和上传真实文件,之后我必须做HTTP PUT(按建议使用curl)。

在那个JSON响应中,我得到url对象,其值是一个URL,我必须发送带有我要上传的文件的HTTP POST请求,如下所示:

curl -T MyAppiOSUITests_20180309.3.ipa "https://prod-us-west-2-uploads.s3-us-west-2.amazonaws.com/arn%3Aaws%3Adevicefarm%3Aus-west-2%3A123456789012%3Aproject%3A070fc3ca-c7e1-4471-91cf-d3e4efc50604/uploads/arn%3Aaws%3Adevicefarm%3Aus-west-2%3A123456789012%3Aupload%3A070fc3ca-7ec1-4741-9c1f-d3e044efc506/dd72723a-ae9e-4087-09e6-f4cea3599514/app.apk?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20170824T224008Z&X-Amz-SignedHeaders=host&X-Amz-Expires=86400&X-Amz-Credential=AKIAEXAMPLEPBUMBC3GA%2F20170824%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Signature=05050370c38894ef5bd09f5d009f36fc8f96fa4bb04e1bba9aca71b8dbe49a0f"

问题是我必须使用两个任务(awscurl)来上传单个文件,其中第二个任务取决于第一个文件的输出。如何在VSTS构建任务之间保存输出(并解析它以获得url对象的值)并将该输出传递给另一个任务?或者,我可以避免使用curl并使用aws工具和单个命令将文件上传到设备农场吗?

注意:我使用连接到VSTS的Mac电源代理,因此所有这些命令都在OS X上执行。

3 个答案:

答案 0 :(得分:1)

如果可以将echo添加到第一个脚本/命令,则可以使用##vso[task.setvariable]value消息将值作为环境变量传递给第二个脚本/命令。详见Logging Commands

答案 1 :(得分:1)

您好我不太熟悉VSTS,但我发现您使用的是Mac,所以如果您想要完整的BASH实现,您可以做类似的事情。

var=$(cat file.txt | jq -r '.upload.url')
curl -T TEST.ipa $var

答案 2 :(得分:0)

AWS CLI任务中没有output variable,您可以在此处提交问题:https://github.com/aws/aws-vsts-tools/issues

解决方法是您可以通过Build Log REST API获取任务日志,因此您可以调用REST API来获取任务日志(例如通过curl),然后从日志中提取数据。