给定一个输入,我有一个廉价的函数和一个昂贵的函数;每个函数都被建模为一个Concourse任务。
如果廉价函数的两个调用具有相同的输出,我知道昂贵函数的两个调用同样具有相同的输出。
当廉价函数的结果发生变化时,如何设置只运行昂贵函数的管道?
为了举个例子,假设廉价函数从一个代码基中去掉注释和空格,然后计算校验和;而昂贵的函数实际上运行包含的代码。在这个场景中,我的目标是不去构建任何只在注释或空格中与之前的版本不同的版本。
我已经考虑过使用git资源,并且(在我们的示例中)将每个编译目标的预处理输出哈希存储在不同的文件中,因此执行实际编译(和适用的单元测试)的任务可以通过构建该文件的输入哈希来触发对该文件的更改。但是,拥有一个单独的git资源来无限期地维护历史哈希似乎有点过分了。有没有更好的方法?
这与Have Concourse only build new docker containers on file diff not on commit类似,但我正在尝试测试针对文件更改运行函数的结果,以便只在可能修改构建结果的更改(而不是所有可能的更改)上触发。(上面描述的创建一个具有廉价功能输出的中间回购的提议,将有效地将这个问题的答案作为其组成部分之一;但我希望有一个选择,减少移动部件)。
发布于 2022-05-01 02:45:05
考虑使用嵌套在put修饰符中的try::

cheap作业需要两个输入:
的代码
在每次提交code-repo时,cheap作业读取last-hash输入,从hash映射并将其与计算结果进行比较(在下面的愚蠢示例中,hash.txt的内容签入code-repo的根)。
如果它确定来自传入提交的哈希值与先前记录的哈希值不同,它将使用新的哈希值填充put param hash/hash.txt,这将导致对资源进行新的put,进而触发expensive作业。
如果未检测到任何更改,则put尝试将失败,因为put param将不存在,但整个cheap作业将成功。
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作业将无法执行。
https://stackoverflow.com/questions/72071993
复制相似问题