使用Bash的Windows GitLab CI运行程序
我试图在Windows上使用bash作为GitLab CI运行程序的shell使用Bash的Windows GitLab CI运行程序,windows,bash,gitlab-ci,gitlab-ci-runner,Windows,Bash,Gitlab Ci,Gitlab Ci Runner,我试图在Windows上使用bash作为GitLab CI运行程序的shell concurrent = 1 check_interval = 0 [[runners]] name = "DESKTOP-RQTQ13S" url = "https://example.org/ci" token = "fooooooooooooooooooobaaaaaaaar" executor = "shell" shell = "bash" [runners.cache] 不幸的
concurrent = 1
check_interval = 0
[[runners]]
name = "DESKTOP-RQTQ13S"
url = "https://example.org/ci"
token = "fooooooooooooooooooobaaaaaaaar"
executor = "shell"
shell = "bash"
[runners.cache]
不幸的是,我找不到一个选项来指定CI运行程序应该使用的实际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 ci与Windows Linux子系统链接起来(可以通过在Windows命令提示符下键入
bash
来访问)?我怀疑Gitlab的runner配置是否直接支持这一点
相反,我建议将Powershell与shell执行器一起使用
Executor = 'shell'
Shell = 'powershell'
然后可以在从.gitlab-ci.yml调用的脚本中下拉到Bash中
考虑到在.gitlab-ci.yml本身中执行比非常琐碎的shell脚本更多的脚本(而不是调用外部脚本)是一种不好的做法,因此被迫使用本机Windows shell几乎不会有什么损失。这里有两个问题,这两个问题都可能得到解决
bash
bash.cmd
文件,您基本上成功地解决了第一个问题。但是如果您想知道为什么没有它它就不能工作,我猜bash
会在您的命令提示符下运行,因为包含它的目录(例如,在您的示例中“C:\Program Files\Git\usr\bin”)包含在用户帐户的PATH环境变量中。但是,您可能正在系统帐户中运行gitlab runner,该帐户可能没有相同的路径。
因此,首先要做的是检查系统的PATH变量,并在必要时添加bin目录(即使用控制面板中的系统小程序,如所述或所述)。只需确保在进行更改后重新启动计算机,因为只有在重新启动后才会应用更改。这将使bash
工作,即使从系统或管理员帐户中运行的服务调用
至于创建bash.cmd后出现的奇怪错误,那是由于第二个问题。当组合bash和Windows时,路径通常很难正确获得。Gitlab runner可能正在尝试确定构建路径是相对路径还是绝对路径,最后在windows路径前面加上它认为是工作目录的内容($PWD
)。这看起来像一个bug,但gitlab仍然没有修复它(从runner的9.0版开始!!),而且可能永远也不会。也许他们认为这不是一个bug,或者是由于底层软件或工具中的bug,他们无法修复,或者修复起来太困难。不管怎么说,我发现了一个解决办法。您可以在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/"
感谢您的详细解释,我认为已经使用了Bash样式的路径,但没有更新问题/添加我自己的答案。尽管如此,它也会对其他人有所帮助!我无法从我这里得到这个。但是,当我从一个
gitbash
终端运行gitlab runner.exe
时,它就可以工作了。如果您更新Git for Windows,很有可能它会从系统的$PATH中删除对bash的引用,您需要返回并重新添加它。“鉴于在.gitlab-ci.yml本身中执行比非常琐碎的shell脚本更多的脚本是一种不好的做法”定义“琐碎”,为什么它会是一种不好的做法?我会说“琐碎”大概是5行。除此之外,我还想从.gitlab ci.yml
调用的脚本中提取与“逻辑”非常接近的内容,而不是将松散的脚本留在该文件中。也许这只是一个审美偏好,但我个人会考虑一个<代码> .GITLAC.YML<代码>文件,包含80行BASH或PultS壳,是一个反模式。您可以通过cygwin、MSYS2或WSL在Windows上获得bash。对我来说,在Windows上使用它的全部意义在于,当需要在不同平台上构建时,尽量保留通用的gitlab ci代码。您可以在Linux、Windows和macOS上编写一些基本的样板文件bash,并调用一些外部python脚本来完成更大的工作。仅仅因为bash是Gitlab runner支持的shell,并不意味着在Windows上创建bash runner会将您的亚军与WSL联系起来。*主要基于我自己的经验,Gitlab不支持在开箱即用的windows上创建bash运行程序。@MattAlioto-OP没有尝试使用WSL。他们正在使用“Git for Windows”中的bash(他们提到C:\Program Files\Git\usr\bin\bash.exe
)