我们有一个运行在Windows2016机箱上的GitLab跑步者。在大多数情况下,它运行良好。然而,当我尝试启动和运行一个新的管道时,我经常会遇到一个问题,那就是运行者似乎在一半的时间里忘记了这一点。
GitLab Runner的config.toml如下所示:
concurrent = 1
check_interval = 0
log_level = "debug"
[session_server]
session_timeout = 1800
[[runners]]
name = "Application Template"
url = "https://my-gitlab-instance.com"
token = "mYt0k3n"
executor = "shell"
shell = "powershell"
[runners.custom_build_dir]
[runners.cache]
[runners.cache.s3]
[runners.cache.gcs]
[runners.cache.azure]每次我添加一个新的运行程序时,我都必须手动将shell = "pwsh"行更改为shell = "powershell",否则根本无法工作。
我目前正在开发一个新的管道,其中包括这个部署作业:
deploy-job:
stage: deploy
dependencies:
- build-job
environment: production
script:
- 'Remove-Item -Path "$env:DEPLOY_PATH\*.*"'
- 'xcopy /y /s ".\public\*.*" "$env:DEPLOY_PATH"'当管道运行时,至少有50%的时间是这样的:

看到了第24行是怎么写Remove-Item: command not found的吗?这就是我一直遇到的问题。问题是,如果我重新运行这份工作几次,它最终会工作,而我没有改变任何东西。
我怀疑这个问题与以下事实有关:第24行以bash开头,表明运行程序试图使用Bash (没有安装在服务器上)来执行脚本。当作业成功运行时,输出将丢失bash:

但是为什么运行者有时会使用Bash来执行脚本呢?我已经在config.toml中明确告诉它使用PowerShell。为什么它有时使用Bash而有时不使用?
发布于 2022-09-21 21:08:25
在我突然想起自己很久以前就想出了答案之前,我就写了整个问题,但我想无论如何我还是会把答案连同答案一起贴出来,以防它对其他人有帮助(可能几个月后就会包括我)。
TL;DR:禁用GitLab项目中CI/CD的共享运行程序。
出现此问题的原因是,默认情况下,GitLab中的新项目为CI/CD启用了共享运行程序。由于我们的GitLab实例中存在的共享运行程序从未进行过其他配置(而且由于我们的自托管GitLab实例运行在Linux服务器上),它使用PowerShell执行作业,而PowerShell不理解PowerShell命令。当我运行我的管道时,无论GitLab是使用配置良好的GitLab运行程序还是使用具有默认配置的共享运行程序来执行作业,都是很幸运的。当它使用共享跑步者的时候,我的工作失败了。很有道理。
解决办法很简单。在GitLab项目中,转到设置> CI/CD >运行程序并禁用共享运行程序。或者,您可以根据需要配置共享运行程序,但在我的示例中,简单地禁用共享运行程序要简单得多!
https://stackoverflow.com/questions/73806951
复制相似问题