乐趣区

关于持续集成:别当工具人了手摸手教会你-Jenkins

大家好,我是小菜,一个渴望在互联网行业做到蔡不菜的小菜。可柔可刚,点赞则柔,白嫖则刚!死鬼~ 看完记得给我来个三连哦!

本文次要介绍 Jenkins

如有须要,能够参考

如有帮忙,不忘 点赞

微信公众号已开启,小菜良记,没关注的同学们记得关注哦!

“唉,每天提交完代码都得本人打包再部署到测试环境和开发环境,好麻烦啊!都快变成运维了”

“啊?哦!的确,每天打包部署的确都成为了工具人了”

一段简白的对话疾速的隐灭在办公室中,却引发了我的思考,“这么麻烦的过程必定曾经有了很好的解决方案,毕竟程序员是 面向懈怠编程 ,本人对 Jenkins 这个工具有所耳闻曾经很久了,看来明天得对它 下手 了”

说干就干,明天咱们就来求索一下 JenKins,看完你无妨也给你们我的项目整一个,给本人多减少点 划水 的工夫!

读前须知: 本文较长,从装置到应用,一步步带你超神!

微信公众号关注: [小菜良记],带你领略技术风骚!

一、Jenkins 是什么

Jenkins 是一个 开源软件 我的项目,是基于 java 开发的一种 继续集成 工具,用于监控继续反复的工作,旨在提供一个凋谢易用的软件平台,使软件的继续集成变成可能。

简略来说,它就是一个 继续集成 的工具!

1. 继续集成

继续集成(Continuous Integration),简称 CI。频繁地将代码集成到骨干之前,必须通过自动化测试,只有有一个测试用例失败,就不能集成。通过继续集成,团队能够疾速从一个性能到另外一个性能。

益处:

  • 升高危险,因为继续集成一直去构建,编译和测试,能够很早发现问题
  • 缩小重复性的工作
  • 继续部署,提供可部署单元包
  • 继续交付可供使用的版本

2. Jenkins 继续集成

咱们先通过这张图来看到 Jenkins 在其中起到的作用:

  • 首先,开发人员将代码提交到 Git 仓库
  • 而后 Jenkins 应用 Git 插件来拉取 Git 仓库的代码,而后配合 JDK、Maven 等软件实现代码编译,测试、审查、、测试和打包等工作
  • 最初 Jenkins 将生成的 jar/war 推送到 测试 / 生产 服务器,供用户拜访

整套步骤下来,作为开发人员咱们只须要提交下代码,剩下的工作都交给了 Jenkins,真是美滋滋,怎么没有早点上这个工具的车!

二、Jenkins 装置

磨刀不误砍柴工,没刀的状况下说再多都是虚的。咱们就先来看下 Jenkins 是如何装置的吧!

1. 装置 JDK

因为 Jenkinsjava 写的,所以要运行起来必须要配置 java 运行环境。这里就不赘诉 JDK 的装置过程了

2. 下载安装 Jenkins

  • 下载

咱们能够进入下载页面抉择咱们要装置的版本:下载地址,咱们这里应用的版本是:jenkins-2.190.3-1.1.noarch.rpm

  • 装置

而后把下载好的 rpm 包上传到咱们的服务器,通过 rpm -ivh jenkins-2.190.3-1.1.noarch.rpm 进行装置,而后编辑 etc 目录下的 jenkins 配置文件:vim /etc/sysconfig/jenkins,须要改的中央如下(也能够抉择不改):

 JENKINS_USER=”root”
 JENKINS_PORT=”8888″

  • 启动

systemctl start jenkins

  • 拜访

通过浏览器拜访 http:// 服务器 IP:8888/,看到以下页面阐明启动胜利了

而后咱们在服务器上从指定文件中获取明码,进行下一步。

这一步咱们能够先跳过插件装置,因为 Jenkins 插件须要连贯默认官网下载,速度十分慢:

而后咱们增加一个管理员账号来治理:

看到以下页面就阐明设置胜利了:

微信公众号关注:小菜良记,带你领略技术风骚!

三、Jenkins 应用

1. 插件减速

工欲善其事,必先利其器

贴心的小菜是不会让你蒙受期待的苦楚的,首先咱们进入 Jenkins -> Manage Jenkins -> Manage Plugins,点击 install

