【问题标题】:Put output of a command in a variable GoCD将命令的输出放入变量 GoCD
【发布时间】:2019-05-09 16:36:47
【问题描述】:

我尝试使用 GoCD 作业中的项目版本创建一个变量。

我的项目是用 maven 构建的。项目的版本在 pom.xml 文件中设置(存在于 git 存储库中)。

Maven 允许使用命令检索项目的版本:

mvn help:evaluate -Dexpression=project.version

所以我试图把这个命令的输出放在一个 linux 变量中:

my_version=${mvn help:evaluate -Dexpression=project.version}

然后使用它将项目推送到 docker 存储库:

docker push my_project:$my_version

问题是GoCD似乎有自己的解释器(见https://docs.gocd.org/current/faq/dev_use_current_revision_in_build.html)。要使用变量,我必须这样做:

sh -c docker push my_project:$my_version

但我找不到设置 linux 变量的方法。

GoCD 可以做些什么吗?这样做的正确方法是什么?

【问题讨论】:

    标签: maven continuous-integration go-cd


    【解决方案1】:

    GoCD 不会为整个作业维护单个 shell 会话。因此,即使您使用sh export MY_VERSION=... 并尝试在同一作业的下一个任务中使用它,它也不会按预期工作。

    要解决这个问题,最好的方法是将要执行的整个命令集包装在一个 shell 脚本中,然后将该 shell 脚本作为一个任务执行。鉴于整个 shell 脚本将在单个 shell 实例中执行,您定义的任何变量都可以使用。

    【讨论】:

    • 这几乎是我所担心的。我发现在 GoCD 代理中捆绑 shell 脚本是不可维护的。这意味着我必须为每个用例添加一个 shell 脚本......
    • 作为一般惯例,我们在每个 repo 中有一个单独的 repo 或一个名为“ops”的文件夹,其中包含所有这些脚本,我们在 GoCD 中使用该连接任务。可能这种方法可能对您有所帮助。
    • 是的,但我希望 GoCD 包含有关构建过程的所有信息。无论如何,谢谢你的回答:-)
    • 很高兴能提供帮助。通常,使您的构建脚本依赖于构建过程所使用的工具被认为是一种反模式。如果您想迁移到其他工具,从长远来看,将实际的构建步骤放在外部并使用该工具来编排流程可以简化事情。
    • 这是一个好点!但是由于您可以轻松导入/导出 gocd 模板,我发现将所有命令放在一个位置非常方便。
    猜你喜欢
    • 2018-07-16
    • 1970-01-01
    • 2015-01-01
    • 1970-01-01
    • 2012-02-15
    • 2015-11-17
    • 2011-09-13
    • 1970-01-01
    相关资源
    最近更新 更多