【实战】采用jenkins pipeline实现自动构建并部署至k8s

文章目录

前言

在前面的kubernetes系列博文中我们分享了从创建kubernetes集群到各种中间件的安装,以及从springboot项目的容器化部署到kubernetes外网映射,基本上包含了从0到1的K8S基础实战的整个过程。今天我们再分享一期采用jenkins pipeline实现自动构建并部署至k8s的实战演示,各位大大敬请鉴赏。

本文中采用jenkins pipeline执行整个jenkins的构建过程,在pipeline中使用docker执行maven构建。构建后通过dockerfile将jar包构建为docker镜像,并上传到阿里云仓库。然后执行deployment部署到k8s集群。

部署jenkins

这里采用docker的方式部署jenkins。

编写docker-compose-jenkins.yaml

root@master app# mkdir -p jenkins/jenkins_home

root@master app# mkdir -p jenkins/jenkins_config

root@master app# vim docker-compose-jenkins.yaml

java 复制代码
version: '3'
services:
  jenkins:
    image: registry.cn-hangzhou.aliyuncs.com/senfel/jenkins:2.346.3-2-centos7-jdk8
    container_name: jenkins
    restart: unless-stopped  #指定容器退出后的重启策略为始终重启,但是不考虑在Docker守护进程启动时就已经停止了的容器
    volumes:
      - "/usr/bin/docker:/usr/bin/docker"
      - "/var/run/docker.sock:/var/run/docker.sock"
      - "/usr/lib64/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7"
      - "./jenkins/jenkins_home:/var/jenkins_home"
      - "./jenkins/jenkins_config:/var/jenkins_config"
    environment:
      TZ: Asia/Shanghai
      LANG: en_US.UTF-8
      JAVA_OPTS: '-Xmx2048M -Xms2048M -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:MaxNewSize=128m -Djava.util.logging.config.file=/var/jenkins_home/log.properties -Duser.timezone=Asia/Shanghai'
    user: root
    ports:
      - "10000:8080"
      

配置maven源

创建maven配置文件目录

root@master app# mkdir -p jenkins/jenkins_home/appconfig/maven

新增settings.xml

root@master app# vim jenkins/jenkins_home/appconfig/maven/settings.xml

java 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
  <pluginGroups>
  </pluginGroups>
  <proxies>
  </proxies>
  <servers>
  </servers>
  <mirrors>
    <mirror>
        <id>nexus-aliyun</id>
        <mirrorOf>central</mirrorOf>
        <name>Nexus aliyun</name>
        <url>http://maven.aliyun.com/nexus/content/groups/public</url>
    </mirror>
  </mirrors>
  <localRepository>/root/.m2</localRepository>
  <profiles>
        <profile>
                <id>jdk-1.8</id>
                <activation>
                        <jdk>1.8</jdk>
                </activation>
                <properties>
                        <maven.compiler.source>1.8</maven.compiler.source>
                        <maven.compiler.target>1.8</maven.compiler.target>
                        <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
                </properties>
        </profile>
  </profiles>
</settings>

启动jenkins

root@master app# docker-compose -f docker-compose-jenkins.yaml up -d

访问 http://10.10.22.91:10000地址,等待出现下面解锁界面。

解锁jenkins

root@master app# cat jenkins/jenkins_home/secrets/initialAdminPassword

ea87fa2fb6b34e8a8415e6c3c6dc6658

解锁jenkins后,在界面中选择"安装建议的插件"并重启

Jenkins默认插件及git、镜像仓库、k8s凭证配置

host key verification configuration修改为不验证

Gitee ssh

创建用户名密码类型的github代码仓库凭证,ID为git

进入容器创建rsa

root@master app# docker exec -it b33560517ea0 bash

$ ssh-keygen -t rsa -C senfel123@sina.cn

后续步骤全部enter

查看公匙并配置在gitee ssh

$ cat /root/.ssh/id_rsa.pub

查看私匙并记住后面jenkins创建流水线配置凭证

$ cat /root/.ssh/id_rsa

ssh username with private key

阿里云镜像仓库ssh

