Kubernetes 中的自定义 Jenkins 从属服务器没有安装应用程序

Kubernetes 中的自定义 Jenkins 从属服务器没有安装应用程序

我在内部项目中设置了 Jenkinsfile,该项目使用自定义jenkins/slave构建,我在其中添加了 nvm 和 Node 12 来执行构建。自定义映像位于我在 Kubernetes 集群中运行的内部 Harbor 实例中。一切似乎都启动正常,直到它开始执行管道步骤。我作为自定义安装的一部分安装的所有文件夹/文件/应用程序jenkins/slave都丢失了。

我的 Dockerfilejenkins/slave如下所示:

FROM jenkins/slave

MAINTAINER xxx

USER root

RUN apt-get update && apt-get install -y build-essential libssl-dev curl apt-transport-https ca-certificates software-properties-common

RUN curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
RUN add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
RUN apt update && apt install docker-ce-cli

RUN curl -sL https://deb.nodesource.com/setup_12.x | bash -
RUN apt-get install -y nodejs

RUN mkdir /version_1.2.0

USER jenkins
RUN which node
RUN which npm
RUN node --version
RUN npm --version
RUN echo $PATH

我的 Jenkinsfile 是:

pipeline {
  agent {
    kubernetes {
      label 'jenkins-slave-build'
      yaml """
kind: Pod
metadata:
  name: jenkins-slave-build
spec:
  containers:
  - name: jenkins-slave
    image: harbor.mydomain.com/library/custom/jenkinsslave:latest
    imagePullPolicy: Always
    tty: true
  restartPolicy: Never
"""
    }
  }
  stages {
    stage('Test') {
      steps {
        echo 'Testing..'
        sh 'ls -lart /'
        sh 'npm --version'
        sh 'node --version'
      }
    }
    ...
  }
}

当我运行管道时,我可以看到它从 Harbor 中提取图像,它在构建的控制台输出中打印出看起来像是 pod 的正确 YAML,并且如果我执行 ,我可以看到 pod 在 Kubernetes 中旋转起来。在我的 Jenkinsfile 中,我尝试在 root 处kubectl get pods --watch执行,它应该包含一个文件夹,但该文件夹丢失。我也尝试执行和,但这些都失败了,说应用程序未安装。我目前的想法是管道在 Jenkins 主服务器上运行,而不是从属 pod 上。我也尝试过只使用docker 镜像,但结果完全相同。lsversion_1.2npm --versionnode --versionnode:12.16.1

答案1

对于那些将来关注这个问题的人来说...似乎 Jenkins 从属服务器在运行时会挂载它们的卷??? 至少,我发现的几篇帖子似乎就是这么建议的。这解释了为什么我安装的工具不在那里,以及为什么我的根文件夹中缺少我在那里创建的测试“version_1.2”文件夹。

为了修复 NPM 问题,我只需安装 NodeJS 插件(描述中写着“NodeJS 插件将 NodeJS 脚本作为构建步骤执行。”),在 Global Tools 中配置 NodeJS 安装,然后添加:

tools { nodejs: "whatever_you_called_it_in_global_tools" }

这将导致您配置的 NodeJS 版本在运行之前安装在从属服务器上。我仍然缺少 make 和 docker,所以我的 CI/CD 仍然不是 100%,但我确信这两个问题是相似的,我只需要找出哪些插件添加了 make 和 docker cli 并安装它们。

编辑 经过进一步的研究,我找到了一个比强制安装工具更好的解决方案。看来,将step中的 s括起来container('label') { ... },其中“label”是你为代理提供的标签,就可以让它工作。

然而,我仍然无法让 Docker 标记并将图像推送到我的内部 Harbor 服务器,但这是另一个问题。

相关内容