3

我正在尝试使用dreddapi blueprint运行多个 api 调用来测试站点。我想在 circleCI 上运行测试,因为 Selenium 测试在同一个地方运行。每笔交易都需要附有两个令牌,这些令牌在标头中设置为 cookie。理想情况下,这些将在 dredd.yml 文件中设置。在本地机器上运行时,如果我用实际值替换ACCESS_TOKEN和,测试会按预期运行。REFRESH_TOKEN

圈子.yml:

test:
    override:
            - dredd

dredd.yml 标头

header: ['Cookie: access_token=ACCESS_TOKEN; refresh_token=REFRESH_TOKEN']

其中 ACCESS_TOKEN 和 REFRESH_TOKEN 被 circleCI 的环境变量中设置的实际值替换。我也试过access_token=$[ACCESS_TOKEN]access_token=$["ACCESS_TOKEN"]access_token=$ACCESS_TOKEN。这些都没有在第一个 api 调用的标头中被替换。

标题看起来像:{"Content-Type":"application/json; charset=utf-8","User-Agent":"Dredd/1.4.0 (Darwin 14.5.0; x64)","Cookie":" access_token=$ACCESS_TOKEN; refresh_token=$REFRESH_TOKEN"}

我是 yaml 文件的新手,所以我可能缺少一些基本的东西,但我确实搜索了一段时间。hooks 文件是用 node.js 编写的,所以我认为 ruby​​/rails 帮助在这里没有用。如果我在问题中遗漏了任何内容,请随时告诉我。

4

2 回答 2

3

YAML 是一种数据表示语言,而不是模板语言(或模板处理器,就此而言)。虽然单个程序可能支持加载配置中指定的环境变量或附加参数,但 YAML 解析器(可能,除非它是自定义模块)并不是注入它们的东西。在浏览 dredd 文档时,我没有看到对环境变量或参数的任何引用,可能值得在项目上创建一个问题并开始与开发人员讨论以查看是否支持。

我可以想到多种方法来解决您的特定问题,但它们都涉及额外的工具来渲染带有注入变量的 YAML。对于您的情况,最简单的解决方案可能是在CircleCI Web 配置中设置环境变量(不是版本控制的 circle.yml)。然后,设置生成 YAML 配置的预构建步骤。为此,请将 YAML 包装在 BASH 脚本中,并将 YAML 文档作为here-doc包含在其中。

#!/bin/bash

# ACCESS_TOKEN and REFRESH_TOKEN are injected by CircleCI

cat <<EOF > config.yml
---
header: ['Cookie: access_token=${ACCESS_TOKEN}; refresh_token=${REFRESH_TOKEN}']
EOF

然后正常运行其余的工作,可能在创建任何工件之前删除配置文件或从版本控制中恢复它,以避免凭据泄漏。

于 2016-08-12T19:54:55.513 回答
0

使用标头的更好方法是在每个请求之前通过Hook 文件设置标头。当您使用Node.js时,请尝试设置 Node 环境变量:

var hooks = require('hooks');

hooks.beforeEach(function(transaction) {

  transaction.request.headers.Cookie = 
    'access_token=' + ACCESS_TOKEN + 
    '; refresh_token=' + REFRESH_TOKEN;

}
于 2017-04-12T20:56:41.797 回答