在单个.travis.yml中为多个存储库定义安全环境变量

7 environment-variables travis-ci

我正在开发一个使用Travis CI的项目.我们的一些测试需要在环境变量中定义安全凭证,否则会跳过它们.我们使用Travis CLI gem encrypt命令为我们的主存储库定义安全的环境变量owner/Project.该变量包含在我们的.travis.yml文件中,如下所示:

单一存储库配置
env:
  secure: "av9hxTZp/Dhe9xAOq6WlhTNDoWjjczN3lFanG6h/3h4kW7DsxhfXMRA96z6MambbC6c9ARFiwsQ24NeCAfPQ1m6r9uZwNkusqnRDOwZQeVQcmopnoNNG4Kd/9oclIVgsAlSG6WfhkyQPUG2p7PkOvxFV4/YjDSViYDR3eoih3JA="
Run Code Online (Sandbox Code Playgroud)

travis encrypt我们使用私钥加密了这些变量owner/Project,Travis为该存储库成功运行了凭证测试.

但是我们有另一个存储库,contributor/Project它也用于开发.当Travis在该存储库中运行时,安全环境变量不可用,并且会跳过凭证测试.

我曾经travis encrypt为一组凭据加密contributor/Project,并尝试将其添加到.travis.yml这样:

造成额外的建设
env:
  - secure: "av9hxTZp/Dhe9xAOq6WlhTNDoWjjczN3lFanG6h/3h4kW7DsxhfXMRA96z6MambbC6c9ARFiwsQ24NeCAfPQ1m6r9uZwNkusqnRDOwZQeVQcmopnoNNG4Kd/9oclIVgsAlSG6WfhkyQPUG2p7PkOvxFV4/YjDSViYDR3eoih3JA="
  - secure: "TcOCPDytGQpQgiP4w4LRdLXn+pUvhf5SjJF4J3TXjaPUCfomNfod2WTZn3v4WBR2kg3UCaeqFo2BmGUdwCdPbrAZ3cF2W749HLNU0Z2zxFWru5W+GAGgUi2FXIzzjF+U8Hb/2fLZ6GoUiSlNzVHKo/+kvLDAyuGnGFwfH7dpEb8="
Run Code Online (Sandbox Code Playgroud)

这导致Travis运行两个不同版本的构建.一个人试图使用每组安全凭证.由于只有一个集合对给定的存储库有效,这将导致测试套件运行两次,一次使用凭证,一次不使用.您可以在此处查看示例构建.

这种额外的构建是浪费和不必要的.如果测试在没有任何一组安全凭据可用的环境中运行(例如来自分支的pull请求),则测试套件将在没有凭据两次的情况下运行.添加更多凭证会更糟糕; 对于每个凭证构建,您都有多个冗余的未分解构建.

如何在单个Travis配置中为多个存储库定义安全环境变量,而不会导致额外的构建发生?

小智 10

当我直接定义多个安全值时env,它们似乎被视为我使用matrix键,它定义了构建的多个变体.好像我写了:

造成额外的建设
env:
  matrix:
    - secure: "TcOCPDytGQpQgiP4w4LRdLXn+pUvhf5SjJF4J3TXjaPUCfomNfod2WTZn3v4WBR2kg3UCaeqFo2BmGUdwCdPbrAZ3cF2W749HLNU0Z2zxFWru5W+GAGgUi2FXIzzjF+U8Hb/2fLZ6GoUiSlNzVHKo/+kvLDAyuGnGFwfH7dpEb8="
    - secure: "av9hxTZp/Dhe9xAOq6WlhTNDoWjjczN3lFanG6h/3h4kW7DsxhfXMRA96z6MambbC6c9ARFiwsQ24NeCAfPQ1m6r9uZwNkusqnRDOwZQeVQcmopnoNNG4Kd/9oclIVgsAlSG6WfhkyQPUG2p7PkOvxFV4/YjDSViYDR3eoih3JA="
Run Code Online (Sandbox Code Playgroud)

相反,我需要在global密钥下指定安全凭证,以便它们全部应用于每个构建:

很好地工作
env:
  global:
    - secure: "TcOCPDytGQpQgiP4w4LRdLXn+pUvhf5SjJF4J3TXjaPUCfomNfod2WTZn3v4WBR2kg3UCaeqFo2BmGUdwCdPbrAZ3cF2W749HLNU0Z2zxFWru5W+GAGgUi2FXIzzjF+U8Hb/2fLZ6GoUiSlNzVHKo/+kvLDAyuGnGFwfH7dpEb8="
    - secure: "av9hxTZp/Dhe9xAOq6WlhTNDoWjjczN3lFanG6h/3h4kW7DsxhfXMRA96z6MambbC6c9ARFiwsQ24NeCAfPQ1m6r9uZwNkusqnRDOwZQeVQcmopnoNNG4Kd/9oclIVgsAlSG6WfhkyQPUG2p7PkOvxFV4/YjDSViYDR3eoih3JA="
Run Code Online (Sandbox Code Playgroud)

Travis将尝试在单个构建中使用每个安全变量.它只能解码和使用适合于存储库和构建条件的那个(或没有).您可以在此处查看示例构建.通过这种方式,您可以为单个Travis配置添加任意数量的存储库的安全环境变量.