而后咱们在装置 Jenkins 的服务器上进入 /var/lib/jenkins/updates 目录,能够看到有个 default.json 文件,第一步:咱们须要替换外面的局部字段,输出命令如下:

 sudo sed -i ‘s#updates.jenkins.io/download/plugins#mirrors.tuna.tsinghua.edu.cn/jenkins/plugins#g’ default.json && sudo sed -i ‘s#www.google.com#www.baidu.com#g’ default.json

第二步:咱们进入到 /var/lib/jenkins目录,编辑 hudson.model.UpdateCenter.xm,将外面的 https://updates.jenkins.io/update-center.json批改为 http://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

最初一步: 输出以下命令进行重启 Jenkins

 systemctl restart jenkins

通过以上步骤,咱们就能够欢快的装置插件了!

2. 用户治理

Jenkins 中咱们也能够进行用户权限治理,这个时候咱们须要借助插件 Role-based Authorization Strategy

  • 首先装置 Role-based Authorization Strategy 插件

  • 开启全局平安配置

将受权策略切换为 "Role-Based Strategy"

  • 创立用户

更改完受权策略,咱们就能够来创立用户了,进入系统管理页面中的Manage Users

这里咱们创立了两个用户,别离是 cbuc1cbuc2

  • 创立角色

创立好用户,咱们就能够来创立角色了,在系统管理页面进入 Manage and Assign Roles

角色次要分为 Global roles(全局角色)Item roles(我的项目角色)

Global roles(全局角色): 管理员等高级用户能够创立基于全局的角色

Item roles(我的项目角色): 针对某个或者某些我的项目的角色

咱们零碎当初曾经存在了两个用户,而后咱们就能够给这两个用户绑定对应的角色

3. 凭证治理

什么是凭证呢?凭证 能够用来存储须要密文爱护的数据库明码,GitLab 明码信息,Docker 公有仓库的登录明码。保留了这些信息后,Jenkins 就能够和这些第三方的利用进行交互。当然,这还是得借助 Jenkins 的插件!

1)装置

首先装置 Credentials Binding 插件

装置好插件后,在零碎首要的菜单栏中就会多了个 凭证 菜单

点击进去,咱们能够看到能够增加的凭证有 5 种:

  1. Username with password:用户名和明码
  2. SSH Username with private key: 应用 SSH 用户和密钥
  3. Secret file: 须要窃密的文本文件,应用时 Jenkins 会将文件复制到一个长期目录中,再将文件门路设置到一个变量中,等构建完结后,所复制的 Secret file 就会被删除
  4. Secret text: 须要保留的一个加密的文本串,如钉钉机器人或 GitHubapi token
  5. Certificate: 通过上传证书文件的形式

咱们平时比拟罕用的类型为:Username with passwordSSH Username with private key

2)Git 凭证治理

咱们如果要应用 JenkinsGitLab 拉取我的项目代码,咱们就得应用凭证来验证。

  • 装置 Git 插件

咱们须要在 Jenkins 中装置 Git 插件 来拉取我的项目代码

而后咱们在服务器上也须要装置 Git 工具

 # 装置命令
 yum install git -y
 # 验证命令
 git –version

1. 形式 1:用户明码类型

咱们能够应用 用户明码 登录后拉取我的项目代码,这个时候咱们须要用到 凭证的 Username with password 类型

创立胜利咱们就能够测试是否可用,咱们先创立一个 FreeStyle 我的项目

而后在 GitLab 中复制咱们我的项目的 URL

Credentials 中抉择咱们刚刚创立的凭证,保留配置后,咱们点击 Build Now 来构建我的项目:

这个时候在控制台能够看到输入

而后在进入服务器的 /var/lib/jenkins/workspace 目录中看到咱们拉取的我的项目:

阐明咱们曾经胜利应用 用户明码 凭证模式拉取到 Git 我的项目了

2. 形式 2:SSH 密钥类型

除了用账号密码形式来验证 Git,咱们还能够用 SSH 密钥 来验证,步骤流程如下:

从图上咱们能够得悉,第一步须要生成 公私钥,咱们在 Jenkins 服务器 上输出以下指令生成:

ssh-keygen -t rsa 输出指令后,一路回车,便可在 /root/.ssh/ 目录下生成公私钥:

  • id_rsa:私钥文件
  • id_rsa.pub:公钥文件

而后咱们把生成的公钥放在 GitLab 中,root 账户登录 -> 点击头像 ->Settings->SSH Keys,复制 id_rsa.pub 中的内容,点击 “Add key”

