設計流水線的目的是更方便地使用?Docker鏡像作為單個?Stage或整個流水線的執行環境。
1.安裝必要插件?
在Jenkins服務器上已經安裝了插件。
- Docker Pipeline
- Pipeline Maven Integration
- Pipeline Maven Plugin API
如果插件缺少什么,再次檢查并安裝即可。
2. 配置Docker連接
- 進入Jenkins管理界面,選擇“Manage Jenkins” -> “Configure System”。
- 找到“Cloud”部分,點擊“Add a new cloud”,選擇“Docker”。
- 配置Docker主機的URL(例如:unix:///var/run/docker.sock)。
- 測試連接是否成功。可以配置多個Docker連接,例如用于開發、測試和生產環境。
如果遇到:
unix:///var/run/docker.sock,java.net.BindException: Permission denied
通常意味著當前用戶沒有足夠的權限訪問 Docker 守護進程。
原因分析:
Docker 守護進程默認綁定到 Unix 套接字?/var/run/docker.sock
?而非 TCP 端口,該 Unix 套接字歸?root
?用戶擁有,因此 Docker 守護程序默認只能以?root
?用戶的身份運行。
#創建docker 組
sudo groupadd docker#將用戶添加到 docker 組
sudo usermod -aG docker jenkins#重啟 Docker 服務
sudo systemctl restart docker#重新登錄
newgrp docker#查看組下的用戶
grep "^docker:" /etc/group | cut -d: -f4#查看用戶
grep "^jenkins:" /etc/passwd#檢查并調整 /var/run/docker.sock 的權限
sudo chown root:docker /var/run/docker.sock
sudo chmod 660 /var/run/docker.sock#檢查 Docker 服務狀態
sudo systemctl status docker
3.配置 Jenkins 憑證(可選)
在使用 Docker 插件之前,我們需要配置 Jenkins 憑證,以便 Jenkins 可以連接到 Docker 主機。以下是配置憑證的步驟:
- 打開 Jenkins 控制臺。
- 導航到“Manage Jenkins” > “Manage Credentials”。
- 在“Stores scoped to Jenkins”下,選擇“Jenkins”。
- 在“System”下,選擇“Global credentials (unrestricted)”。
- 單擊“Add Credentials”創建新的憑證。
- 選擇“Username with password”作為憑證類型。
- 輸入 Docker 主機的用戶名和密碼。
- 提供憑證的 ID 和描述信息,然后保存。
4.創建Docker 鏡像
使用DockerFile創建一個的鏡像docker_in_docker_jdk23_mvn_git
# 使用官方的ubuntu鏡像作為基礎鏡像
FROM ubuntuUSER rootrun pwdrun apt-get -o Acquire::Check-Valid-Until=false update# 安裝docker
# 這里容易出錯443,所以需要多執行幾次docker build
RUN apt-get install -y ca-certificates curl gnupg lsb-release
RUN curl -fsSL "https://download.docker.com/linux/ubuntu/gpg" | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
RUN echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
RUN apt-get -o Acquire::Check-Valid-Until=false update
RUN apt-get install -y --allow-unauthenticated docker-ce docker-ce-cli containerd.io# 安裝jdk
run mkdir /usr/lib/jvm/
add openjdk-23.0.2_linux-x64_bin.tar.gz /usr/lib/jvm/
WORKDIR /usr/lib/jvm/
run mv jdk-23.0.2 openjdk-23-jdk
env JAVA_HOME=/usr/lib/jvm/openjdk-23-jdk
env PATH=$JAVA_HOME/bin:$PATH# 安裝Maven
run mkdir /etc/maven
add apache-maven-3.9.10.tar.gz /etc/maven
env MAVEN_HOME=/etc/maven/apache-maven-3.9.10
env PATH=$MAVEN_HOME/bin:$PATH# 安裝git
run apt-get install -y git# 安裝vim編輯器
run apt-get install vim -y --allow-unauthenticated
run echo 'set nu' > ~/.vimrc# 拷貝時區文件,如果沒有就先注釋,設置時區
add zoneinfo.tar /usr/share/
run ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
run echo 'Asia/Shanghai' >/etc/timezone# 安裝網絡工具
run apt-get install -y net-tools inetutils-ping curl
# run apt-get install -y wget # 設置語言
env LANG=C.UTF-8run mkdir -p /app/application
workdir /app/applicationRUN groupadd -r jenkins && \useradd -r -g jenkins -m jenkins && \chown -R jenkins:jenkins /app && \chmod -R 755 /app# 暴露Docker的socket給外部容器使用
VOLUME /var/run/docker.sockENTRYPOINT ["tail","-f","/dev/null"]# docker run -d --name docker_in_docker_jdk_mvn_git -v /var/run/docker.sock:/var/run/docker.sock docker_in_docker_jdk_mvn_git
5.創建Pipeline和SCM腳本
pipeline {agent {docker {image 'docker_in_docker_jdk23_mvn_git:latest'args "-v /var/run/docker.sock:/var/run/docker.sock --entrypoint='' -u root:root"}}stages {stage('init') {steps {echo "check info"sh 'java -version'sh 'mvn -v'sh 'git --version'sh 'docker info'sh 'whoami'sh 'pwd'}}stage('git clone') {steps {echo "git clone"dir("appcode"){sh 'pwd'sh 'ls -l' git(url: 'https://gitee.com/xinlicn/springcloud-maven.git',branch: 'master',credentialsId: 'mygittree')script{env.CODE_PATH = "appcode/producter-service/producter"}}}}stage('maven build') {steps {echo "maven building"script{dir("${CODE_PATH}"){sh 'ls -l'sh " mvn -f pom.xml clean package"def pomfile = "${env.project_name}/pom.xml"def pom = readMavenPom file: "${pomfile}"env.POM_PROJECT_NAME = "${pom.artifactId}"env.POM_PROJECT_VERSION = "${pom.version}"echo "output:${POM_PROJECT_NAME}:${POM_PROJECT_VERSION}"}}}}stage('docker build') {steps {echo "docker build"script{dir("${CODE_PATH}"){def docker_name ="${POM_PROJECT_NAME}:${POM_PROJECT_VERSION}"sh "docker build -f dockerfile ./${env.project_name}/target --build-arg appname=${POM_PROJECT_NAME}.jar -t ${docker_name}"}}}}}
}
6.運行Pipeline
通過pipeline的log可以看出,所有的構建過程都是在docker容器中進行的。
參考:
在流水線中使用Docker