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"]

文件目录如下:
image
其中的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配置如下:

image

jdk配置如下:

这里配置了2个jdk
image

git配置

image
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}"
  }
}
posted @ 2025-04-19 13:19  Hekk丶  阅读(135)  评论(0)    收藏  举报