bash之如何在本地运行 go 二进制文件作为 Jenkins 管道的最后阶段

jirigala 阅读:34 2025-06-02 22:19:02 评论:0

我有一个 simple gin gonic microservice Golang project我用来学习如何制作 Jenkins 管道。每个阶段都成功运行,但在管道完成后二进制文件没有运行。还可以通过使用 curl 命中端点来判断进程没有运行:

curl http://localhost:9191/users



这是有问题的管道:
pipeline { 
   agent any 
 
   stages { 
      stage('git') { 
         steps { 
            echo "git" 
            git 'https://github.com/eduFDiaz/golang-microservices.git' 
         } 
      } 
      stage('clean') { 
         steps { 
            echo "clean" 
            sh "make clean" 
         } 
      } 
      stage('test') { 
         steps { 
            echo "test" 
            sh "make test" 
         } 
      } 
      stage('build') { 
         steps { 
            echo "build" 
            sh "make build" 
         } 
      } 
      stage('run') { 
         steps { 
            echo "run" 
            sh "make run" 
         } 
      } 
   } 
} 

生成文件:
executableName=testApi 
clean: 
    echo "stoping if running and cleaning" 
    rm -rf ./bin 
    killall $(executableName) || true 
test: 
    echo "Testing..." 
    go test -coverprofile cp.out ./mvc/... 
    go tool cover -html=cp.out 
build: 
    echo "Building..." 
    go build -o bin/$(executableName) mvc/main.go 
run: 
    echo "Running..." 
    ./bin/$(executableName) & 
all: test build run 

当我手动完成时,一切都运行良好。我在这里想念什么?

控制台输出:
Started by user Eduardo fernandez 
Running in Durability level: MAX_SURVIVABILITY 
[Pipeline] Start of Pipeline 
[Pipeline] node 
Running on Jenkins in /root/.jenkins/workspace/golang pipeline test 
[Pipeline] { 
[Pipeline] stage 
[Pipeline] { (git) 
[Pipeline] echo 
git 
[Pipeline] git 
No credentials specified 
 > git rev-parse --is-inside-work-tree # timeout=10 
Fetching changes from the remote Git repository 
 > git config remote.origin.url https://github.com/eduFDiaz/golang-microservices.git # timeout=10 
Fetching upstream changes from https://github.com/eduFDiaz/golang-microservices.git 
 > git --version # timeout=10 
 > git fetch --tags --force --progress -- https://github.com/eduFDiaz/golang-microservices.git +refs/heads/*:refs/remotes/origin/* # timeout=10 
 > git rev-parse refs/remotes/origin/master^{commit} # timeout=10 
 > git rev-parse refs/remotes/origin/origin/master^{commit} # timeout=10 
Checking out Revision bfa434ff2aca9ea748182aa2b29094e1b9f442c6 (refs/remotes/origin/master) 
 > git config core.sparsecheckout # timeout=10 
 > git checkout -f bfa434ff2aca9ea748182aa2b29094e1b9f442c6 # timeout=10 
 > git branch -a -v --no-abbrev # timeout=10 
 > git branch -D master # timeout=10 
 > git checkout -b master bfa434ff2aca9ea748182aa2b29094e1b9f442c6 # timeout=10 
Commit message: "run reverted to previous state in Makefile" 
 > git rev-list --no-walk bfa434ff2aca9ea748182aa2b29094e1b9f442c6 # timeout=10 
[Pipeline] } 
[Pipeline] // stage 
[Pipeline] stage 
[Pipeline] { (clean) 
[Pipeline] echo 
clean 
[Pipeline] sh 
+ make clean 
echo "stoping if running and cleaning" 
stoping if running and cleaning 
rm -rf ./bin 
killall testApi || true 
testApi: no process found 
[Pipeline] } 
[Pipeline] // stage 
[Pipeline] stage 
[Pipeline] { (test) 
[Pipeline] echo 
test 
[Pipeline] sh 
+ make test 
echo "Testing..." 
Testing... 
go test -coverprofile cp.out ./mvc/... 
?       github.com/golang-microservices/mvc [no test files] 
?       github.com/golang-microservices/mvc/app [no test files] 
?       github.com/golang-microservices/mvc/controllers [no test files] 
ok      github.com/golang-microservices/mvc/domain  0.004s  coverage: 0.0% of statements 
ok      github.com/golang-microservices/mvc/services    0.003s  coverage: 0.0% of statements [no tests to run] 
?       github.com/golang-microservices/mvc/utils   [no test files] 
go tool cover -html=cp.out 
HTML output written to /tmp/cover914928629/coverage.html 
[Pipeline] } 
[Pipeline] // stage 
[Pipeline] stage 
[Pipeline] { (build) 
[Pipeline] echo 
build 
[Pipeline] sh 
+ make build 
echo "Building..." 
Building... 
go build -o bin/testApi mvc/main.go 
[Pipeline] } 
[Pipeline] // stage 
[Pipeline] stage 
[Pipeline] { (run) 
[Pipeline] echo 
run 
[Pipeline] sh (hide) 
+ make run 
echo "Running..." 
Running... 
./bin/testApi & 
[Pipeline] } 
[Pipeline] // stage 
[Pipeline] } 
[Pipeline] // node 
[Pipeline] End of Pipeline 
Finished: SUCCESS 

请您参考如下方法:

出现此问题是因为 Jenkins 正在清理构建期间启动的所有子进程。即 make run 正在启动应用程序,但 Jenkins 正在杀死该进程作为清理的一部分(有关更多详细信息,请搜索“ProcessTreeKiller”)。

要解决更新您的行如下

stage('run') { 
steps { 
echo "run" 
sh "export JENKINS_NODE_COOKIE=dontKillMe; make run " 
} 


标签:Jenkins
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号