Go语言 Gitlab CI/CD失败,并显示“bash:第132行:执行:未找到命令”

iqih9akk  于 2022-12-16  发布在  Go
关注(0)|答案(2)|浏览(234)

bounty将在2天后过期。回答此问题可获得+500声望奖励。Viren希望引起更多人关注此问题。

我们已经在我们的定制服务器上安装了Gitlab。我们希望使用gitlab CI/CD管道来构建和发布我们的软件。我正在为此进行POC。我已经使用以下.gitlab-ci.yml创建了一个项目

variables:
  GOOS: linux
  GOARCH: amd64

stages:
  - test
  - build
  - deb-build

run_tests:
  stage: test
  image: golang:latest
  before_script:
    - go mod tidy
  script:
    - go test ./...

build_binary:
  stage: build
  image: golang:latest
  artifacts:
    untracked: true
  script:
    - GOOS=$GOOS GOARCH=$GOARCH go build -o newer .

build deb:
  stage: deb-build
  image: ubuntu:latest
  before_script:
    - mkdir -p deb-build/usr/local/bin/
    - chmod -R 0755 deb-build/*
    - mkdir build
  script:
    - cp newer deb-build/usr/local/bin/
    - dpkg-deb --build deb-build release-1.1.1.deb
    - mv release-1.1.1.deb build
  artifacts:
    paths:
      - build/*

TLDR:我已经更新了gitlab-ci.yml和错误截图。
我所注意到的是,如果我使用共享的runner(gj 7z 2aym),如果你注册一个runner(即特定的Runner),错误是持久的

gitlab-runner register  --non-interactive  --url "https://gitlab.sboxdc.com/"   --registration-token "<register_token>" --description ""  --executor "docker" --docker-image "docker:latest"

我看到构建通过,没有任何问题
失败的病例。
https://gist.github.com/meetme2meat/0676c2ee8b78b3683c236d06247a8a4d
一个通过
https://gist.github.com/meetme2meat/058e2656595a428a28fcd91ba68874e8

sqxo8psd

sqxo8psd1#

由于您使用了image: golang:latest,因此go应位于$PATH中
您需要检查它在哪个阶段失败:run_testsbuild_binary
在脚本步骤中添加echo $PATH,以检查$PATH是什么。
还要检查错误是否来自git,Go语言用来访问模块的远程仓库,例如this answer
根据您的基本知识,默认的GitLab运行程序使用shell executor(它对Go语言一无所知)
相反,第二个使用Docker executor,基于Go图像。
因此,注册(Docker)runner是确保预期执行者的正确方法。

9lowa7mx

9lowa7mx2#

失败的作业使用的是runner with shell executor,可能是在配置GitLab示例时设置的。这可以在日志中看到:

Preparing the "shell" executor
Using Shell executor...

shell执行器将忽略您的作业的image:配置。它将直接在托管runner的计算机上运行作业脚本,并将尝试在此计算机上查找go二进制文件(在您的情况下失败)。这有点像在未安装go的情况下在某些Ubuntu上运行go命令。
您成功的作业是使用runner with docker executor,按照您的请求在golang:latest映像中运行作业脚本。这类似于运行docker run golang:latest sh -c '[your script]'。这可以在作业日志中看到:

Preparing the "docker" executor
Using Docker executor with image golang:latest ...
Pulling docker image golang:latest ...
Using docker image sha256:05e[...]
golang:latest with digest golang@sha256:04f[...]


您可以做什么:
1.确保使用docker执行器配置runner。config.toml将如下所示:

[[runners]]
  # ...
  executor = "docker"

  [runners.docker]
  # ...

看起来你已经注册了自己的跑步者。
1.配置您的作业以将此runner与作业tags一起使用。您可以在Docker runner上设置标记docker_executor(注册时或通过Gitlab UI),并设置如下内容:

build_binary:
  stage: build
  # Tags a runner must have to run this job
  tags:
  - docker_executor
  image: golang:latest
  artifacts:
    untracked: true
  script:
    - GOOS=$GOOS GOARCH=$GOARCH go build -o newer .

有关详细信息,请参见流道注册和Docker executor

相关问题