我正在尝试建立一个新的jenkins管道,以测试对我们代码的新请求请求。我正在使用带有ubuntu:14.04图像的docker来模拟我们的生产环境。

这是一个最小的工作示例:

#jenkinsfile
stage('Checkout and provision'){
docker.image('ubuntu:14.04').withRun('-u root'){
    checkout scm
    sh 'chmod -R 770 ./'
    sh './init-script.sh'
    }
}




 #init-script.sh
 sudo add-apt-repository ppa:ondrej/php
 sudo apt-get update -y
 sudo apt-get dist-upgrade -y
 sudo apt-get install \
    apache2 \
    php \
    php-mysql \
    php-xml \
    libapache2-mod-auth-mysql \
    libapache2-mod-php \
    php5-curl \
    zip \
    htop \
    supervisor \
    mailutils \
    git \
    build-essential -y
 sudo apt-get autoremove -y


容器的/etc/sudoers文件如下:

#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
Defaults:jenkins !requiretty

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL:ALL) ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

# See sudoers(5) for more information on "#include" directives:

#includedir /etc/sudoers.d

jenkins ALL=(ALL:ALL) NOPASSWD:ALL


我遇到的问题是该docker不是像我以前那样以root身份运行,而是从主机保留了jenkins用户的用户ID。这使得很难进行sudo。

我尝试将jenkins用户添加到容器/etc/passwd文件中,并对该文件运行chmod,但是甚至没有从jenkinsfile进行这两个操作的权限。

使用此配置,我应该是root用户。但是,如果我不使用Error: must run as root,我会看到sudo;如果我不使用sudo,我会看到no tty present and no askpass program specified

是否有正确的方法来处理这种情况?理想地来自jenkinsfile;如果可能,我想避免创建其他Dockerfile,因为这将进一步区分测试和生产。

评论

介意分享您的jenkinsfile和unit.sh吗?听起来主要是在这一点上猜测...

这是一个棘手的问题,试图让人们解决您的作业。真的有詹金斯论坛这类事情。确实应该以一种在Google搜索中可以找到类似问题的形式来提出您的问题,该问题对您本人以外的其他人很有用,对本网站来说是一个好问题。

我已经在谷歌上搜索了好几天,并且拖了Jenkins文档。我尚未找到解决方案。如果我找不到想要的答案的术语,请告诉我。我已经更新了问题,以使问题更清楚,但我不同意这是“棘手的”或“作业”。

我用一个最小的例子更新了这个问题

也许这会有所帮助:wiki.jenkins-ci.org/display/JENKINS/Docker+Plugin(我认为当您不是root用户时,-u root不起作用,它会更改用户名而不是userid)。您必须与允许sudo无密码的jenkins用户一起准备图像。

#1 楼

因此,在聊天中进行调试会话后,需要执行的操作是让运行jenkins的用户能够在Docker主机上无密码登录。

ubuntu上的典型sudoers文件可能位于sudo docker中。

jenkins_user ALL=(ALL) NOPASSWD:ALL


请注意,允许/etc/sudoers.d/jenkins以root身份运行而无需输入任何命令,更好的文件应该是:

jenkins_user ALL=(ALL) NOPASSWD:/full/path/to/docker
jenkins_user ALL=(ALL) NOPASSWD:<other needed command to be run as root>


这将允许以root用户身份启动容器,因此,它以uid 0运行的方式赋予了容器自身所有的权限。 />
已用掉的有用资源:


Jenkins docker插件自述文件
如何在Linux上设置无密码jenkins_user


#2 楼

以root身份运行Docker实际上是一个坏主意。您应该做的是将Jenkins用户添加到Docker组。 sudo usermod -aG docker jenkins。这将避免造成不必要的安全漏洞,并使Jenkins能够完成与Docker有关的所有工作,包括在容器内以root身份运行。我会定期使用自己的版本进行此操作,并以此为例:

stage ('Build Docker Image') {
  steps {
    script {
      // Build the Docker image for compiling
      dockerImage = docker.build("myapp:v1")
    }
  }
}
stage ('Run UnitTests') {
  steps {
    script {
      dockerImage.inside("-itu root") {
        sh(script: "nosetests app-test.py --verbose")
      }
    }
  }
}