Devops系列五(CI篇之pipeline libraray)jenkins将gitlab helm yaml和argocd 串联,自动部署到K8S

这篇具有很好参考价值的文章主要介绍了Devops系列五(CI篇之pipeline libraray)jenkins将gitlab helm yaml和argocd 串联,自动部署到K8S。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、说在前面的话

本文是CI篇的上文,因为上一篇已经作了总体设计,就不再赘述,有需要的请看前文。
我们将演示,使用CI工具–jenkins,怎么和CD工具–argocd串联,重点是在Jenkins该怎么做。准备工作和argocd等相关事项,在前文已铺垫ok。

Jenkins,我们是使用k8s来部署的一个master-slave结构的集群。
在开发环境,Jenkins和argocd都是部署在同一个k8s集群。

接下来,我们的java应用服务,也都将部署在该K8S里。

二、关键技术

  • jenkinsfile
  • global pipeline library

依赖的jenkins插件:

  • Workspace Cleanup

三、流水线步骤

Devops系列五(CI篇之pipeline libraray)jenkins将gitlab helm yaml和argocd 串联,自动部署到K8S,ci/cd,jenkins
流水线的各个步骤是有jenkinsfile来拼装,每个流水,特别是构建Docker镜像、修改helm yaml、发送IM消息,都需要封装到pipeline library里。

在详细描述每个步骤前,我们需要预定服务发版的依据,程序版本号,最好是每次打包都升级。但是,在开发环境,有时候我们会偷懒,所以就采用版本号+时间戳的方式。允许同一个版本号,提交多次代码,均触发部署。

四、详细实现

4.1、配置pipeline libraray

Devops系列五(CI篇之pipeline libraray)jenkins将gitlab helm yaml和argocd 串联,自动部署到K8S,ci/cd,jenkins
Devops系列五(CI篇之pipeline libraray)jenkins将gitlab helm yaml和argocd 串联,自动部署到K8S,ci/cd,jenkins

本次k8s容器化部署,增加了一个java-k8s.jenkinsfile文件,让程序的部署可以同时支持两种部署方式。

下面详细说一说这几个pipeline libraray.

4.1.1、tools.groovy – 读取java程序的版本号

读取程序的版本号,读取mvn package后的target目录下的classes/git.properties文件里的版本号git.build.version。

// 读取java应用的版本号
def getAppVersion(packagePath) {
    def appVersion = sh returnStdout: true,
            script: """
                    grep 'git.build.version' ${packagePath}/classes/git.properties | cut -d'=' -f2 | sed 's/\\r//'
                    """
    // trim()
    return appVersion.trim()
}

那么git.properties是依赖哪个mvn插件呢?

     <plugin>
		<groupId>pl.project13.maven</groupId>
		<artifactId>git-commit-id-plugin</artifactId>
		<version>4.0.0</version>
		<executions>
			<execution>
				<goals>
					<goal>revision</goal>
				</goals>
			</execution>
		</executions>
		<configuration>
			<verbose>true</verbose>
			<dateFormat>yyyy-MM-dd'T'HH:mm:ssZ</dateFormat>
			<generateGitPropertiesFile>true</generateGitPropertiesFile>
			<generateGitPropertiesFilename>${project.build.outputDirectory}/git.properties</generateGitPropertiesFilename>
			<includeOnlyProperties>
				<includeOnlyProperty>^git.build.(time|version)$</includeOnlyProperty>
				<includeOnlyProperty>^git.commit.id.(abbrev|full)$</includeOnlyProperty>
			</includeOnlyProperties>
			<commitIdGenerationMode>full</commitIdGenerationMode>
			<failOnNoGitDirectory>false</failOnNoGitDirectory>
		</configuration>
	</plugin>

考虑到java工程可以是多模块的,那就不是简单的target,而应该是${moduleName}/target了。

在mvn package后,见下图:
Devops系列五(CI篇之pipeline libraray)jenkins将gitlab helm yaml和argocd 串联,自动部署到K8S,ci/cd,jenkins
git.properties内容详情参考:

