当前位置: 代码网 > it编程>编程语言>Java > 【实战】采用jenkins pipeline实现自动构建并部署至k8s

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

2024年07月28日 Java 我要评论
在前面的kubernetes系列博文中我们分享了从创建kubernetes集群到各种中间件的安装,以及从springboot项目的容器化部署到kubernetes外网映射,基本上包含了从0到1的K8S基础实战的整个过程。今天我们再分享一期采用jenkins pipeline实现自动构建并部署至k8s的实战演示,各位大大敬请鉴赏。本文中采用jenkins pipeline执行整个jenkins的构建过程,在pipeline中使用docker执行maven构建。构建后通过dockerfile将jar包构建为

前言

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

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

<?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

# 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配置

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

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测试自动构建即可。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com