我正在开发一个使用Travis CI的项目。我们的一些测试要求在环境变量中定义安全凭证,否则将跳过它们。我们正在使用the encrypt
command of the Travis CLI gem为我们的主存储库owner/Project
定义secure environment variable。此变量包含在我们的.travis.yml
文件中,如下所示:
env:
secure: "av9hxTZp/Dhe9xAOq6WlhTNDoWjjczN3lFanG6h/3h4kW7DsxhfXMRA96z6MambbC6c9ARFiwsQ24NeCAfPQ1m6r9uZwNkusqnRDOwZQeVQcmopnoNNG4Kd/9oclIVgsAlSG6WfhkyQPUG2p7PkOvxFV4/YjDSViYDR3eoih3JA="
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="
这导致Travis运行两个不同版本的构建。一个人试图使用每组安全凭证。由于只有一个集合对给定的存储库有效,这将导致测试套件运行两次,一次使用凭证,一次不使用。 You can see an example build here
这种额外的构建是浪费和不必要的。如果测试在没有任何一组安全凭据可用的环境中运行(例如来自分支的pull请求),则测试套件将在没有凭据两次的情况下运行。添加更多凭据会更糟糕;对于每个凭证构建,您都有多个冗余的未分解构建。
如何在单个Travis配置中为多个存储库定义安全环境变量,而不会导致额外的构建发生?
答案 0 :(得分:10)
当我在env
下直接定义了多个安全值时,它们似乎被视为使用了the matrix
key, which defines multiple variations of a build。就好像我写的那样:
env:
matrix:
- secure: "TcOCPDytGQpQgiP4w4LRdLXn+pUvhf5SjJF4J3TXjaPUCfomNfod2WTZn3v4WBR2kg3UCaeqFo2BmGUdwCdPbrAZ3cF2W749HLNU0Z2zxFWru5W+GAGgUi2FXIzzjF+U8Hb/2fLZ6GoUiSlNzVHKo/+kvLDAyuGnGFwfH7dpEb8="
- secure: "av9hxTZp/Dhe9xAOq6WlhTNDoWjjczN3lFanG6h/3h4kW7DsxhfXMRA96z6MambbC6c9ARFiwsQ24NeCAfPQ1m6r9uZwNkusqnRDOwZQeVQcmopnoNNG4Kd/9oclIVgsAlSG6WfhkyQPUG2p7PkOvxFV4/YjDSViYDR3eoih3JA="
相反,我需要在global
键下指定安全凭据,以便它们全部应用于每个构建:
env:
global:
- secure: "TcOCPDytGQpQgiP4w4LRdLXn+pUvhf5SjJF4J3TXjaPUCfomNfod2WTZn3v4WBR2kg3UCaeqFo2BmGUdwCdPbrAZ3cF2W749HLNU0Z2zxFWru5W+GAGgUi2FXIzzjF+U8Hb/2fLZ6GoUiSlNzVHKo/+kvLDAyuGnGFwfH7dpEb8="
- secure: "av9hxTZp/Dhe9xAOq6WlhTNDoWjjczN3lFanG6h/3h4kW7DsxhfXMRA96z6MambbC6c9ARFiwsQ24NeCAfPQ1m6r9uZwNkusqnRDOwZQeVQcmopnoNNG4Kd/9oclIVgsAlSG6WfhkyQPUG2p7PkOvxFV4/YjDSViYDR3eoih3JA="
Travis将尝试在单个构建中使用每个安全变量。它只能解码和使用适合于存储库和构建条件的那个(或没有)。 You can see an example build here。通过这种方式,您可以为单个Travis配置添加任意数量存储库的安全环境变量。