安装安装jdk11sudoaptinstallopenjdk-11-jdk查看版本java-version查看安装位置dpkg-Lopenjdk-11-jdk/usr/lib/jvm/java-11-openjdk-amd64安装net-toolssudoaptinstallnet-tools安装jenkins下载安装包curl-L0https://mirrors.aliyun.com/jenkins/debian/jenkins_2.462_all.deb--outputjenkins_2.462_all.deb安装dpkg -i jenkins_2.462_all.deb卸载dpkg-rjenkins修改配置vi/usr/lib/systemd/system/jenkins.service改为# Unix account that runs the Jenkins daemon# Be careful when you change this, as you need to update the permissions of# $JENKINS_HOME, $JENKINS_LOG, and (if you have already run Jenkins)# $JENKINS_WEBROOT.UserrootGrouproot重新加载单元systemctl daemon-reload启动、开机启动sudosystemctl start jenkinssudosystemctlenablejenkins验证是否安装成功sudosystemctl status jenkins在浏览器访问服务器ip:8080可以看到以下页面初始化Jenkins根据页面提示找到密码并填入sudocat/var/lib/jenkins/secrets/initialAdminPassword选择推荐的插件等待安装安装失败的可以点击重试继续安装创建用户账号密码、邮箱全为admin点击保存并完成点击开始使用Jenkins构建完毕安装Git先验证有没有安装git--version如果没有安装执行安装命令sudoaptinstallgit查看安装git是否成功git--version安装位置whichgit/usr/bin/git安装Maven创建文件夹aptinstallmaven查看maven版本mvn-v/usr/share/maven创建本地仓库文件夹mkdir-p/usr/local/maven/repo赋予777权限chmod777/usr/local/maven/repo修改maven的setting.xml配置信息vi/etc/maven/settings.xml配置本地仓库localRepository/usr/local/maven/repo/localRepository配置阿里云镜像加速mirroridnexus-aliyun/idmirrorOf*/mirrorOfnameNexus aliyun/nameurlhttp://maven.aliyun.com/nexus/content/groups/public/url/mirrorJenkins工具配置在Jenkins主页点击Manage Jenkins找到Tools点击配置JDK点击新增 JDK指定别名、jdk安装主目录/usr/lib/jvm/java-11-openjdk-amd64配置Git输入名字、git路径Git路径默认为/usr/bin/git配置maven点击新增 Maven指定名字和Maven的主目录/usr/share/maven点击保存完成配置配置环境变量添加全局环境变量配置JDKJAVA_HOME/usr/lib/jvm/java-11-openjdk-amd64配置MavenM2_HOME/usr/share/maven配置Maven命令pathPATHEXTRA$M2_HOME/bin然后保存安装插件SSH server插件Jenkins打完包需要上传到新的服务器上此处使用ssh的方式上传添加ssh插件。首页点击Manage Jenkins找到Plugins选择available plugins在输入框中输入ssh server在查询到的列表中勾选然后点击安装勾选安装完成之后重启Jenkins安装Maven插件角色管理插件搜索安装Role-based Authorization Strategy插件安装完毕之后配置角色管理策略选择Role-Based Strategy选择好后保存添加角色添加一个全局角色login_role指定基本登录功能勾选Read权限创建项目角色goods_role指定Patternpattern是一个表达式可以用来指定该角色的用户可以访问什么样的项目goods.* 表示只能访问名字以goods开头的项目注意 . 是必须的选择赋予权限此处赋予全部权限也可以根据实际情况进行授权再创建order_role角色授予权限保存添加用户点击添加指定用户名、密码、全名、邮箱然后点击新建用户创建完毕之后会在用户列表看到新建的用户用同样的方式再创建一个用户给用户分配角色给用户分配全局角色添加用户填写用户名用同样的方式再添加一个然后分配login_role角色分配项目角色点击添加用户添加方式与全局用户一致添加完毕之后分别分配角色分配好之后点击保存新建测试项目新建项目进行测试用同样的方式再创建一个创建完毕如下此时注销账户分别用xiang、elvis登录查看项目列表凭证管理Manage Jenkins → CredentialsUsername with password:用户名和密码 比如使用Gitlab拉取代码SSH Username with private key:使用SSH用户和密钥 SSH免密登录Secret file:需要保密的文本文件使用时Jenkins会将文件复制到一个临时目录中再将文件路径设置到一个变量中等构建结束后所复制的Secret file就会被删除。Secret text:需要偃存的一个加密的文本串如钉钉机器人或Github的api tokenCertificate:通过上传证书文件的方式常用的凭证类型有: Username with password(用户密码和SSH Username with private key (SSH密钥)接下来以使用Git工具到Gitlab拉取项目源码为例演示Jenkins的如何管理Gitlab的凭证。创建项目基本配置Jenkins主页点击新建任务输入项目名选择构建一个maven项目然后点击确定填写项目描述【可选】点击源码管理选择Git填写仓库地址、选择凭证指定拉取的分支然后点击保存保存完毕之后会在Jenkins主页看到该项目点击项目名字可以进入到该项目中构建项目点击立即构建可以构建项目Jenkins会自动拉取代码并打包点击立即构建之后会在下面的构建历史中添加一条构建信息点击构建信息进入构建详情点击控制台输出可以看到构建过程构建成功如下图所示下面红框中显示了构建好的jar包在什么位置Post Steps在root用户的主目录下创建启动shell脚本vim/root/start.sh添加以下内容#!/bin/bash# 拷贝文件cp/var/lib/jenkins/workspace/test/target/springsecurity-2-0.0.1-SNAPSHOT.jar /usr/project# 变量保存jar包名RESOURCE_NAMEspringsecurity-2-0.0.1-SNAPSHOT.jarLOG_FILE/usr/project/nohup.out# 获取原进程idtpidps-ef|grep$RESOURCE_NAME|grep-vgrep|grep-vkill|awk{print $2}# tpidps -ef | grep $RESOURCE_NAME | grep -v grep | awk {print $2}if[${tpid}];thenechoStop Process...kill-15$tpidfisleep5tpidps-ef|grep$RESOURCE_NAME|grep-vgrep|grep-vkill|awk{print $2}# tpidps -ef | grep $RESOURCE_NAME | grep -v grep | awk {print $2}if[${tpid}];thenechoKill Process!kill-9$tpidelseechoStop Success!fitpidps-ef|grep$RESOURCE_NAME|grep-vgrep|grep-vkill|awk{print $2}# tpidps -ef | grep $RESOURCE_NAME | grep -v grep | awk {print $2}if[${tpid}];thenechoApp is running.elseechoApp is NOT running.firm-ftpid# 创建日志文件、并赋予当前用户写权限rm-f$LOG_FILEtouch$LOG_FILEchmodw$LOG_FILE# 阻止jenkins杀死项目进程exportBUILD_IDdontKillMe# 后台启动项目nohupjava-jar/usr/project/$RESOURCE_NAME$LOG_FILE21echo$!tpidechoStart Success授予执行权限chomod x /root/start.sh点击项目名点击配置找到 Post Steps添加一个step选择执行 shell在输入框中通过指令调用脚本然后保存或者直接将脚本填写到这里也行构建项目查看日志信息成功如下所示piplinepipline运行在jenkins 2.X版本的核心插件Pipline就是一套运行于Jenkins上的工作流框架将原本独立运行于单个或者多个节点的任务连接起来实现单个任务难以完成的复杂发布流程从而实现单个任务很难实现的复杂流程编排和任务可视化。之前采用的都是Jenkins的自由风格每个流程都要通过不同的方式设置并且构建过程中整体流程时不可见的无法确认每个流程花费的时间同时不方便问题的定位。流水线的优势**可持续性**jenkins的重启或者中断后不影响已经执行的Pipline Job支持暂停pipline可以选择停止并等待人工输入或批准后再继续执行。可扩展性通过groovy的编程更容易的扩展插件。并行执行通过groovy脚本可以实现stepstage间的并行执行,提高构建效率。Jenkins的Pipeline可以让项目的发布整体流程可视化明确执行的阶段快速定位问题。让整个项目的生命周期可以通过一个Jenkinsfile文件管理而且Jenkinsfile文件是可以放在项目中维护。流水线的分类及对比pipline流水线分为脚本式流水线与声明式流水线语法差异声明式的在pipline {}块中定义脚本式直接以node开始脚本式的在一台节点执行所有操作而声明式可以将不同的节点定义到不同的节点执行。声明式比脚本式的写法更复杂但功能更强大目前主要使用声明式较多脚本式流水线Groovy脚本基本语法hello worldpipeline{agent any stages{stage(Hello){steps{echoHello World}}}}pipeline {} : 所有脚本命令包含在pipeline{}中agent any : 指定任务在哪个节点执行Jenkins支持分布式stages 任务合集可以指定多个任务stage任务steps实现任务的具体流程// 所有脚本命令包含在pipeline{}中pipeline{// 指定任务在哪个节点执行Jenkins支持分布式agent any// 配置全局环境指定变量名变量值信息environment{host192.168.150.135}// 存放所有任务的合集stages{// 单个任务stage(pull code){// 实现任务的具体流程steps{echogit拉取代码}}// 单个任务stage(build project){// 实现任务的具体流程steps{echoMaven打包项目}}// 单个任务stage(run project){// 实现任务的具体流程steps{echo部署项目}}// ……}}拉取Git代码通过流水线语法生成Checkout代码脚本在项目首页找到流水线语法选项点击判断生成器选择从版本控制器拉取代码填写仓库地址和凭证选择要拉取的分支然后点击生成流水线脚本就可以在下面的文本框中看到生成的脚本了复制填入到脚本中即可构建代码通过脚本执行mvn的构建命令shmvn clean package -DskipTests部署项目#!/bin/bash# 拷贝文件cp/var/lib/jenkins/workspace/pipline-test/target/springsecurity-2-0.0.1-SNAPSHOT.jar /usr/project# 变量保存jar包名RESOURCE_NAMEspringsecurity-2-0.0.1-SNAPSHOT.jarLOG_FILE/usr/project/nohup.out# 获取原进程idtpidps-ef|grep$RESOURCE_NAME|grep-vgrep|grep-vkill|awk{print $2}# tpidps -ef | grep $RESOURCE_NAME | grep -v grep | awk {print $2}if[${tpid}];thenechoStop Process...kill-15$tpidfisleep5tpidps-ef|grep$RESOURCE_NAME|grep-vgrep|grep-vkill|awk{print $2}# tpidps -ef | grep $RESOURCE_NAME | grep -v grep | awk {print $2}if[${tpid}];thenechoKill Process!kill-9$tpidelseechoStop Success!fitpidps-ef|grep$RESOURCE_NAME|grep-vgrep|grep-vkill|awk{print $2}# tpidps -ef | grep $RESOURCE_NAME | grep -v grep | awk {print $2}if[${tpid}];thenechoApp is running.elseechoApp is NOT running.firm-ftpid# 创建日志文件、并赋予当前用户写权限rm-f$LOG_FILEtouch$LOG_FILEchmodw$LOG_FILE# 阻止jenkins杀死项目进程exportBUILD_IDdontKillMe# 后台启动项目nohupjava-jar/usr/project/$RESOURCE_NAME$LOG_FILE21echo$!tpidechoStart Successstage(Copy file){steps{shcp /var/lib/jenkins/workspace/pipline-test/target/springsecurity-2-0.0.1-SNAPSHOT.jar /usr/project}}stage(Stop process){steps{script{defresourceNamespringsecurity-2-0.0.1-SNAPSHOT.jardeflogFile/usr/project/nohup.outdeftpidsh(script:ps -ef | grep$resourceName| grep -v grep | awk {print \\$2},returnStdout:true).trim()if(tpid){echoStop Process...shkill -15$tpid}shsleep 5tpidsh(script:ps -ef | grep$resourceName| grep -v grep | awk {print \\$2},returnStdout:true).trim()if(tpid){echoKill Process!shkill -9$tpid}else{echoStop Success!}tpidsh(script:ps -ef | grep$resourceName| grep -v grep | awk {print \\$2},returnStdout:true).trim()if(tpid){echoApp is running.}else{echoApp is NOT running.}shrm -f tpidshrm -f $logFileshtouch $logFileshchmod w $logFileenv.BUILD_IDdontKillMe}}}stage(Start process){steps{shnohup java -jar /usr/project/springsecurity-2-0.0.1-SNAPSHOT.jar /usr/project/nohup.out 21 shecho $! tpidechoStart Success}}// 所有脚本命令包含在pipeline{}中 pipeline{// 指定任务在哪个节点执行Jenkins支持分布式 agent any // 配置全局环境指定变量名变量值信息 environment{host192.168.150.135}// 存放所有任务的合集 stages{// 单个任务 stage(pull code){// 实现任务的具体流程 steps{echogit拉取代码checkout scmGit(branches:[[name:*/dev]], extensions:[], userRemoteConfigs:[[credentialsId:33b55da2-0cc6-4783-bbbc-1af279e923a2, url:https://gitee.com/java-108/security2.git]])}}// 单个任务 stage(build project){// 实现任务的具体流程 steps{echoMaven打包项目shmvn clean package -DskipTests}}stage(Copy file){steps{shcp /var/lib/jenkins/workspace/pipline-test/target/springsecurity-2-0.0.1-SNAPSHOT.jar /usr/project}}stage(Stop process){steps{script{def resourceNamespringsecurity-2-0.0.1-SNAPSHOT.jardef logFile/usr/project/nohup.outdef tpidsh(script:ps -ef | grep $resourceName | grep -v grep | awk {print \\$2}, returnStdout:true).trim()if(tpid){echoStop Process...shkill -15 $tpid}shsleep 5tpidsh(script:ps -ef | grep $resourceName | grep -v grep | awk {print \\$2}, returnStdout:true).trim()if(tpid){echoKill Process!shkill -9$tpid}else{echoStop Success!}tpidsh(script:ps -ef | grep $resourceName | grep -v grep | awk {print \\$2}, returnStdout:true).trim()if(tpid){echoApp is running.}else{echoApp is NOT running.}shrm -f tpidshrm -f /usr/project/nohup.outshtouch /usr/project/nohup.outshchmod w /usr/project/nohup.out}}}stage(Start process){steps{env.BUILD_IDdontKillMeshnohup java -jar /usr/project/springsecurity-2-0.0.1-SNAPSHOT.jar /usr/project/nohup.out 21 shecho $! tpidechoStart Success}}}}sh/root/start.shSSH手动安装插件以安装Credentials Binding为例插件商店地址https://plugins.jenkins.io/输入框输入要安装的插件名字点击搜索搜索到之后点击卡片点击How to install获取安装说明在弹出框中可以看到3种安装方式上图中是三种下载插件的方式第一种就是插件商店但是我们此时的需求插件商店没有那么我们就需要使用另外两种下载插件的方式。方法二是命令工具jenkins-plugin-cli是一个较新的工具可能只在Jenkins 2.222及以上版本中提供。该命令不可用的原因还可能是安装方式不同不在系统的PATH环境变量中。方法三就是通过连接下载部署的方式。下面就是使用第三种方式安装点击releases复制下载链接https://updates.jenkins.io/download/plugins/credentials-binding/681.vf91669a_32e45/credentials-binding.hpi在Jenkins的插件管理中填写链接点击部署即可