而后咱们再回到 Jenkins 零碎页面中增加凭证,抉择 SSH Username with private key,把刚刚生成的公有文件内容复制过去

增加后就会生成一条凭证

创立胜利咱们就能够测试是否可用,咱们先创立一个 FreeStyle 我的项目

而后在 GitLab 中复制咱们我的项目的 URL

Credentials 中抉择咱们刚刚创立的凭证,保留配置后,咱们点击 Build Now 来构建我的项目:

这个时候在控制台能够看到输入

而后在进入服务器的 /var/lib/jenkins/workspace 目录中看到咱们拉取的我的项目:

阐明咱们曾经胜利应用 SSH Username with private key 凭证模式拉取到 Git 我的项目了

4. 项目管理

1)Maven 装置

咱们当初开发中的我的项目大部分都是 Maven 我的项目,应用 Maven 我的项目,咱们就须要进行 依赖治理,因而咱们该当在服务器上安装 Maven 来下载我的项目依赖。

  • 装置 Maven

咱们能够从 Maven 官网上下载压缩包,而后上传到服务器上进行解压

tar -xzf apache-maven-3.6.0-bin.tar.gz

  • 配置环境变量

vim /etc/profile

 export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
 export MAVEN_HOME=/home/maven/apache-maven-3.6.2
 export PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin

编辑后使配置文件失效:

 source /etc/profile

验证:

 mvn -v

而后设置 Mavensettings.xml

 # 创立本地仓库目录
 mkdir /data/localRepo
 vim /home/maven/apache-maven-3.6.2/conf/settings.xml

将本地仓库改为:/root/repo/

增加阿里云私服地址:alimaven aliyun maven http://maven.aliyun.com/nexus/content/groups/public/ central

  • Jenkins 配置

Jenkins 咱们也须要配置 JDKMaven 的关联.

进入 Jenkins -> Global Tool Configuration -> JDK

进入 Jenkins -> Global Tool Configuration -> Maven

增加全局变量

进入Manage Jenkins->Configure System->Global Properties,增加三个全局变量

JAVA_HOME、M2_HOME、PATH+EXTRA

而后咱们进入我的项目中点击 configure

而后增加 shell 执行脚本:

保留后从新构建,查看控制台,能够看到 mvn 构建胜利:

2)war 包部署

如果咱们的我的项目是打成 war 包的模式,那么咱们须要借助 tomcat 容器来运行,那么咱们首先便是要先装置一个 tomcat

Tomcat 装置

咱们将当时下载好的 Tomcat 安装包上传到服务器上,通过 tar -xzf apache-tomcat-8.5.47.tar.gz 解压,而后运行 bin目录下的 start.sh启动 Tomcat,看到以下后果则阐明启动胜利:

下一步咱们须要配置 Tomcat 用户角色权限,默认状况下 Tomcat 是没有配置用户角色权限的

首先咱们须要批改 tomcat/conf/tomcat-users.xml 文件:

(复制)内容如下:

 <role rolename="tomcat"/>
 <role rolename="role1"/>
 <role rolename="manager-script"/>
 <role rolename="manager-gui"/>
 <role rolename="manager-status"/>
 <role rolename="admin-gui"/>
 <role rolename="admin-script"/>
 <user username="tomcat" password="tomcat" roles="manager-gui,manager-script,tomcat,admin-gui,admin-script"/>

而后批改 /tomcat/webapps/manager/META-INF/context.xml 文件,将以下内容正文:

而后进入tomcat 页面,点击进入:

账号密码都是 tomcat

胜利页面如下:

这样子咱们就实现了 tomcat 的装置,而后接下来就能够进行部署了

Tomcat 部署
  • jenkins 中装置 Deploy to container 插件
  • 增加 Tomcat 凭证

  • 构建配置

在我的项目的 configure 中配置

而后点击构建,查看控制台输入:

显示曾经部署胜利,而后拜访我的项目页面,能够看到 war 包我的项目部署胜利:

3)jar 包部署

下面说完了 war 包我的项目是如何部署的,然而咱们当初我的项目用到比拟多的还是 SpringBoot,这个时候打进去的是 jar 类型,然而 SpringBoot 外面内置了 tomcat 容器,这样子咱们就不须要借助内部 tomcat 容器的应用了。

  • 首先咱们在 Jenkins 中下载 Maven 插件,这个时候新建我的项目的时候会有个 Maven 我的项目的选项

