【问题标题】:How to use output of one command as an input to another on VSTS CI如何在 VSTS CI 上使用一个命令的输出作为另一个命令的输入
【发布时间】:2018-03-12 11:29:21
【问题描述】:

我正在尝试在 Microsoft 的 Visual Studio Team Services (VSTS) 上设置 CI,其中包括 AWS CLI 任务。我有一些构建 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 工具将文件上传到 Device Farm?

注意:我使用的是连接到 VSTS 的 Mac 驱动的代理,所以所有这些命令都在 OS X 上执行。

【问题讨论】:

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


    【解决方案1】:

    您好,我对 VSTS 不太熟悉,但我看到您使用的是 mac,所以如果您想要完整的 BASH 实现,您可以执行类似的操作。

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

    【讨论】:

    • 正是我所做的。我在 shell 脚本中编写了命令,毕竟我没有使用AWS CLI。在脚本中提取数据并使其在 AWS 上运行测试。另外,要将 URL 参数发送到curl,我必须用引号发送它(就像在文档中一样),所以jq 命令中的这个-r 是多余的。没有它,我会得到带引号的对象值。
    【解决方案2】:

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

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

    【讨论】:

    • 谢谢,在 GitHub 上发布问题是个好主意。此外,您的解决方法可能有效,但我认为这样做很麻烦。
    【解决方案3】:

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

    【讨论】:

    • 但问题是如何将echo 添加到第一个命令。我该怎么做?
    猜你喜欢
    • 2019-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-25
    • 2013-11-08
    • 1970-01-01
    • 2015-08-18
    • 1970-01-01
    相关资源
    最近更新 更多