Jenkins实现自动化构建镜像并部署到kubernetes集群
简介
本文主要介绍如何在docker中部署Jenkins,并实现自动构建镜像以及在kubernetes集群中部署。
Jenkins部署
我是在docker中部署的Jenkins,使用的是一个自制的镜像,包含jdk、maven、docker、kubectl工具。
Dockerfile如下:
FROM openjdk:17
ENV wdir /opt/jenkins
ENV PREFIX /jenkins
WORKDIR $wdir
RUN mkdir $wdir/jenkins_home
COPY jenkins.war $wdir/jenkins.war
COPY jdk-8u311-linux-x64.tar.gz $wdir/jdk8.tar.gz
COPY apache-maven-3.9.5-bin.tar.gz $wdir/maven.tar.gz
COPY jdk-17.0.12_linux-x64_bin.tar.gz $wdir/jdk17.tar.gz
COPY docker /usr/bin/
COPY kubectl /usr/bin/
RUN tar -xzvf jdk8.tar.gz
RUN rm -r jdk8.tar.gz
RUN tar -xzvf jdk17.tar.gz
RUN rm -r jdk17.tar.gz
RUN tar -xzvf maven.tar.gz
RUN rm -r maven.tar.gz
RUN chmod 777 /usr/bin/docker
COPY settings.xml $wdir/apache-maven-3.9.5/conf/settings.xml
ENTRYPOINT ["java", "-DJENKINS_HOME=/opt/jenkins/jenkins_home", "-jar", "jenkins.war", "--prefix=/jenkins"]
文件目录如下:

其中的docker、maven、jdk可以替换为需要的版本。
docker-compose文件如下:
name: jenkins-compose
services:
jenkins:
image: <your image>
volumes:
- jenkins_home:/opt/jenkins/jenkins_home
- /var/run/docker.sock:/var/run/docker.sock
- maven_m2:/root/.m2
restart: "always"
ports:
- "0.0.0.0:9081:8080"
volumes:
jenkins_home:
external: true
maven_m2:
external: true
这里使用了2个volume,一个是jenkins home还有一个maven的仓库;
同时需要将服务器上的docker.sock映射到容器中,供docker使用。
工具以及插件配置
maven配置如下:

jdk配置如下:
这里配置了2个jdk

git配置

git选择的是一个JGit,需要搭配git-client插件使用
插件安装
需要安装的插件有git-client、pipline、kubectl、Kubernetes CLI
凭据创建
需要创建git凭据,以及kubectl的kube config文件
git凭据为userName with password类型
kube config文件类型为secret file类型
Jenkins file
pipeline {
agent any
parameters {
choice choices: ['java', 'nginx'], name: 'service'
booleanParam defaultValue: false, description: 'mvn是否执行clean', name: 'should_clean'
gitParameter branchFilter: 'origin/(.*)', defaultValue: 'master_new', name: 'BRANCH', type: 'PT_BRANCH'
}
tools {
maven 'maven3.9.5'
jdk 'jdk1.8'
}
stages {
stage('检出') {
steps {
git branch: "${BRANCH}", credentialsId: 'coding', url: 'https://XXXX/wlsq.git'
}
}
stage('编译') {
steps {
script {
print should_clean
echo "${should_clean}"
if (should_clean == true) {
sh 'mvn -DskipTests=true clean package -P docker'
} else {
sh 'mvn -DskipTests=true package -P docker'
}
}
}
}
stage('构建镜像') {
steps {
sh "docker build -t ${CODING_DOCKER_IMAGE_NAME} -f ./docker/java/Dockerfile ./docker/java"
}
}
stage('推送镜像') {
steps {
withCredentials([usernamePassword(credentialsId: 'coding', passwordVariable: 'pwd', usernameVariable: 'name')]) {
// some block
sh "docker login -u XXXX -p ${pwd} XXX"
}
sh "docker push ${CODING_DOCKER_IMAGE_NAME}"
sleep(1)
}
}
stage('Apply Kubernetes files') {
steps {
withKubeConfig([credentialsId: 'k3s-fro-wlsq']) {
sh "kubectl set image deployment/java-app java-app=XXXX:${version}"
}
}
}
}
environment {
CODING_DOCKER_REG_HOST = "${CCI_CURRENT_TEAM}-docker.pkg.${CCI_CURRENT_DOMAIN}"
CODING_DOCKER_IMAGE_NAME = "XXXX:${version}"
}
}

浙公网安备 33010602011771号