创建用户名密码类型的aliyun registry镜像仓库凭证,ID为aliyun

username with password

编写pipeline安装以下常用插件

确认Pipeline、Docker Pipeline、

Pipeline: GitHub Groovy Libraries、Pipeline: Stage View Plugin (按照了pipeline默认就有)

Gitee plugin(我的git仓库是阿里云的,其他的可以按照GitLab)

是否已经安装

将kubectl命令文件拷贝到jenkins容器

root@master \~# find / -name kubectl

root@master \~# docker cp /usr/bin/kubectl jenkins:/usr/bin

将k8s集群配置文件拷贝到jenkins

root@master \~# docker cp /root/.kube jenkins:/root/.kube

#进入jenkins容器增加config文件执行权限

root@master \~# docker exec -it jenkins bash

root@9c4198ba00e7 .kube# chmod +x config

准备java示例工程

java工程自行准备一个springboot项目即可,这里重点是在项目根目录下新增Dockerfile、deployment.yaml、Jenkinsfile。

准备Dockerfile

java 复制代码
# version 1.0
# 基础镜像
FROM openjdk:8-jre
# 维护人
MAINTAINER senfel<187@sina.cn>
# 创建目录
RUN mkdir -p /home/app
# 拷贝项目jar
COPY ./target/k8s-demo-0.0.1-SNAPSHOT.jar /home/app/app.jar
# 执行命令启动jar
ENTRYPOINT ["java","-jar","/home/app/app.jar"]
# 暴露端口
EXPOSE 8888

添加k8s的deployment.yaml配置

java 复制代码
apiVersion: apps/v1
kind: Deployment # 声明一个Deployment资源对象
metadata:
  name: deployment-k8s-demo
spec:
  replicas: 3 # 通过replicas声明pod个数是3
  selector:   # 通过标签选择被控制的pod
    matchLabels:
      app: k8s-demo
  template:   # 在template中定义pod
    metadata:
      labels: # 给pod打上标签app=k8s-demo
        app: k8s-demo
    spec:
      containers:
        - name: k8s-demo  # 声明容器名称,注意不是pod名称,pod名称应该定义在metadata中
          image: k8s-demo-image
          ports:
            - name: http
              containerPort: 8888
--- # 在一个yaml文件中通过---分割多个资源对象
apiVersion: v1
kind: Service # 声明一个Service资源对象
metadata:
  name: service-k8s-demo
spec:
  type: NodePort
  selector: # service-k8s-demo将选择标签包含app=k8s-demo的pod
    app: k8s-demo
  ports:
    - name: http
      port: 8888  # Service监听端口
      targetPort: 8888 # 转发到后端Pod的端口号
      protocol: TCP # tcp协议
      nodePort: 30888 # 外网访问端口,范围:30000-32767

添加Jenkinsfile

java 复制代码
pipeline{
    agent any
    environment {
        WS = "${WORKSPACE}"
        REGISTRY= "registry.cn-hangzhou.aliyuncs.com"
        IMAGE_NAME = "registry.cn-hangzhou.aliyuncs.com/senfel/k8s-demo:${env.BUILD_ID}"
        K8S_NAMESPACE = "default"
    }

    //定义流水线的加工流程
    stages {
        //流水线的所有阶段
        stage('step1:env check'){
            steps {
               sh 'pwd && ls -alh'
               sh 'printenv'
               sh 'docker version'
               sh 'java -version'
               sh 'git --version'
            }
        }

        stage('step2:compile'){
            agent {
                docker {
                    image 'maven:3-alpine'
                    args '-v maven-repository:/root/.m2'
                 }
            }
            steps {
               sh 'pwd && ls -alh'
               sh 'mvn -v'
               sh 'cd ${WS} && mvn clean package -s "/var/jenkins_home/appconfig/maven/settings.xml" -Dmaven.test.skip=true'
            }
        }

        stage('step3:build image'){
            steps {
               sh 'pwd && ls -alh'
               sh 'docker build -t ${IMAGE_NAME} .'
            }
        }

       stage('step4:push image'){
            steps {
                withCredentials([[$class: 'UsernamePasswordMultiBinding',
                credentialsId: 'aliyun',
                usernameVariable: 'REGISTRY_USERNAME',
                passwordVariable: 'REGISTRY_PASSWORD']]) {
                sh """
                    docker login -u ${REGISTRY_USERNAME} -p ${REGISTRY_PASSWORD} ${REGISTRY}
                    docker push ${IMAGE_NAME}
                    docker rmi ${IMAGE_NAME}
                    """
                }
            }
        }
        stage('step5:deployment'){
            steps {
                sh """
                    sed -i "s#k8s-demo-image#${IMAGE_NAME}#g" deployment.yaml
                    kubectl apply --kubeconfig=/root/.kube/config -f deployment.yaml --namespace=${K8S_NAMESPACE}
                    """
            }
        }
    }
}

