ฉันพยายามดึงเจนกินส์ไปป์ไลน์ใหม่ด้วยกันเพื่อทดสอบคำขอดึงใหม่ไปยังโค้ดของเรา ฉันใช้นักเทียบท่าพร้อมกับ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
ปัญหาที่ฉันมีคือนักเทียบท่านั้นไม่ได้ทำงานเหมือนรูทอย่างที่ฉันคุ้นเคยและเก็บรหัสผู้ใช้ของผู้ใช้เจนกินส์จากเครื่องโฮสต์แทน นี่ทำให้มันยากที่จะ sudo
ฉันได้พยายามเพิ่มผู้ใช้เจนกินส์กับภาชนะบรรจุ/etc/passwd
ไฟล์และทำงานchmod
กับไฟล์นั้น jenkinsfile
แต่ไม่ได้มีสิทธิ์ที่จะทำอย่างใดอย่างหนึ่งเหล่านี้จาก
ด้วยการกำหนดค่านี้ฉันควรเป็นผู้ใช้รูท อย่างไรก็ตามฉันเห็นError: must run as root
ว่าฉันไม่ได้ใช้sudo
หรือ sudo: no tty present and no askpass program specified
ถ้าฉันทำ
มีวิธีที่ถูกต้องในการจัดการกับสถานการณ์นี้หรือไม่? เป็นการดีจากjenkinsfile
; ฉันต้องการหลีกเลี่ยงการสร้างเพิ่มเติมDockerfile
หากเป็นไปได้เพราะจะเป็นความแตกต่างเพิ่มเติมระหว่างการทดสอบและการผลิต