首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >仅在前一个任务的输出发生更改时才运行Concourse步骤

问仅在前一个任务的输出发生更改时才运行Concourse步骤
EN

Stack Overflow用户
提问于 2022-04-30 20:34:25
回答 1查看 386关注 0票数 0

给定一个输入,我有一个廉价的函数和一个昂贵的函数;每个函数都被建模为一个Concourse任务。

如果廉价函数的两个调用具有相同的输出,我知道昂贵函数的两个调用同样具有相同的输出。

当廉价函数的结果发生变化时,如何设置只运行昂贵函数的管道?

为了举个例子,假设廉价函数从一个代码基中去掉注释和空格,然后计算校验和;而昂贵的函数实际上运行包含的代码。在这个场景中,我的目标是不去构建任何只在注释或空格中与之前的版本不同的版本。

我已经考虑过使用git资源,并且(在我们的示例中)将每个编译目标的预处理输出哈希存储在不同的文件中,因此执行实际编译(和适用的单元测试)的任务可以通过构建该文件的输入哈希来触发对该文件的更改。但是,拥有一个单独的git资源来无限期地维护历史哈希似乎有点过分了。有没有更好的方法?

这与Have Concourse only build new docker containers on file diff not on commit类似,但我正在尝试测试针对文件更改运行函数的结果,以便只在可能修改构建结果的更改(而不是所有可能的更改)上触发。(上面描述的创建一个具有廉价功能输出的中间回购的提议,将有效地将这个问题的答案作为其组成部分之一;但我希望有一个选择,减少移动部件)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-01 02:45:05

考虑使用嵌套在put修饰符中的try::

​

​

cheap作业需要两个输入:

  • git回购了上一次廉价计算

的代码

  • 散列

在每次提交code-repo时,cheap作业读取last-hash输入,从hash映射并将其与计算结果进行比较(在下面的愚蠢示例中,hash.txt的内容签入code-repo的根)。

如果它确定来自传入提交的哈希值与先前记录的哈希值不同,它将使用新的哈希值填充put param hash/hash.txt,这将导致对资源进行新的put,进而触发expensive作业。

如果未检测到任何更改,则put尝试将失败,因为put param将不存在,但整个cheap作业将成功。

代码语言:javascript
复制
resources:
  - name: code-repo
    type: git
    source:
      branch: master
      private_key: ((key))
      uri: git@github.com:myorg/code-repo.git

  - name: hash
    type: s3
    source:
      access_key_id: ((aws_access))
      secret_access_key: ((aws_secret))
      region_name: ((aws_region))
      bucket: my-versioned-aws-bucket
      versioned_file: hash/hash.txt

jobs:
  - name: cheap
    plan:
    - get: code-repo
      trigger: true
    - get: hash
    - task: check
      input_mapping:
        last-hash: hash
      config:
        platform: linux
        image_resource:
          type: docker-image
          source: { repository: alpine }
        inputs:
          - name: code-repo
          - name: last-hash
        outputs:
          - name: hash
        run:
          path: /bin/sh
          args:
          - -c
          - |
            LAST="$(cat last-hash/hash.txt)"
            NEW=$(cat code-repo/hash.txt)
            if [ "$LAST" != "$NEW" ]; then
              cp code-repo/hash.txt hash/hash.txt
            fi
      on_success:
        try:
          put: hash
          params:
            file: hash/hash.txt

  - name: expensive
    plan:
    - get: hash
      trigger: true
      passed: [ cheap ]

注意:--您必须在s3中填充带有某些值的初始状态文件,否则cheap作业将无法执行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72071993

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档