配置jenkins pipeline任务

创建jenkins pipeline任务,并设置需要的参数。

新建pipeline任务

点击"新建任务",输入名称并选择"流水线"(pipeline),然后点击确定。

新建pipeline

配置 pipeline任务

进入任务的配置界面,在流水线(pipeline)设置部分,选择"Pipeline script from SCM"。SCM选项选为"Git",配置好工程的git地址以及获取代码的凭证信息。然后在"Additional Behaviours"中添加"Clean before checkout"。

测试pipeline任务

在创建的pipeline任务中,点击"立即构建"即可立即执行pipeline任务。

在项目k8s-demo主页默认会有阶段视图

查看k8s是否已经部署k8s

root@master k8s# kubectl get pods,svc | grep k8s-demo

pod/deployment-k8s-demo-694c84bd48-blwjj 1/1 Running 0 12m

pod/deployment-k8s-demo-694c84bd48-nfwqz 1/1 Running 0 12m

pod/deployment-k8s-demo-694c84bd48-tkrv2 1/1 Running 0 12m

service/service-k8s-demo NodePort 10.107.193.30 8888:30888/TCP 14h

至此,Jenkins已经将git 分支部署在k8s集群

设置gitee自动触发jenkins

前面的步骤中已经完成了手动执行jenkins执行pipeline任务完成构建部署任务,下面说明如何在代码提交后让gitlab/gitee自动触发jenkins执行pipeline任务。

插件确认

jenkins中安装gitlab/gitee插件,我们在初始已经安装了gitee并配置了凭证。

以下直接以gitee测试,gitlab也是一样的步骤和操作。

查看jenkins webhook调用路径并生成密匙

webhook调用路径

生成webhook调用密匙

gitee配置webhook

在gitee k8s-demo项目设置中新建一个webhook

必须保证gitee能够调通你的ip,

k8s-demo 代码push测试自动构建即可。

相关推荐
m0_5873830015 分钟前
智慧场馆解决方案实战指南:从系统架构到落地部署全解析
java·spring boot·架构·系统架构
名字还没想好☜18 分钟前
Kubernetes StatefulSet 实战:为什么数据库不能用 Deployment 部署
数据库·云原生·容器·kubernetes·statefulset
ZC跨境爬虫20 分钟前
LeetCode 13. 罗马数字转整数(多解法详解 + Java Python 实现)
java·python·leetcode
省长25 分钟前
Sa-Token v1.46.0 发布 🚀,来看看有没有令你心动的功能!
java·后端·开源
LayZhangStrive1 小时前
融360 一面
java·面试·后端开发
城管不管1 小时前
重生——第十次面试之开源中国一面挂
java·linux·开发语言·算法·面试·职场和发展·开源
Java小白笔记1 小时前
Windows系统免软件命令激活
java·网络·人工智能·windows·ai·ai编程
爱敲键盘的猴子1 小时前
深入理解 Java HashMap
java·hashmap
霸道流氓气质1 小时前
Java开发者AI编程常用MCP、Skills、Rules全景汇总
java·开发语言·ai编程
天涯醉青楼2 小时前
Spring Boot 接口返回 Bean 时字段名“变形”的深度剖析与解决方案
java