जेनकींस पाइपलाइन में डॉकर चलाते समय सही अनुमति सेटिंग्स क्या हैं?


11

मैं हमारे कोड में नए पुल अनुरोधों का परीक्षण करने के लिए एक नई जेनकींस पाइपलाइन प्राप्त करने की कोशिश कर रहा हूं। मैं ubuntu:14.04हमारे उत्पादन वातावरण का अनुकरण करने के लिए छवि के साथ डॉक का उपयोग कर रहा हूं ।

यहाँ एक न्यूनतम काम करने का उदाहरण है:

#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 रूट के रूप में नहीं चल रहा है जैसा कि मैं उपयोग कर रहा हूं और इसके बजाय होस्ट मशीन से जेनकिंस उपयोगकर्ता की उपयोगकर्ता आईडी को बनाए रखना है। इससे सूडो में दिक्कत होती है।

मैंने जेनकिंस उपयोगकर्ता को कंटेनर /etc/passwdफ़ाइल में जोड़ने और chmodउस फ़ाइल के खिलाफ चलने की कोशिश की है, लेकिन इनमें से दोनों में से किसी को भी करने की अनुमति नहीं है jenkinsfile

इस कॉन्फ़िगरेशन के साथ मैं रूट उपयोगकर्ता होना चाहिए। हालाँकि, मैं या तो देखता Error: must run as rootहूं कि मैं उपयोग नहीं करता sudoया सुडोल: no tty present and no askpass program specifiedयदि मैं करता हूं।

क्या इस स्थिति से निपटने का एक सही तरीका है? आदर्श रूप से jenkinsfile; मैं एक अतिरिक्त बनाने से बचना चाहूंगा Dockerfileक्योंकि यह परीक्षण और उत्पादन के बीच एक और अंतर होगा।


माइंड अपने जेनकिंसफाइल और यूनिट.श को साझा करना? इस बिंदु पर मुख्य रूप से लगता है ...
Tensibai

यह एक कठोर प्रश्न है, जो लोगों को आपके होमवर्क को हल करने की कोशिश कर रहा है। इस तरह की चीज़ों के लिए वास्तव में जेनकिंस फ़ोरम हैं। आपका प्रश्न वास्तव में एक ऐसे रूप में पूछा जाना चाहिए जो समान समस्या होने पर Google खोज में पाया जा सके और इस साइट के लिए एक अच्छा प्रश्न बनने के लिए अपने अलावा किसी और के लिए उपयोगी हो।
जिरी क्लौडा

मैं इसे कई दिनों से देख रहा हूँ और मैंने जेनकिंस डॉक्स को फँसा दिया है। मैं अभी तक एक समाधान खोजने के लिए कर रहा हूँ। अगर कोई शब्दावली है जो मुझे उन उत्तरों को खोजने के लिए याद आ रही है जिनकी मुझे आवश्यकता है तो कृपया मुझे बताएं। मैंने इसे स्पष्ट करने के लिए प्रश्न को अपडेट किया है कि मैं क्या पूछ रहा हूं, लेकिन मैं इस बात से सहमत नहीं हूं कि यह 'कठोर' या 'होमवर्क' है।
टोबैसिस्ट

मैंने एक न्यूनतम उदाहरण के साथ प्रश्न को अपडेट किया है
टोबैसिस्ट

1
शायद यह मदद का हो सकता है: wiki.jenkins-ci.org/display/JENKINS/Docker+Plugin (मुझे लगता है कि जब आप रूट नहीं करते हैं, तो यह काम नहीं करता है, यह उपयोगकर्ता नाम नहीं बल्कि उपयोगकर्ता नाम बदलता है)। आपको अपनी छवि जेन्किन्स उपयोगकर्ता के साथ पासवर्ड रहित करने की अनुमति के साथ तैयार करनी होगी।
तेनसीबाई

जवाबों:


12

इसलिए चैट में एक डिबग सत्र के बाद, जो आवश्यक है वह उपयोगकर्ता को रनिंग जेंकिंस को sudo dockerडॉकटर होस्ट पर पासवर्ड रहित करने की अनुमति देता है ।

Ubuntu पर एक विशिष्ट sudoers फ़ाइल हो सकती है /etc/sudoers.d/jenkins

jenkins_user ALL=(ALL) NOPASSWD:ALL

चेतावनी दी जाए jenkins_userकि बिना किसी कमांड के पासवर्ड के बिना रूट के रूप में चलने दें , एक बेहतर फाइल होनी चाहिए:

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

यह कंटेनर को रूट के रूप में शुरू करने की अनुमति देगा और जैसे कि यह यूआईडी 0 के रूप में चलाकर कंटेनर के भीतर सभी अधिकार देता है।

एक तरफ उपयोग किए गए उपयोगी संसाधन:


2

डॉकर को जड़ के रूप में चलाना वास्तव में एक बुरा विचार है। इसके बजाय आपको क्या करना चाहिए डॉकटर समूह में जेनकिंस उपयोगकर्ता को जोड़ना है। sudo usermod -aG docker jenkins। यह अनावश्यक सुरक्षा छिद्रों को खोलने से बचाएगा और जेनकींस को वह सब करने की अनुमति देगा, जिसमें इसे डॉकटर के साथ करना होगा, जिसमें कंटेनरों के अंदर जड़ के रूप में चलना शामिल है। मैं इसे अपने बिल्ड के साथ नियमित रूप से करता हूं, इसे नमूने के रूप में उपयोग करता हूं:

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")
      }
    }
  }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.