Jenkins
Jenkins是一款开源的持续集成工具,广泛用于项目开发,具有自动化构建、测试和部署等功能
其本身主要负责自动化的 代码编译, 打包, 测试, 组装;向上要与代码管理工具(如gitlab)/配置管理工具进行交互;向下要与服务器管理工具/容器(docker)/服务器(物理机, aws)进行交互。
Jenkins
W3Cschool Jenkins官方文档
wiki
github
step ref
持续集成是什么?
Jenkins打造强大的前端自动化工作流
很强的教程
十个最佳实践
groovy in y minutes
Jenkins持续集成 - 管道详解
使用
构建
- 通过在界面上操作, 配置构建过程,有很多插件
源码管理:git svn
构建触发器: 何时进行构建
构建环境
构建步骤: 按顺序添加的可用的构建操作, 有很多插件增加构建功能.
构建后操作: 增加一些清理, 通知, 报告之类的操作.
通过在这个页面上点点点, 就可以配置好这个项目的整个构建流程.
- 通过编写Pipeline, 描述构建过程
Pipeline是一个文件, 随着项目代码保存在一起,这个文件里面就描述了构建的整个过程,这个文件习惯叫作Jenkinsfile。创建Pipeline类型的项目, 在配置中,只剩下源码管理和构建触发器, 构建环境/构建步骤/构建后操作 都移到Pipeline文件中描述了。
eg1:
new item -> 选择pipline -> 在脚本中输入如下内容保存 -> Build now -> 在构建历史记录下,选择执行的结果单击console output查看输出
一些通用的格式:
node {
echo 'Hello World'
}
在Jenkins服务 {jenkins_url}/pipeline-syntax/ url上, 有一个自带的语法帮助
step references相关查询
添加credentials,configfile
拉取gitlab代码
选择Credentials -> 选择一个相应的目录下,add Credentials -> kind选择SSH Username with private key,在private key中输入密钥,设置相应名称 -> ok
在gitlab界面的SSH连接中添加公钥
其中ssh key可以选择在任意机器上执行ssh-keygen生成的结果,也可以使用本地连接gitlab的密钥,这样就不需要操作gitlab了
configfile配置
在当前目录下选择Config Files -> add a new Config -> 配置里面的东西,比如添加server等
构建项目
freestyle_test
new item -> name:freestyle_test,Freestyle project -> Configure -> 配置 -> build now -> consule output
maven_test
new item -> name:maven_test,Maven project -> Configure -> 配置 -> build now -> consule output
使用设置的config file setting,不然可能会因为权限问题下不了相关包
[WARNING] Could not transfer metadata ****: Not authorized , ReasonPhrase:Unauthorized.
等执行完会在Modules目录下发现最后生成的jar包
pipeline_test
new item -> name:pipline_test,Pipline -> Configure -> 配置 -> build now -> consule output
对应的gitlab项目中必须还有jenkinsfile文件
不然会报错
java.io.FileNotFoundException
at jenkins.plugins.git.GitSCMFile$3.invoke(GitSCMFile.java:167)
at jenkins.plugins.git.GitSCMFile$3.invoke(GitSCMFile.java:159)
at jenkins.plugins.git.GitSCMFileSystem$3.invoke(GitSCMFileSystem.java:193)
at org.jenkinsci.plugins.gitclient.AbstractGitAPIImpl.withRepository(AbstractGitAPIImpl.java:29)
at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.withRepository(CliGitAPIImpl.java:72)
at jenkins.plugins.git.GitSCMFileSystem.invoke(GitSCMFileSystem.java:189)
at jenkins.plugins.git.GitSCMFile.content(GitSCMFile.java:159)
at jenkins.scm.api.SCMFile.contentAsString(SCMFile.java:338)
at org.jenkinsci.plugins.workflow.cps.CpsScmFlowDefinition.create(CpsScmFlowDefinition.java:110)
at org.jenkinsci.plugins.workflow.cps.CpsScmFlowDefinition.create(CpsScmFlowDefinition.java:67)
at org.jenkinsci.plugins.workflow.job.WorkflowRun.run(WorkflowRun.java:303)
at hudson.model.ResourceController.execute(ResourceController.java:97)
at hudson.model.Executor.run(Executor.java:429)
Finished: FAILURE
jenkinsfile checkout scm必须有,不然找不到pom文件
#!groovy
node {
stage('checkout'){
//必须有,该checkout步骤将检出从源控制代码; scm是一个特殊变量,指示checkout步骤克隆触发此Pipeline运行的特定修订。
checkout scm
}
def javaHome = tool('jdk1.8')
def mvnHome = tool('mvn3')
env.PATH = "${mvnHome}/bin:${env.PATH}"
stage('mvn build'){
//sh "JAVA_HOME=${javaHome} mvn clean package"
configFileProvider([configFile(fileId: '****', variable: 'MAVEN_SETTINGS')]) {
sh 'mvn -s $MAVEN_SETTINGS clean package'
}
}
stage('mvn test'){
sh "echo test"
}
stage('mvn deploy'){
configFileProvider([configFile(fileId: '****', variable: 'MAVEN_SETTINGS')]) {
sh 'mvn -s $MAVEN_SETTINGS deploy'
}
}
}
scp jar包到服务器
def user = '***'
def server = '***'
def keyId = "****"
def server_ws = "/home/data/***"
//上传jar包
sshagent(credentials: ["${keyId}"]){
def jarName
stage('scp-jar'){
jarName = sh([returnStdout: true,
script : "ls target/*-jar-with-dependencies.jar"]).trim().split('/')[-1]
sh "scp -oUserKnownHostsFile=/dev/null -oStrictHostKeyChecking=no target/${jarName} ${user}@${server}:${server_ws}"
}
}
发邮件使用post
一般放置文末
post {
success {
emailext (
subject: "SUCCESSFUL: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]'",
to: "nick@xxxxx.com",
body: """<p>SUCCESSFUL: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]':</p>
<p>Check console output at "<a href='${env.BUILD_URL}'>${env.JOB_NAME} [${env.BUILD_NUMBER}]</a>"</p>""",
recipientProviders: [[$class: 'DevelopersRecipientProvider']]
)
}
failure {
emailext (
subject: "FAILED: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]'",
to: "nick@xxxxx.com",
body: """<p>FAILED: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]':</p>
<p>Check console output at "<a href='${env.BUILD_URL}'>${env.JOB_NAME} [${env.BUILD_NUMBER}]</a>"</p>""",
recipientProviders: [[$class: 'DevelopersRecipientProvider']]
)
}
}
触发器
poll scm 触发器
Build Triggers 中选择Poll SCM,定时检查是否有push操作
push触发器
选择Build when a change is pushed to GitLab. GitLab webhook URL: https://**
将url放到gitlab的webhook上,需要有项目的owner权限
push钩子的大致流程是这样的:
1. push代码,Gitlab触发hook,访问Jenkins提供的api
2. Jenkins Branch Filter系统判断自己需要处理的分支是否有改动,如果有开始构建
3. 运行构建脚本