如何在CircleCI构建脚本中使用外部脚本

时间:2019-02-27 13:21:24

标签: continuous-integration circleci circleci-2.0

我想从外部Shell脚本中导入逻辑,作为我的CircleCI配置的一部分,我正在寻找实现此目的的“正确”(或最佳)方法。

假设我对于CircleCI具有以下config.yml

version: 2.1
jobs:
  build:
    docker:
      - image: circleci/ruby:2.5.3-node-browsers
    steps:
      - checkout
      - run:
          name: Compute some value
          command: |
            SOME_VALUE=$(foo.sh)
      - run:
          name: Reuse some value
          command: |
            echo "Hello" > /a/path/${SOME_VALUE}.txt

总体思路是将这些步骤包装到CircleCI Orb中,然后让我的构建配置从Orb中重用它们。但是foo.sh脚本无法打包到Orb本身中,因此我需要其他方法来使其在构建配置中可访问。

那么如何在构建过程中包含foo.sh脚本(或任何其他脚本或可执行文件)?

到目前为止,我所看到的(以及为什么我不认为这是最好的方式):

  1. 从CircleCI文档中,我看不到一种将foo.sh之类的脚本直接包含在Orb中的方法。
  2. 我可以基于circleci/XXX创建一个新的Docker映像,将我的脚本包含在该Docker映像中并命名为目录。我真的不喜欢这个主意,因为脚本与它所基于的Docker映像无关。在这里,我只是将Docker误用作运输工具。
  3. 我可以从公共位置wget脚本,暂时存储它,然后从正在执行构建脚本的运行容器中调用它。但是从公共URL加载内容然后执行就感觉不对(打字错误或某些恶意工作都可能导致我用上帝知道什么内容来执行一些外国shell脚本)。
  4. 我可以将一些Git存储库的脚本克隆到正在运行的构建容器中的本地文件系统中,然后执行该脚本。感觉比选项(3)好一点。

我还没有想到的任何想法或最佳做法?

2 个答案:

答案 0 :(得分:1)

  1. 工程,一个很好的例子是对带有哈希的脚本使用S3存储桶,您可以获取它们。对照s3中的哈希保存检查哈希,以便知道它是您的。

  2. 也很好。您可以在circleci环境中克隆另一个存储库,然后将该存储库用作脚本源。 VCS很高兴能在您的脚本中作为奖励。

另一个选项,您可以利用配置为YAML并使用HEREDOC将您的脚本嵌入到config.yml中。运行时使用它:将您的HEREDOC回显到本地文件。这确实使配置更难以阅读。也许YAML具有“包含”支持,所以您可以调用另一个文件以使config.yml中的内容保持整洁。

答案 1 :(得分:1)

<块引用>

那么如何将 foo.sh 脚本(或任何其他脚本或可执行文件)包含到我的构建过程中?

您将其打包在球体中。

以下是圈子维护的球体之一的示例:

https://github.com/CircleCI-Public/slack-orb/blob/master/src/commands/notify.yml#L79

      command: <<include(scripts/notify.sh)>>

引用 https://github.com/CircleCI-Public/slack-orb/tree/master/src/scripts/notify.sh 中的脚本