创建部署问题时,请参考下面模板,你提供的信息越多,越容易及时获得解答。如果未按模板创建问题,管理员有权关闭问题。
确保帖子格式清晰易读,用 markdown code block 语法格式化代码块。
你只花一分钟创建的问题,不能指望别人花上半个小时给你解答。

环境信息

操作系统信息
虚拟机,相关信息如下

Kubernetes版本信息

容器运行时
docker version

crictl version

nerdctl version

KubeSphere版本信息

Jenkins版本

问题描述

通过http://IP地址:31080登录Jenkins后,创建一个简单的test-curl流水线,流水线内容如下

执行后报错提示找不到curl命令,执行结果报错如下:

在宿主机中执行curl -V结果如下

在宿主机中执行echo $PATH结果如下

在Jenkins的shell脚本中执行echo $PATH结果如下

然后在Jenkins中通过系统管理->系统配置->全局属性来添加宿主机中的PATH环境变量值

重新执行流水线,报错信息如下,提示没有权限

在自己的另一套较旧的环境中,Jenkins的版本较低,采用同样的流水线可以执行成功

补充信息

Jenkins2.319.1中通过cd和ls发现对应的bin目录下均没有curl和wget指令

需要协助问题

需要各位大佬协助看下为啥在Jenkins2.319.1版本中无法通过shell脚本执行执行curl命令

补充

通过kubectl exec命令进入到devops-jenkins pod里面执行curl也能正常生效

qczrzl 我如通过切换agent在容器中执行确实可以,但不是我想要的,我就想实现在agent为none时,直接在shell中执行curl,或者找出原因也行

qczrzl 通过下面这种agent确实可以

pipeline {
  agent {
    kubernetes {
      //cloud 'kubernetes'
      label 'mypod'
      yaml """
apiVersion: v1
kind: Pod
spec:
  containers:
  - name: maven
    image: maven:3.3.9-jdk-8-alpine
    command: ['cat']
    tty: true
"""
    }
  }

  stages {
    stage('Run maven') {
      steps {
        container('maven') {
          sh 'mvn -version'
        }
      }
    }
  }
}

但我想实现的是类似下面这种效果

pipeline {
  agent any
  stages {
    stage('Run maven') {
      steps {
          sh 'curl -V'
      }
    }
  }
}

jenkins 运行流水线时,会启动一个 pod ,来执行定义的 shell 脚本。

这个 pod 里有 2 个 container,一个 是 jnlp, 主要是与 jenkins server 交互,这个 container 里没有装什么工具。
还有一个 container,是自定义的 image,这个可以选择 go/java/python/maven 或者自己定义均可,这个 image 安装了必要的一些 工具, 如果没有的,用户也可以自己装。

如果 jenkinsfile 里,没有定义 container(‘xxx’) {, 默认是在 jnlp 这个 container 里运行,如上所说,jnlp 容器里主要是与 jenkins server 交互,里面没有安装什么命令。如果一般都需要 定义 container(‘xxx’) {, 指定自定义的 container 来运行 相应的命令。

pipeline {
  agent any
  stages {
    stage('Run maven') {
      steps {
        container('base') {
           sh 'curl -V'
        }
      }
    }
  }
}

https://github.com/kubesphere/devops-agent/blob/master/base/Dockerfile#L13
在构建基础 image 的时候会装上 curl 命令。