2016-08-12 35 views
3

我試圖運行一些使用dreddapi blueprint來測試網站的api調用。我想在circleCI上運行測試,因爲在同一個地方運行了Selenium測試。每筆交易都需要附有兩個令牌,這些令牌在頭文件中設置爲Cookie。理想情況下,這些將在dredd.yml文件中設置。在本地機器上運行時,如果我將ACCESS_TOKENREFRESH_TOKEN替換爲實際值,則測試按預期運行。如何在dredd.yml文件中設置dredd測試的環境變量?

circle.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文件,所以我可能失去了一些東西基本的,但我沒有四處搜尋了一段時間。鉤子文件是用node.js編寫的,所以我不認爲ruby/rails的幫助在這裏很有用。如果我錯過了任何問題,請不要猶豫,讓我知道。

回答

3

YAML是一種數據表示語言,而不是模板語言(或模板處理器,就此而言)。雖然單個程序可能支持加載環境變量或配置中指定的其他參數,但YAML解析器(可能除非它是自定義模塊)不是注入它們的東西。在瀏覽dredd文檔時,我沒有看到任何對環境變量或參數的引用,因此可能值得在項目上創建一個問題,並與開發人員開始討論,看看是否支持這個問題。

我可以想出很多方法來解決您的具體問題,但它們都包含額外的工具來呈現與您的變量注入YAML。也許最簡單的解決方案是在CircleCI web configuration(不是版本控制的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 

然後正常運行作業的其餘部分,或者刪除配置文件或創建任何文物之前,以避免您的憑據泄漏從版本控制下恢復它。

0

使用標題的更好方法是通過Hook files設置標題before each請求。當您使用Node.js時,請嘗試設置節點環境變量:

var hooks = require('hooks'); 

hooks.beforeEach(function(transaction) { 

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

}