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
2条答案
按热度按时间sqxo8psd1#
由于您使用了
image: golang:latest
,因此go
应位于$PATH中您需要检查它在哪个阶段失败:
run_tests
或build_binary
。在脚本步骤中添加
echo $PATH
,以检查$PATH是什么。还要检查错误是否来自
git
,Go语言用来访问模块的远程仓库,例如this answer。根据您的基本知识,默认的GitLab运行程序使用shell executor(它对Go语言一无所知)
相反,第二个使用Docker executor,基于Go图像。
因此,注册(Docker)runner是确保预期执行者的正确方法。
9lowa7mx2#
失败的作业使用的是runner with
shell
executor,可能是在配置GitLab示例时设置的。这可以在日志中看到:shell
执行器将忽略您的作业的image:
配置。它将直接在托管runner的计算机上运行作业脚本,并将尝试在此计算机上查找go
二进制文件(在您的情况下失败)。这有点像在未安装go
的情况下在某些Ubuntu上运行go
命令。您成功的作业是使用runner with
docker
executor,按照您的请求在golang:latest
映像中运行作业脚本。这类似于运行docker run golang:latest sh -c '[your script]'
。这可以在作业日志中看到:型
您可以做什么:
1.确保使用
docker
执行器配置runner。config.toml
将如下所示:看起来你已经注册了自己的跑步者。
1.配置您的作业以将此runner与作业
tags
一起使用。您可以在Docker runner上设置标记docker_executor
(注册时或通过Gitlab UI),并设置如下内容:有关详细信息,请参见流道注册和Docker executor。