เพียงเพิ่มdocker
เป็นกลุ่มเสริมสำหรับjenkins
ผู้ใช้
sudo usermod -a -G docker jenkins
ไม่เคยพอเมื่อใช้ภาพหางเป็นตัวแทนเจนกินส์ นั่นคือถ้าคุณJenkinsfile
เริ่มต้นด้วยpipeline{agent{dockerfile
หรือpipeline{agent{image
:
pipeline {
agent {
dockerfile {
filename 'Dockerfile.jenkinsAgent'
}
}
stages {
นี่เป็นเพราะเจนกินส์ทำdocker run
คำสั่งซึ่งทำให้เกิดปัญหาสามประการ
- ตัวแทนจะ (อาจ) ไม่มีการติดตั้งโปรแกรมนักเทียบท่า
- ตัวแทนจะไม่ได้มีการเข้าถึงซ็อกเก็ตภูตหางและเพื่อจะพยายามที่จะเรียกนักเทียบท่าในหางซึ่งจะไม่แนะนำให้ใช้
- เจนกินส์ให้ ID ผู้ใช้ที่เป็นตัวเลขและ ID กลุ่มตัวเลขที่ Agent ควรใช้ ตัวแทนจะไม่มีกลุ่มเสริมใด ๆ เพราะ
docker run
ไม่ได้ทำการเข้าสู่ระบบคอนเทนเนอร์ (มันเป็นเหมือนsudo
)
การติดตั้ง Docker สำหรับ Agent
การทำให้โปรแกรม Docker พร้อมใช้งานภายในอิมเมจ Docker นั้นเพียงแค่ต้องการใช้ขั้นตอนการติดตั้ง Dockerใน Dockerfile ของคุณ:
# Dockerfile.jenkinsAgent
FROM debian:stretch-backports
# Install Docker in the image, which adds a docker group
RUN apt-get -y update && \
apt-get -y install \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release \
software-properties-common
RUN curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
RUN add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/debian \
$(lsb_release -cs) \
stable"
RUN apt-get -y update && \
apt-get -y install \
docker-ce \
docker-ce-cli \
containerd.io
...
การแชร์ซ็อกเก็ต Docker daemon
ดังที่ได้กล่าวไว้ก่อนหน้าการแก้ไขปัญหาที่สองหมายถึงการเรียกใช้คอนเทนเนอร์ Jenkins Docker ดังนั้นจึงแบ่งปันซ็อกเก็ต Docker daemon กับ Docker daemon ที่อยู่นอกคอนเทนเนอร์ ดังนั้นคุณต้องบอกให้ Jenkins เรียกใช้ Docker container ด้วยการแชร์ดังนี้:
pipeline {
agent {
dockerfile {
filename 'Dockerfile.jenkinsAgent'
args '-v /var/run/docker.sock:/var/run/docker.sock'
}
}
การตั้งค่า UID และ GID
การแก้ไขในอุดมคติสำหรับปัญหาที่สามจะถูกตั้งค่ากลุ่มเสริมสำหรับตัวแทน ดูเหมือนจะเป็นไปไม่ได้ การแก้ไขเดียวที่ฉันรู้คือเรียกใช้ Agent กับ Jenkins UID และ Docker GID (ซ็อกเก็ตมีสิทธิ์ในการเขียนกลุ่มและเป็นเจ้าของโดยroot.docker
) แต่โดยทั่วไปแล้วคุณไม่ทราบว่า ID เหล่านั้นคืออะไร (พวกเขาถูกจัดสรรเมื่อuseradd ... jenkins
และและgroupadd ... docker
เมื่อมีการติดตั้ง Jenkins และ Docker บนโฮสต์) และคุณไม่สามารถเพียงแค่บอกเจนกินส์กับผู้ใช้jenkins
และกลุ่มdocker
args '-v /var/run/docker.sock:/var/run/docker.sock -u jenkins:docker'
เพราะนั่นบอกให้นักเทียบท่าใช้ผู้ใช้และกลุ่มที่มีชื่อjenkins
และdocker
อยู่ในรูปภาพและอิมเมจ Docker ของคุณอาจไม่มีjenkins
ผู้ใช้และกลุ่มและแม้ว่ามันจะไม่มีการรับประกันก็จะมี UID และ GID เดียวกัน โฮสต์และไม่มีการรับประกันว่าdocker
GID จะเหมือนกัน
โชคดีที่เจนกินส์รันdocker build
คำสั่งสำหรับ Dockerfile ของคุณในสคริปต์เพื่อให้คุณสามารถใช้เวทย์มนตร์เชลล์สคริปต์เพื่อส่งผ่านข้อมูลนั้นในฐานะนักเทียบท่าสร้างอาร์กิวเมนต์:
pipeline {
agent {
dockerfile {
filename 'Dockerfile.jenkinsAgent'
additionalBuildArgs '--build-arg JENKINSUID=`id -u jenkins` --build-arg JENKINSGID=`id -g jenkins` --build-arg DOCKERGID=`stat -c %g /var/run/docker.sock`'
args '-v /var/run/docker.sock:/var/run/docker.sock -u jenkins:docker'
}
}
ที่ใช้id
คำสั่งเพื่อรับUIDและGIDของjenkins
ผู้ใช้และstat
คำสั่งเพื่อรับข้อมูลเกี่ยวกับซ็อกเก็ต Docker
Dockerfile ของคุณสามารถใช้ข้อมูลที่จะตั้งค่าjenkins
ของผู้ใช้และdocker
กลุ่มตัวแทนที่ใช้groupadd
, groupmod
และuseradd
:
# Dockerfile.jenkinsAgent
FROM debian:stretch-backports
ARG JENKINSUID
ARG JENKINSGID
ARG DOCKERGID
...
# Install Docker in the image, which adds a docker group
RUN apt-get -y update && \
apt-get -y install \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release \
software-properties-common
RUN curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
RUN add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/debian \
$(lsb_release -cs) \
stable"
RUN apt-get -y update && \
apt-get -y install \
docker-ce \
docker-ce-cli \
containerd.io
...
# Setup users and groups
RUN groupadd -g ${JENKINSGID} jenkins
RUN groupmod -g ${DOCKERGID} docker
RUN useradd -c "Jenkins user" -g ${JENKINSGID} -G ${DOCKERGID} -M -N -u ${JENKINSUID} jenkins