当依赖于先前的手动作业时,GitLab-CI作业失败

时间:2017-03-09 08:12:30

标签: continuous-integration gitlab gitlab-ci

场合

考虑以下private void showLocationSettings() { Snackbar snackbar = Snackbar.make(mainCoordinatorLayout, "Location Error: GPS Disabled!", Snackbar.LENGTH_LONG) .setAction("Enable", new View.OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS)); } }); snackbar.setActionTextColor(Color.RED); snackbar.setDuration(Snackbar.LENGTH_INDEFINITE); 示例:

.gitlab-ci.yml

结果

build: stage: build script: echo "Building..." build-doc: stage: build when: manual script: - echo "Building doc..." - echo "build result" > output.txt artifacts: name: "%CI_BUILD_NAME%_%CI_BUILD_ID%" expire_in: 1 week paths: - "output.txt" deploy-doc: stage: deploy only: - master dependencies: - build-doc script: - echo "Deploying doc..." - type output.txt 分支上此管道的结果是:

gitlab-ci-result

master工作的日志说:

deploy-doc

结论

即使$ echo "Deploying doc..." "Deploying doc..." $ type output.txt The system cannot find the file specified. ERROR: Build failed: exit status 1 明确依赖于手动deploy-doc工作工件,build-doc也不会被触发,从而导致{{1}失败工作。

问题

如何正确实现此行为?也就是说,当自动作业依赖于他时会触发手动作业?

上下文

我只想在build-doc分支上自动构建部署文档,其他分支机构只能手动构建文档以下载生成的文档。

解决方案

在接受的答案的附录中,请参阅我自己的答案below

2 个答案:

答案 0 :(得分:3)

最简单的方法是使用trigger。将deploy-doc作业定义为:

only:
  - triggers

使用yaml锚点执行两个build-doc声明为

的副本
only:
  - master

另一个

when:
  - manual

build-doc在结束时调用触发器。这将重建整个管道,因此您可以将build作业定义为

except:
  - triggers

或者使用$CI_JOB_MANUAL变量并让deploy-doc仅在master和触发器上运行,所以至少在master上它不会重建所有内容。

答案 1 :(得分:0)

感谢 Jackub Kania 的答案,它指出了我正确的方向,我最终使用yaml锚来解决我的问题。

我只是将实际build-doc修改为.build-doc-template锚点作业(刚删除了manual条件)并创建了两个版本的build-doc作业,如下所示:

build-doc:
  <<: *build-doc-template
  only: 
    - master

build-doc-manual:
  <<: *build-doc-template
  when: manual
  except: 
    - master

这样,我可以避免触发器复杂化。如果需要,请索取完整的代码。