而后在我的项目的 configure 中作如下配置:

Repository URL:库地址 Credentials:凭证 Branch Specifier (blank for‘any’):分支

Run only if build succeeds:在构建胜利时执行后续步骤 Add post-build step:增加构建后的步骤 Send files or execute commands over SSH:通过 ssh 发送文件或执行命令

  • 装置 Publish Over SSH 插件

因为咱们要部署的服务器与 Jenkins 不在同一个服务器上,所以咱们须要这个插件来近程部署

装置好插件后咱们须要先配置近程服务器,在 Jenkins 服务器上输出 ssh-copy-id 近程服务器 IP 将公钥拷贝到近程服务器上,而后在 Jenkins 系统配置中增加服务器信息,如下:

实现以上步骤后,咱们就能够回到我的项目的 configure 中增加咱们刚刚配置的服务器信息:

Name:SSH Servers 中配置的服务器 Source files:源文件 Remove prefix:删除前缀 Remote directory:上传到服务器的目录 Exec command:执行的脚本

实现以上步骤,咱们就能够欢快的点击 Build Now 了!

4)流水线我的项目

Jenkins 中主动构建我的项目的类型有很多,罕用的有以下三种:

  • 自在格调软件我的项目(FreeStyle Project)
  • Maven 我的项目(Maven Project)
  • 流水线我的项目(Pipeline Project)

每种类型的构建其实都能够实现一样的构建过程与后果,只是在操作形式、灵便度等方面有所区别,其中流水线类型灵便度比拟高,其余两种类型咱们在下面的例子中都曾经尝试过了,上面咱们就来介绍如何构建流水线我的项目。

1. 概念

Pipeline 就是一套运行在 Jenkins 上的工作流框架,将原来独立运行与单个或者多个节点的工作连接起来,实现单个工作难以完成的简单流程编排和可视化工作

2. 长处
  • 代码Pipeline 以代码的模式实现,通常被检入源代码管制,使团队可能编辑,审查和迭代其传送流程。
  • 持久性: 无论是打算内的还是计划外的服务器重启,Pipeline 都是可复原的
  • 可进行: Pipeline 可接管交互式输出,以确定是否继续执行 Pipeline
  • 多功能: Pipeline 反对事实世界中简单的继续交付要求,它反对 fork/join、循环执行、并行执行工作的性能
  • 可扩大: Pipeline 插件反对其 DSL 的自定义扩大,以及与其余插件集成的多个选项
3. 创立

创立 Pipeline 我的项目之前咱们须要装置 Pipeline 插件:

而后在创立我的项目的时候便会多了 Pipeline 类型:

抉择好我的项目类型之后咱们就能够在我的项目中的 configure 进行配置了:

  • 首先老样子配置好 git 地址,跟下面一样,这里不多作赘诉
  • 而后配置 Pipeline 脚本

Pipeline 我的项目是对立通过 Pipeline 脚本来治理,这样也更好的进步灵活性

Hello World 模板:

 pipeline {
  agent any
  stages {
  stage(‘Hello’) {
  steps {
  echo ‘Hello World’
  }
  }
  }
 }

stages: 代表整个流水线的所有执行阶段,通常 stages 只有 1 个,外面蕴含多个 stage

stage: 代表一个阶段内须要执行的逻辑,steps 外面是 shell 脚本,git 拉取代码,ssh 近程公布等任意内容

申明式 Pipeline 模板:

 pipeline {
  agent any
  stages {stage('拉取代码') {
          steps {echo '拉取代码'}
      }
      stage('编译构建') {
          steps {echo '编译构建'}
      }
      stage('我的项目部署') {
          steps {echo '我的项目部署'}
      }
  }
}

你也齐全不必放心不会书写 Pipeline 脚本,咱们能够点击 [Pipeline Syntax] 跳转到 Pipeline 代码生成页面

书写好脚本后点击构建,能够看到整个构建过程:

如果咱们须要部署到不同环境,比方生产环境和开发环境,咱们还能够在我的项目的 configure 中进行配置:

  • 首先须要装置 Extended Choice Parameter 插件
  • 而后在配置中增加 Extended Choice Parameter 参数

实现以上配置后,点击保留,这个时候咱们就能够在构建的时候抉择须要部署的服务器了

