jenkins-gitops-ci

阅读量: zyh 2020-03-26 14:32:11
Categories: > Tags:

目的

gitlab 推送后,jenkins 可以自动执行流水线。

流程:

用户推送代码到gitlab工程 -》 gitlab 收到推送信息到 jenkins webhook -》Jenkins 收到gitlab的事件 -》根据 Jenkins 流水线工程配置的可执行事件来启动流水线工程 -》 执行pipeline(从配置的scm里获取) -》根据 pipeline 执行代码拉取、代码测试、代码打包、docker镜像包、docker镜像推送。

涉及到的账户

操作步骤

  1. gitlab - 管理中心 - 设置 - 网络 - 外发请求 - 允许Webhook和服务对本地网络的请求(启用)

    ✨仅当jenkins通过内网访问gitlab的时候需要.

  2. gitlab 创建专属用户 jenkins

  3. jenkins 创建证书凭据,并将公钥放在 gitlab 专属用户 jenkins 上

  4. gitlab 专属用户 jenkins 创建访问令牌,并保存令牌(令牌只有创建的时候有可见性),令牌本身授权API权限。

  5. jenkins 安装 gitlab 插件,并创建凭据,类型为Gitlab api token,将 gitlab 专属用户 jenkins 的访问令牌填入。

    ✨gitlab 插件可能依赖 git 插件,在我安装 gitlab 插件的时候,提示 git 插件版本过低,以至于gitlab插件最后安装异常。升级 git 插件后,gitlab插件可用。

    ✨gitlab 插件允许 Jenkins

  6. jenkins 启用和配置 gitlab 插件。

    jenkins-gitops-ciimage-20220327163856124

  7. 流水线工程启用 gitlab 事件推送,从而获取 jenkins 提供 webhook 地址,便于 gitlab 将代码变更事件推送到 jenkins.

    ✨截图里黑色区域,即为jenkins为当前流水线工程创建的webhook地址

    image-20220327164429407

点击【高级】,即可弹出高级配置,从而可以给 webhook 地址创建 token

image-20220327164615263

  1. 打开对应的 gitlab 工程 - 设置 - webhooks,将 7 步骤里的 webhooks 地址和 token 填入其中。

  2. 将Pipeline文件Jenkinsfile放入gitlab工程中,并将jenkins ci工程的pipeline通过scm指向gitlab工程。

    ✨SCM的的git用户需要 read_repository 权限.

配置仓库的Jenkinsfile

pipeline{
	environment {
		appName = "server" // 程序名,亦是镜像仓库名
		appVersion = "v0.1.0" // 程序版本,亦是镜像标签
		appGit = "http://git.xxx.com/it/test.git"
		registryCredential = "harbor-jenkins-rw" // 镜像注册表登录凭据名,需提前在jenkins凭据功能里添加
		registryUrl = "https://harbor.xxx.com/" // 镜像注册表地址
		registryProject = "it" // 项目名/命名空间
		dockerImage = "" // 空的环境变量名
	}
    agent{
        kubernetes{
            inheritFrom "dockerbuild" // Pod模板名
        }
    }

    stages {
		stage("code: pull") {
			steps {
				git credentialsId: 'gitgg-apps-ro', branch: 'master', url: appGit
			}
		}
        stage('docker: build') {
			steps {
				container('docker') {
					script {
						dockerImage = docker.build( registryProject + "/" + appName + ":" +appVersion, "docker")  // build方法接收两个参数,第一个是镜像tag,第二个是dockerfile在代码里的相对目录
					}
				}
			}
		}
		stage('docker: push') {
		    steps {
		        container('docker') {
		            script {
		                docker.withRegistry( registryUrl, registryCredential ) { // 登录注册表
		                    dockerImage.push() // dockerImage 即上一阶段的 dockerImage 变量.
		                }
		            }
		        }
		    }
		}
    }
}