Tôi đang cố gắng để có được một đường ống jenkins mới cùng nhau để kiểm tra các yêu cầu kéo mới tới mã của chúng tôi. Tôi đang sử dụng docker với ubuntu:14.04
hình ảnh để mô phỏng môi trường sản xuất của chúng tôi.
Dưới đây là một ví dụ làm việc tối thiểu:
#jenkinsfile
stage('Checkout and provision'){
docker.image('ubuntu:14.04').withRun('-u root'){
checkout scm
sh 'chmod -R 770 ./'
sh './init-script.sh'
}
}
và
#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
Và /etc/sudoers
tập tin cho container như sau:
#
# 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
Vấn đề tôi gặp phải là docker không chạy bằng root như tôi đã sử dụng và thay vào đó giữ lại id người dùng của người dùng jenkins từ máy chủ. Điều này làm cho nó khó khăn để sudo.
Tôi đã thử thêm người dùng jenkins vào /etc/passwd
tệp container và chạy chmod
với tệp đó nhưng thậm chí không có quyền để thực hiện một trong hai điều này từ jenkinsfile
.
Với cấu hình này, tôi sẽ là người dùng root. Tuy nhiên, tôi sẽ xem Error: must run as root
nếu tôi không sử dụng sudo
hoặc sudo: no tty present and no askpass program specified
nếu tôi làm.
Có một cách chính xác để đối phó với tình huống này? Lý tưởng từ jenkinsfile
; Tôi muốn tránh tạo thêm Dockerfile
nếu có thể vì đây sẽ là một điểm khác biệt hơn nữa giữa thử nghiệm và sản xuất.