#Generated by Git-Commit-Id-Plugin
#Wed May 17 11:20:13 CST 2023
git.build.time=2023-05-17T11\:20\:13+0800
git.build.version=1.0.7
git.commit.id.abbrev=3dab776
git.commit.id.full=3dab7764afac0e8222a2bef3d78dc8b3175f8caa

4.1.2、docker.groovy – 构建镜像并推送

封装docker的几个命令,考虑到变量比较多,如果你不是很明白,对比着示例来看,具体见前文。


package com.xxtech.devops

// 保证jenkins slave节点上安装了docker
// 第一个参数是服务名称,第二个参数是端口号,第四个是xxx.jar所在的目录,都是在docker build的时候需要
// 第三个参数是docker image的版本号(一般是程序的版本号),第五个参数是dockerfile所在的位置
// 
def buildAndPushImage(appName, port, version, packagePath, dockerfileName, repoDomain = "192.168.5.6:8086") {
    def repoProject = "xxx"

    // 1、构建
    sh """
        docker build --build-arg APPNAME="${appName}" --build-arg PORT="${port}" --build-arg PACKAGE_PATH="${packagePath}" -f ${dockerfileName} -t ${repoProject}/${appName}:${version} .
       """

    // 2、登录、打标签、推送
    // 这里需要配置jenkins凭证,用户名和密码方式。具体配置,在jenkins系列文章另说。
    // 只有这样,在jenkins job控制台,才不会输出了密码字段的内容。
    withCredentials([usernamePassword(passwordVariable: 'DOCKER_PASSWORD', usernameVariable: 'DOCKER_USERNAME', credentialsId: "e4681123-7da2-4bd5-9bc2-7dd68375c406",)]) {
        sh """
            docker login ${repoDomain} -u ${DOCKER_USERNAME} -p ${DOCKER_PASSWORD}

            docker tag ${repoProject}/${appName}:${version} ${repoDomain}/${repoProject}/${appName}:${version}

            docker push ${repoDomain}/${repoProject}/${appName}:${version}
           """
    }

    // 3、删除本地镜像
    sh """
        docker rmi -f ${repoProject}/${appName}:${version}
        docker rmi -f ${repoDomain}/${repoProject}/${appName}:${version}
       """
}

4.1.3、helm.groovy – 触发helm部署

有两种方式,

  • 一种是调用helm命令,helm install至k8s。-- 不是很建议,缺乏界面,而且各应用的配置不相同,维护成本高。
  • 另外一种是修改git代码并提交,利用gitops思想,去触发argocd部署。-- 本文是采用这种方式,也是本系列的设计思路。(让CI的归jenkins,让CD的归argocd,jenkins这里只是一个触发动作,当然你是手动的话,你也可以略过本步骤。但是多少有点不完美)
package com.xxtech.devops
// helm yaml所在的git工程是  http://192.168.8.28:9980/root/argocd-helm-yaml.git
// 第一个参数是git代码下的一个目录,第二个参数的image的tag值
def updateYaml(appName, imageTag, repoUrl = "192.168.8.28:9980/root/argocd-helm-yaml.git") {
    // jenkins凭证
    def gitlabCredentialsId = "12116269-430c-4921-b63b-18a490f7531c"

    // 拉取git代码
    checkout([$class           : 'GitSCM',
              branches         : [[name: '*/master']],
              extensions       : [],
              userRemoteConfigs: [[
                                          credentialsId: "${gitlabCredentialsId}",
                                          url          : "http://${repoUrl}"
                                  ]]]
    )

    // 修改values.yaml中的image.tag
    withCredentials([usernamePassword(credentialsId: "${gitlabCredentialsId}", passwordVariable: 'GIT_PASSWORD', usernameVariable: 'GIT_USERNAME')]) {
        sh """
            // 替换image.tag的值,必须和上一次的不一样,否则后面的git提交会报错
            sed -i 's/tag:.*/tag: ${imageTag}/g' ${appName}/values.yaml
            git add ${appName}/values.yaml
            
            // 在git commit前,进行全局配置
            git config --global user.name "admin"
            git config --global user.email "admin@example.com"
            
            git commit -m "modify image tag to ${imageTag}"
            // git push的时候不会让你再次输入用户名和密码
            git push http://$GIT_USERNAME:$GIT_PASSWORD@${repoUrl} HEAD:master
           """
    }
}

