使用Jenkins进行CI/CD(5)

在以往的部署方式中,Jenkins一般都是分离与k8s单独的安装集群,但是这种方式存在一些不足的地方:

  1. 当job比较少的时候有部分slave节点处于空闲状态,导致资源浪费。
  2. 当job比较多的时候slave节点可能会出现不够用的情况,将导致部分job处于等待状态。
  3. 当master节点出现问题之后,不能快速恢复,导致后续工作无法进行。

鉴于以上存在的问题,采用k8s的方式来部署Jenkins集群可以很好的解决,在k8s中只部署master节点,并通过pv对所用的job进行持久化存储,通过k8s-Jenkins插件实现slave节点的动态创建,当job比较多的时候新建slave节点,并且在job执行完之后进行销毁,并且即使master节点出现问题之后,也可以快速的通过deployment来快速的创建新的master并挂载到之前的pv上。从而达到master的高可用,也避免资源的浪费。

准备

1、插件安装

在前一篇文章中简单介绍了k8s插件的安装,本节中先对其安装和配置作详细介绍。登陆Jenkins之后再插件管理中搜索kubernetes,点击安装即可。

2、插件配置

点击进入Jenkins的系统配置,点击添加cloud,选择kubernets即可添加对k8s的集群的支持。

  1. 配置jenkins登陆k8s集群的密钥
    点击进去Jenkins的凭证管理,添加凭证,类别选择Kubernetes service Acount,点击ok即可。


  2. 配置基本信息
    这里主要配置k8s的url地址和用于认证的密钥


  3. 配置k8s的pod模板,主要用于生成slave节点。
    在Jenkins中提供了两种方式来添加agent,一种是通过ssh(由master连接到slave来执行任务),另一种是使用JNLP(Java 网络启动协议(JNLP) 是一种允许客户端启动托管在远程Web服务器上的应用程序的协议)。这里主要采用第二种方式(由slave去链接master节点),结合docker镜像。



    这里主要配置了jnlp协议所对应使用的容器镜像,同时也可以再添加多个容器,比如:用于进行maven构建的maven容器等。

3、测试

  1. 创建项目
    在Jenkins中创建一个Freestyle类型的项目,取名为test。
  2. 项目配置
    1. 添加构建参数


    2. 现在项目运行的地方(只在slave中运行)


    3. 打印参数


  3. 执行构建,查看是否动态生成slave
    返回创建好的项目,点击Build with Parameters,输入参数值,点击build。可以看到节点先有pending(等待pod的创建)再转换为执行构建

CI

在上一节中对kubernetes插件进行了简单的应用,这一节将使用github+aliyun+Jenkins来实现项目的自动构建并将生成的镜像上传到aliyun镜像仓库

  1. 配置阿里云镜像仓库
    关于阿里云镜像仓库的使用请参照官方文档,这里新建一个叫jks的仓库。
  2. 配置阿里云镜像仓库密钥
    点击进去Jenkins的凭证管理,添加凭证。


  3. 新建项目
    在GitHub上新建一个项目,并将本地的maven项目推送到仓库中。这里以及准备好了一个项目,当然读者也可以自行创建自己的项目。https://github.com/tlhhup/tlhhup.git
  4. 新建Jenkins项目
    1. 创建一个流水线类型的项目,取名为tlhhup

    2. 添加构建参数


    3. 配置流水线

        podTemplate(containers: [#声明使用到的容器
            containerTemplate(name: 'maven', image: 'maven:3.5-jdk-8', ttyEnabled: true, command: 'cat'),
            containerTemplate(name: 'docker', image: 'docker:latest', ttyEnabled: true, command: 'cat')
          ],
          serviceAccount:'jenkins',#使用的账号,在部署Jenkins时创建的
          volumes: [
            nfsVolume(mountPath: '/root/.m2', serverAddress: '192.168.241.144', serverPath: '/nfs-share'), # 配置nfs服务器的信息,注意必须为真是有效的
            hostPathVolume(hostPath: '/var/run/docker.sock', mountPath: '/var/run/docker.sock')
          ]
          ) {
        
            node(POD_LABEL) {
                stage('Get a Maven project') {
                    git 'https://github.com/tlhhup/tlhhup.git'
                    container('maven') {
                        stage('Build a Maven project') {
                            sh 'mvn -DskipTests=true clean package'
                        }
                    }
                }
                stage('Build Docker Image'){ 
                    container('docker'){# 在docker容器中执行镜像构建
                        sh '''
                            mkdir context
                            cp target/tlhhup-1.0-SNAPSHOT.jar context
                            cp doc/Dockerfile context
                        '''
                        sh 'docker build -t registry.cn-hangzhou.aliyuncs.com/gitlabci/jks:${BUILD_NUMBER} context'
                    }
                }
                stage('Push Docker Image'){
                    container('docker'){
                        sh 'echo Push Docker Image'
                        withCredentials([usernamePassword(credentialsId: 'dd', passwordVariable: 'dockerHubPassword', usernameVariable: 'dockerHubUser')]) {#引用配置的密钥
                            sh '''
                                docker login registry.cn-hangzhou.aliyuncs.com -u ${dockerHubUser} -p ${dockerHubPassword}
                                docker push registry.cn-hangzhou.aliyuncs.com/gitlabci/jks:${BUILD_NUMBER}
                            '''
                        }
                    }
                }
                stage('Deploy'){
                    input "Does the staging environment look ok?"
                }
            }
        }
      
    4. 执行构建

你可能感兴趣的:(使用Jenkins进行CI/CD(5))