而后咱们就能够从 Pipeline 脚本中读取咱们抉择的参数,贴上该项目标构建脚本,如下:

 node {
  //git 凭证 ID
  def git_auth = "7fdb3fa3-74eb-4862-b36f-c03701f71250"
  //git 的 url 地址
  def git_url = "git@192.168.100.131:cbuc_group/cbuc_web.git"
  // 获取以后抉择的服务器名称
  def selectedServers = "${publish_server}".split(",")
 ​
      stage('开始拉取代码') {checkout([$class: 'GitSCM', branches: [[name: '*/v3.0']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: git_auth, url: git_url]]])
      }
      stage('开始打包') {sh "mvn -Dmaven.test.skip=true clean package"}
      stage('开始近程部署') {
          // 遍历所有服务器,别离部署
          for(int j=0;j<selectedServers.length;j++){
          // 获取以后遍历的服务器名称
          def currentServerName = selectedServers[j]
          // 生产环境部署目录
          def pro_address = "/home/pro/java"
          // 开发环境部署目录
          def dev_address = "/home/dev/java"
         ​
          // 依据不同的 profile 来部署服务器
          if(currentServerName=="pro"){sshPublisher(publishers: [sshPublisherDesc(configName: 'pro_server', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand:'sh build.sh', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator:'[,]+', remoteDirectory: pro_address, remoteDirectorySDF: false, removePrefix:'target', sourceFiles:'target/cbuc_web-0.0.1-SNAPSHOT.jar')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
          }else if(currentServerName=="dev"){sshPublisher(publishers: [sshPublisherDesc(configName: 'dev_server', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand:"sh build.sh", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator:'[,]+', remoteDirectory: dev_address, remoteDirectorySDF: false, removePrefix:'target', sourceFiles:'target/cbuc_web-0.0.1-SNAPSHOT.jar')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
      }
    }
  }
}

还有一种状况就是如果部署 Jenkins 的服务器宕机了,这个时候就会失落 Pipeline 脚本文件,从新书写是一件很麻烦的事件,那么咱们就能够将脚本文件放到咱们的我的项目的根目录下,而后在 configure 中配置 Pipeline 脚本文件的地位:

而后咱们点击构建,能够看到后果也是胜利的:

5)构建触发器

下面咱们讲完了几种我的项目的构建形式,其中都是通过手动点击构建进行构建的,咱们也能够通过触发器来构建

罕用的有:

1. Build After Other Projects Are Built

其余工程构建后触发。在选项中填写咱们关注的我的项目,其中也反对 3 个抉择以供选择:

Trigger only if build is stable: 仅在我的项目稳固构建时执行

Trigger even if the build is unstable: 即便我的项目构建不稳固也执行

Trigger even if the build fails: 即便我的项目构建失败也执行

2. Build Periodically

定时构建。语法类型如 cron 表达式,定时字符串从左往右别离为:分 时 日 月 周

3. Poll SCM

轮询 SCM。指定工夫扫描本地代码仓库的代码是否有变更,如果代码有变更就触发我的项目构建。

4. Trigger builds remotely

近程触发构建。通过应用咱们定义的密钥,而后拜访构建地址:http://192.168.100.131:8888/job/test01/build?token=123123

5. 主动触发构建

方才咱们看到在 Jenkins 的内置构建触发器中,轮询 SCM能够实现 Gitlab 代码更新,我的项目主动构建,然而该计划的性能不佳。那有没有更好的计划呢?有的。就是利用 Gitlabwebhook实现代码 push 到仓库,立刻触发我的项目主动构建。

实现主动触发构建咱们须要在 Jenkins 装置插件:GitLab HookGitLab

而后咱们在 Build Trigger 中就能够看到多了一个选项:

复制这串 WebHook 地址,跟着到 GitLab 页面进行设置:

门路步骤:Admin Area -> Settings -> Network

而后咱们在对应的我的项目中进行设置:

最初再回到 Jenkins 页面中做以下配置:Manage Jenkins->Configure System

做完以上配置,咱们就能够欢快的代码进行主动触发构建了!

END

这篇文章较长,都是满满的干货,从装置到应用,一步步带你入 运维 的坑,学完这篇快给你的我的项目用上吧!路漫漫,小菜与你一起求索!

明天的你多致力一点,今天的你就能少说一句求人的话!

我是小菜,一个和你一起学习的男人。 ????

微信公众号已开启,小菜良记,没关注的同学们记得关注哦!

退出移动版