4.1.4、http.groovy – 发送Im消息

我们需要把jenkins job的结果告知工程的相关人员。这就属于im的范畴了,实现就是调用一个http请求,能发送http请求即可,具体处理是交由消息接收服务去发送。

有人要问,为什么不直接在jenkinsfile里发,还要多引入一个服务呢?

这里,主要的原因是,我们的需求不是简单的通过rebot机器人,把发送消息至企业微信群里。
而是会给应用打标签,根据所属标签,而企业微信会维护标签下有哪些人。

package com.xxtech.devops

def request(reqType, reqUrl, reqBody, reqFile = '', contentType = "APPLICATION_JSON_UTF8") {
    def response = httpRequest httpMode: reqType,
            contentType: contentType,
            consoleLogResponseBody: true,
            ignoreSslErrors: true,
            uploadFile: reqFile,
            requestBody: reqBody,
            url: "${reqUrl}",
            timeout: 600
    //quiet: true

    return response
}


def imNotify(projectName, result, buildEnv, message, branch, buildBy, robotKey = '') {
    def reqBody = """   {"projectName": "${projectName}",
                    "buildResult": "${result}", 
                    "branch": "${branch}", 
                    "buildBy": "${buildBy}", 
                    "env": "${buildEnv}", 
                    "reason": "${message}", 
                    "robotKey": "${robotKey}",
                    "buildUrl": "${env.BUILD_URL}" } """

    def url = "http://192.168.10.47/devops/api/jenkins/notify"

    request("POST", url, reqBody)
}

4.2、docker in docker 容器的配置

docker image的构建和推送,要求你有docker环境,而不幸的是,我们无论是jnlp还是已安装的容器都不具备。
所以,我额外引入了一个容器docker:dind
这里,着重说明下我在使用过程中,遇到的几个问题。

4.2.1、未分配伪终端

报错信息是Container docker was terminated (Exit Code: 0, Reason: Completed),导致Jenkins job直接没跑起来。

Devops系列五(CI篇之pipeline libraray)jenkins将gitlab helm yaml和argocd 串联,自动部署到K8S,ci/cd,jenkins

4.2.2、未配置volumes

// dind运行,必须配置volumes如下。
volumes: [
    hostPathVolume(hostPath: '/var/run/docker.sock', mountPath: '/var/run/docker.sock')
 ]

4.2.3、dind运行不起来

dind没有/bin/bash, 且必须增加参数–privileged

docker run -d --privileged docker:dind

docker exec -it {容器ID} sh

而jenkins containerTemplate中的容器,默认值: --privileged: true,要不然就用不了docker:dind

五、未完待续

我们把CI篇分为两篇,本文是先介绍了pipeline library,是Jenkinsfile的一个基础。
下一篇,我们将详细说明java-k8s.jenkinsfile要怎么写。文章来源地址https://www.toymoban.com/news/detail-549126.html

