Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Bash的Windows GitLab CI运行程序_Windows_Bash_Gitlab Ci_Gitlab Ci Runner - Fatal编程技术网

使用Bash的Windows GitLab CI运行程序

使用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] 不幸的

我试图在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]
不幸的是,我找不到一个选项来指定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几乎不会有什么损失。

这里有两个问题,这两个问题都可能得到解决

  • gitlab runner找不到
    bash
  • gitlab runner不能很好地结合unix样式和Windows样式的路径 通过创建
    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