在 Jenkins Kubernetes 插件中,pod 在完成所有操作之前就被终止了

问题描述 投票:0回答:1

我已经使用 helm 在 k8s 上安装了 jenkins,并希望使用代理运行所需的映像。 但是,我有一个问题,当我运行代理时,它立即挂起。

我的代理映像 Dockerfile

FROM golang:1.21.1-alpine3.18 AS builder
RUN apk update
RUN apk upgrade
RUN apk add build-base

WORKDIR /app
COPY go_src .
RUN go mod download

WORKDIR /app/cmd/runner/
RUN CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build -o /bin/runner.

ENTRYPOINT ["/bin/runner"]

我的 pod 模板和管道

pipeline {
    agent none
    stages {
        stage('Step 1') {
            agent {
                kubernetes {
                    yaml """
                    apiVersion: v1
                    kind: Pod
                    spec:
                      containers:
                      - name: runner
                        image: my_image:latest
                        volumeMounts:
                        - name: cache
                          mountPath: /cache
                      volumes:
                        - name: cache
                          persistentVolumeClaim:
                            claimName: cache-pvc
                      imagePullSecrets:
                      - name: regcred
                    """
                }
            }
            steps {
                container('runner') {
                    sh 'echo "This is runner."'
                }
            }
        }
    }
}

我不想在步骤部分做任何事情。 这似乎不可能,所以我只是做了一个回声或其他什么。 请注意,如果我在这里添加 sleep,它将执行与 sleep 一样的操作,然后退出。 但我不想指定时间,我只是希望代理在图像中的 go 完成所有工作时退出。

也许我误解了 jenkins kubernetes 插件? 这是正确的使用方法吗? 如果这是正确的,为什么我这样做会终止? 我想知道如何让它不终止。 预先感谢。

我还尝试在脚本中添加 sleep,并设置命令:cat 和 tty:true。 谷歌搜索了一下,我的问题没有任何地方提到。

jenkins jenkins-pipeline jenkins-plugins jenkins-kubernetes
1个回答
0
投票

Jenkins k8s 插件负责启动和停止容器。容器不应具有影响其生命周期的入口点或命令参数。最常见的是,这些被 替换为 sleep 99d

。所有逻辑(例如在您的情况下执行 
/bin/runner
)都应该在管道中。

© www.soinside.com 2019 - 2024. All rights reserved.