建立工作流
将工作流关联项目组
配置webhook
设置-->系统-->网络钩子
上面配置完成后,即完成Jira上配置,然后就可以在对应项目的看板上查看所以待发布的项目,如下:
然后进行拖拽或者点击发布按钮,即可改变状态,触发流水线进行相应的操作了。
Gitlab与Jenkins集成发布系统
开发分支简要
这里主要使用的是功能分支开发模式,主要分为以下几个分支:
·DEV分支:开发环境分支
· TEST分支:测试环境分支
· UAT分支:联调环境分支
· PRE分支:预发布环境分支
· MASTER分支:生产环境分支
代码合并路线是:DEV->TEST->UAT->PRE->MASTER
然后根据不同的分支判断执行不同环境的部署。
Jenkins配置流水线
(1)配置Webhook插件参数
获取Gitlab分支
定义gitlab push条件,不是任何改动都需要触发流水线。
这样就只有commit的时候才会触发流水线。
(2)配置Jenkinsfile
def labels = "slave-${UUID.randomUUID().toString()}"
// 引用共享库
@Library('jenkins_shareLibrary')
// 应用共享库中的方法
def tools = new org.devops.tools()
def branchName = ""
// 获取分支
if ("${gitlabWebhook}" == "gitlabPush"){
branchName = branch - "refs/heads/"
currentBuild.description = "构建者${userName} 分支${branchName}"
}
pipeline {
agent {
kubernetes {
label labels
yaml """
apiVersion: v1
kind: Pod
metadata:
labels:
some-label: some-label-value
spec:
volumes:
- name: docker-sock
hostPath:
path: /var/run/docker.sock
type: ''
- name: maven-cache
persistentVolumeClaim:
claimName: maven-cache-pvc
containers:
- name: jnlp
image: registry.cn-hangzhou.aliyuncs.com/rookieops/inbound-agent:4.3-4
- name: maven
image: registry.cn-hangzhou.aliyuncs.com/rookieops/maven:3.5.0-alpine
command:
- cat
tty: true
volumeMounts:
- name: maven-cache
mountPath: /root/.m2
- name: docker
image: registry.cn-hangzhou.aliyuncs.com/rookieops/docker:19.03.11
command:
- cat
tty: true
volumeMounts:
- name: docker-sock
mountPath: /var/run/docker.sock
- name: sonar-scanner
image: registry.cn-hangzhou.aliyuncs.com/rookieops/sonar-scanner:latest
command:
- cat
tty: true
- name: kustomize
image: registry.cn-hangzhou.aliyuncs.com/rookieops/kustomize:v3.8.1
command:
- cat
tty: true
- name: kubedog
image: registry.cn-hangzhou.aliyuncs.com/rookieops/kubedog:v0.5.0
command: ['cat']
tty: true
- name: trivy
image: registry.cn-hangzhou.aliyuncs.com/rookieops/trivy:v2
command: ['cat']
tty: true
volumeMounts:
- name: docker-sock
mountPath: /var/run/docker.sock
"""
}
}
environment {
auth = 'joker'
}
options {
timestamps() // 日志会有时间
skipDefaultCheckout() // 删除隐式checkout scm语句
disableConcurrentBuilds() //禁止并行
timeout(time:1, unit:'HOURS') //设置流水线超时时间
}
stages {
// 拉取代码
stage('GetCode') {
steps {
checkout([$class: 'GitSCM', branches: [[name: "${gitBranch}"]],
doGenerateSubmoduleConfigurations: false,
extensions: [],
submoduleCfg: [],
userRemoteConfigs: [[credentialsId: '83d2e934-75c9-48fe-9703-b48e2feff4d8', url: "${gitUrl}"]]])
}
}
// 单元测试和编译打包
stage('Build&Test') {
steps {
container('maven') {
script {
tools.PrintMes('编译打包', 'blue')
}
}
}
}
// 代码扫描
stage('CodeScanner') {
steps {
container('sonar-scanner') {
script {
tools.PrintMes('代码扫描', 'blue')
}
}
}
}
// 构建镜像
stage('BuildImage') {
steps {
container('docker') {
script {
tools.PrintMes('构建镜像', 'blue')
}
}
}
}
// 镜像扫描
stage('Vulnerability Scanner') {
steps {
container('trivy') {
script{
tools.PrintMes('镜像扫描', 'blue')
}
}
}
}
// 推送镜像
stage('Push Image') {
steps {
container('docker') {
script{
tools.PrintMes('推送镜像', 'blue')
}
}
}
}
// 部署
stage('Deploy DEV') {
when {
branchName 'dev'
}
steps {
container('kustomize'){
script{
tools.PrintMes('部署DEV环境','blue')
}
}
}
}
stage('Deploy TEST') {
when {
branchName 'test'
}
steps {
container('kustomize'){
script{
tools.PrintMes('部署TEST环境','blue')
}
}
}
}
stage('Deploy UAT') {
when {
branchName 'uat'
}
steps {
container('kustomize'){
script{
tools.PrintMes('部署UAT环境','blue')
}
}
}
}
stage('Deploy PRE') {
when {
branchName 'pre'
}
steps {
container('kustomize'){
script{
tools.PrintMes('部署PRE环境','blue')
}
}
}
}
stage('Deploy PROD') {
when {
branchName 'master'
}
steps {
container('kustomize'){
script{
tools.PrintMes('部署PROD环境','blue')
}
}
}
}
// 跟踪应用启动情况
stage('Check App Start') {
steps{
container('kubedog'){
script{
tools.PrintMes('跟踪应用启动', 'blue')
}
}
}
}
// 接口测试
stage('InterfaceTest') {
steps {
sh 'echo "接口测试"'
}
}
}
// 构建后的操作
post {
success {
script {
println('success:只有构建成功才会执行')
currentBuild.description += '\n构建成功!'
dingmes.SendDingTalk("构建成功 ?")
}
}
failure {
script {
println('failure:只有构建失败才会执行')
currentBuild.description += '\n构建失败!'
dingmes.SendDingTalk("构建失败 ?")
}
}
aborted {
script {
println('aborted:只有取消构建才会执行')
currentBuild.description += '\n构建取消!'
dingmes.SendDingTalk("构建失败 ?","暂停或中断")
}
}
}
}
(3)在Gitlab上配置钩子
settings->webhook
到这里,Gitlab和Jenkins集成就差不多完成了,后面就是具体的调试以及配置了。
写到最后
道路千万条,适合自己才最好。
上面是根据工作的实际情况做的运维发布,整体思路还有实现方式并不复杂,主要是充分利用各个软件地webhook能力,以及充分利用Jenkins灵活的插件功能,使得从创建发布计划和执行发布进行打通。
个人觉得还是有必要记录一下,也希望能帮助到有这方面需要的人。
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理