jenkins 自动化构建(一)

简介

昨晚领导给我讲解了一下jenkins通过pipline方式构建jenkins结合gitlab的自动化构建镜像,大体听懂了,自己的理解,通过pipline的方式构建等同于把需要手动配置的configure的东西,全部用脚本代码来实现,也算是减少了重复配置的工作,并且能实现一些configure无法实现的情况。

Pipline

什么是Pipeline,简单来说,就是一套运行于Jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂发布流程。Pipeline的实现方式是一套Groovy DSL,任何发布流程都可以表述为一段Groovy脚本,并且Jenkins支持从代码库直接读取脚本,从而实现了Pipeline as Code的理念。
Pipeline脚本是用Groovy写的,有的复杂的配置可以通过生成器直接生产代码,复制到代码结构中。
pipline脚本方式有两种生成如下图

具体通过生成器产生代码方法,其实就是跟手动配置configure一样

Declarative Pipeline

语法结构模式

Declarative Pipeline 语法链接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
pipeline {
agent any ####指定你跑的jenkins跑在哪个节点上,如果配置了分布式构建,这里就可以指定
parameters {
****** #####需要的参数 对应congfigure里面的parameters
}
options {
****** ####选项
}
environment {
****** ####环境变量 这里面的env 只能在steps调用 测试过triggers调用取不到
}
triggers {
gitlab( ### gitlab触发器配置
*******)
}
stages { ###这里就是主要的步骤
stage('git source') { ### 可以写多个stages
steps { ### 每个stages可以多个steps
****
}
}

Jenkinsfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85

pipeline {
agent { label 'jenkins-slave' }

parameters {
string(name: 'gitTagName', defaultValue: '', description: '可空', trim: true)
}
options {
disableConcurrentBuilds()
buildDiscarder logRotator(daysToKeepStr: '30', numToKeepStr: '30')
}
environment {
GRADLE_USER_HOME = "${WORKSPACE}" ###指定下 gradle 编译的家目录
}
triggers {
gitlab(
triggerOnPush: true,
triggerOnMergeRequest: true, triggerOpenMergeRequestOnPush: "never",
triggerOnNoteRequest: true,
noteRegex: "Jenkins please retry a build",
skipWorkInProgressMergeRequest: true,
ciSkip: true,
setBuildDescription: true,
addNoteOnMergeRequest: true,
addCiMessage: true,
addVoteOnMergeRequest: true,
acceptMergeRequestOnSuccess: false,
branchFilterType: "RegexBasedFilter", ##分支过滤
targetBranchRegex: '(.*develop.*|.*\d+(\.\d+){0,3})',##过滤的正则表达式
cancelPendingBuildsOnUpdate: false,
secretToken: "45ed456533423245f4c8dbf9c669") ####随便撸一串长字符串,这段字符串需要跟GitLab webhook URL一起填到 gitlab setting--integration中
}

stages {
stage('git source') {
steps {
script {
if (env.gitlabActionType == 'TAG_PUSH') {
env.gitTagName = env.gitlabBranch.replaceAll('refs/tags/', '')
}
env.gitBranchName = '*/develop'
if (env.gitTagName != '') {
env.gitBranchName = "refs/tags/${env.gitTagName}"
currentBuild.displayName = "#${BUILD_NUMBER} (${env.gitTagName})"
}else {
currentBuild.displayName = "#${BUILD_NUMBER} (develop)"
}
}
checkout([$class: 'GitSCM', branches: [[name: "${gitBranchName}"]], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'SubmoduleOption', disableSubmodules: false, parentCredentials: false, recursiveSubmodules: true, reference: '', trackingSubmodules: true]], submoduleCfg: [], userRemoteConfigs: [[url: '*************${JOB_BASE_NAME}.git']]])
####******指定自己的代码库
}
}
stage('java build') {
steps {
retry(3) {
sh 'gradle clean --refresh-dependencies publish build -x test'
}
}
}
stage('docker build') {
steps {
withCredentials([string(credentialsId: 'HarborUser', variable: 'harborUser'), string(credentialsId: 'HarborPasswd', variable: 'harborPwd')]) {
retry(3) {
sh '''
docker login -u ${harborUser} -p ${harborPwd} harbor.abc.com ###*****你的docker镜像仓库
if [ -z $gitTagName ] ; then
docker build -t harbor.abc.com/test/${JOB_BASE_NAME} .
docker push harbor.abc.com/test/${JOB_BASE_NAME}:latest
else
docker build -t harbor.abc.com/test/${JOB_BASE_NAME}:${gitTagName} .
docker push harbor.abc.com/test/${JOB_BASE_NAME}:${gitTagName}
fi
'''
}
}
}
}
}

post {
failure {
emailext body: '$PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS: Check console output at $BUILD_URL to view the results.', recipientProviders: [requestor(), brokenBuildSuspects()], subject: '$PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS!'
}
}
}

jenkins配置

采用pipeline script from SCM方式,在pipline选项中选择。
pipeline script from SCM:需要配置SCM代码存储Git地址或SVN地址,指定script文件Jenkinsfile所在路径,每次构建job会自动去指定的目录执行script文件。
具体配置查看官方文档

现在阶段只是配置了构建镜像,并没有集成到部署,学习中待补。。。

jenkinsci/gitlab-plugin

jenkins 官方文档

END