我试图在Windows上使用bash作为GitLab CI Runner的shell.
concurrent = 1 check_interval = 0 [[runners]] name = "DESKTOP-RQTQ13S" url = "https://example.org/ci" token = "fooooooooooooooooooobaaaaaaaar" executor = "shell" shell = "bash" [runners.cache]
不幸的是,我找不到一个选项来指定CI Runner应该使用的实际shell程序.默认情况下,它只是尝试运行bash
它找不到的.我不知道为什么,因为当我打开Windows命令行并输入bash
它时.
Running with gitlab-ci-multi-runner 1.9.4 (8ce22bd) Using Shell executor... ERROR: Build failed (system failure): Failed to start process: exec: "bash": executable file not found in %PATH%
我尝试将文件添加bash.cmd
到包含的用户目录中
@"C:\Program Files\Git\usr\bin\bash.exe" -l
这给了我这个奇怪的错误:
Running with gitlab-ci-multi-runner 1.9.4 (8ce22bd) Using Shell executor... Running on DESKTOP-RQTQ13S... /usr/bin/bash: line 43: /c/Users/niklas/C:/Users/niklas/builds/aeb38de4/0/niklas/ci-test.tmp/GIT_SSL_CAINFO: No such file or directory ERROR: Build failed: exit status 1
有没有办法正确配置这个?
这里有两个问题,两者都可以解决.
gitlab-runner找不到 bash
gitlab-runner没有很好地结合unix风格和Windows风格的路径.
您通过创建bash.cmd
文件基本上成功地解决了第一个问题.但是,如果你很好奇,为什么它没有工作,没有它,我的猜测是,bash
在命令提示符下运行,因为它包含的目录(如你的情况"C:\ Program Files文件\的Git的\ usr\BIN")包含在您的用户帐户的PATH环境变量中.但也许你在系统帐户中运行gitlab-runner ,它可能没有相同的PATH.因此,首先要检查系统的PATH变量,并在必要时添加bin目录(即使用此处或此处所述的控制面板中的System小程序).只需确保在进行更改后重新启动计算机,因为直到重新启动后才会应用更改.bash
即使从系统或管理员帐户中运行的服务调用,这应该可以工作.
至于你在创建bash.cmd后得到的奇怪错误,那是由于第二个问题.在组合bash和Windows时,路径通常很难做到.Gitlab-runner可能正在尝试确定构建路径是相对路径还是绝对路径,并最终将Windows路径添加到它认为工作目录($PWD
)的前面.这看起来像一个bug,但gitlab仍然没有修复它(从跑步者版本9.0开始 !!)并且可能永远不会.也许他们已经确定它不是一个错误,或者是由于底层软件或工具中的错误导致他们无法解决或者修复起来太困难.无论如何,我发现了一个解决方法.您可以在config.toml
文件中指定构建的基本路径.如果您使用unix样式的路径,它可以解决问题.在Windows上,config.toml
通常与gitlab-runner.exe(或gitlab-multi-runner-amd64.exe等)位于同一文件夹中.在您喜欢的文本编辑器中打开该文件.然后找到该[[runners]]
部分并添加两行类似于以下内容.
builds_dir="/c/gitlab-runner/builds/" cache_dir="/c/gitlab-runner/cache/"
您使用的路径应该是您希望gitlab-runner用于存储构建等的任何目录的"bash版本".重要的是,如果您使用cygwin,您将使用类似于/cygdrive/c/...
而不是仅仅的路径/c/...
(适用于msys- git或独立的MSYS2等).
这是config.toml文件的示例:
[[runners]] name = "windows" url = "https://your.server.name" token = "YOUR_SECRET_TOKEN" executor = "shell" shell = "bash" builds_dir="/c/gitlab-runner/builds/" cache_dir="/c/gitlab-runner/cache/"