到了这里,关于Devops系列五(CI篇之pipeline libraray)jenkins将gitlab helm yaml和argocd 串联,自动部署到K8S的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【基于 GitLab 的 CI/CD 实践】03、GitLab Pipeline 实践(上)

    目录 一、GitLab Pipeline 流水线语法有哪些?流水线参数列表 如何检查语法错误?流水线语法检测 二、Pipeline 基础语法 job script before_script after_script stages 未定义 stages ​定义 stages 控制 stage 运行顺序   .pre .post stage variables 综合实例(一) tags allow_failure when manual 手动 delayed 延迟

    2024年02月17日
    浏览(48)
  • DevOps-Jenkins-CI持续集成操作

    创建个web项目 我这里直接用Spring Web自动生成的demos 启动项目,访问展示如下默认页面信息 在项目下新建docker目录,新增Dockerfile、docker-compose.yml文件 Dockerfile文件,将mytest.jar 复制到容器的/usr/local/目录下,在/usr/local执行命令java -jar mytest.jar docker-compose.yml文件,当前目录以D

    2024年03月13日
    浏览(45)
  • 使用Gitlab管理Jenkins Pipeline流水线

    1、首先需要将已经调试好的Jenkins pipeline文件上传到git库中,推荐以 Jenkinsfile 命名 放至git库根目录 上传完成后 在git库中可以查看到 如下图所示: 2、配置Jenkins任务 完成后pipeline脚本会存放在git库上面进行管理编辑了,当我们构建此任务时会从git库中获取pipeline流水线进行执

    2024年02月12日
    浏览(40)
  • (十四)devops持续集成开发——jenkins流水线使用pipeline方式发布项目

    本节内容我们使用另外一种方式pipeline实现项目的流水线部署发布,Jenkins Pipeline是一种允许以代码方式定义持续集成和持续交付流水线的工具。通过Jenkins Pipeline,可以将整个项目的构建、测试和部署过程以脚本的形式写入Jenkinsfile中,实现对整个流程的可视化管理和控制。在

    2024年02月21日
    浏览(47)
  • docker部署Jenkins(Jenkins+Gitlab+Maven实现CI/CD)

          GitLab是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的Web服务,可通过Web界面进行访问公开的或者私人项目。它拥有与Github类似的功能,能够浏览源代码,管理缺陷和注释。       GitLab是由GitLabInc.开发,使用MIT许可证的基于

    2024年02月03日
    浏览(36)
  • gitlab+jenkins+harbor实现CI/CD(2)——初级

    git安装 jenkins主机上安装docker-ce 配置仓库证书 测试 创建项目 创建一个freestyle project 在jenkins主机获取密钥 在gitlab上传公钥 在jenkins上传私钥 输入测试命令后保存 点击立即构建 查看控制台输出 工作路径 构建触发器,定时触发 安装插件 gitlab和 Cloudbee docker 配置gitlab 在网络设

    2024年02月09日
    浏览(38)
  • DevOps搭建(十九)-Jenkins+K8s自动化CI搭建详细步骤

    完整的pipeline-auto.yml脚本如下 完整的Jenkinsfile脚本如下 在Jenkins插件管理中搜索GitLab插件进行安装。 进入Jenkins项目配置里的 构建触发器 ,勾选如下选项: 从系统管理-系统配置-Gitlab将验证去掉,生产最好配置保证安全。 如果是GitLab和Jenkins在同一台服务器,需要开启允许请求

    2024年01月23日
    浏览(67)
  • 使用 Jenkins、Gitlab、Harbor、Helm、k8s 来实现流水线作业

    使用 Jenkins、Gitlab、Harbor、Helm、Kubernetes 来实现一个完整的持续集成和持续部署的流水线作业 开发人员提交代码到 Gitlab 代码仓库 通过 Gitlab 配置的 Jenkins Webhook 触发 Pipeline 自动构建 Jenkins 触发构建构建任务,根据 Pipeline 脚本定义分步骤构建 先进行代码静态分析,单元测试

    2024年04月27日
    浏览(27)
  • 【软件测试】- 将 Selenium 和 JMeter 测试脚本集成到 Jenkins 中实现自动化测试和持续集成(CI)及Jenkinsfile 实现 Jenkins Pipeline 原理介绍

    将 Selenium 和 JMeter 测试脚本集成到 Jenkins 中是实现自动化测试和持续集成(CI)的关键步骤。以下是详细的集成过程: 1、准备工作 安装 Jenkins : 确保您已经在服务器上安装了 Jenkins。 可以从 Jenkins 官网 下载并安装。 安装必要的插件 : 在 Jenkins 中安装所需的插件,如 Git 插

    2024年02月04日
    浏览(47)
  • devops完整搭建教程(gitlab、jenkins、harbor、docker)

    DevOps(Development Operations)是一种软件开发方法论和工作流程,旨在促进软件开发团队和运维团队之间的协作与沟通,以实现更高效的软件交付和运营。 持续集成(Continuous Integration,CI):开发团队将代码频繁地集成到共享存储库中,确保代码的一致性和稳定性。 持续交付(

    2024年02月19日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包