我想从外部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
脚本(或任何其他脚本或可执行文件)?
到目前为止,我所看到的(以及为什么我不认为这是最好的方式):
foo.sh
之类的脚本直接包含在Orb中的方法。circleci/XXX
创建一个新的Docker映像,将我的脚本包含在该Docker映像中并命名为目录。我真的不喜欢这个主意,因为脚本与它所基于的Docker映像无关。在这里,我只是将Docker误用作运输工具。wget
脚本,暂时存储它,然后从正在执行构建脚本的运行容器中调用它。但是从公共URL加载内容然后执行就感觉不对(打字错误或某些恶意工作都可能导致我用上帝知道什么内容来执行一些外国shell脚本)。我还没有想到的任何想法或最佳做法?
答案 0 :(得分:1)
工程,一个很好的例子是对带有哈希的脚本使用S3存储桶,您可以获取它们。对照s3中的哈希保存检查哈希,以便知道它是您的。
也很好。您可以在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 中的脚本