Jenkins自动化部署-教程

1 Jenkins介绍

1.1 软件开发周期

  • 需求分析
  • 设计
  • 实现
  • 测试
  • 进化
  • 维护

1.2 持续集成

  • 英文是 continuous integration,简称CI
  • 持续集成是指频繁的将代码集成到项目主干上去
  • 目的是让产品快速的迭代,同时保持高质量

1.2.1 持续集成步骤

  • 提交
  • 测试(第一轮)
  • 构建
  • 测试(第二轮)
  • 部署
  • 回滚

1.2.2 组成要素

  • 自动构建
  • 代码存储库
  • 集成服务器

1.3 Jenkins

  • Jenkins是一个开源的持续集成工具

2 Jenkins安装和持续集成环境配置

2.1 集成流程

  • 代码提交到git仓库
  • Jenkins将代码拉取到集成服务器,完成编译、打包等工作
  • Jenkins将打包好的jar包部署到生产/测试服务器

2.2 Jenkins安装

2.2.1 安装jdk

Jenkins依赖依赖JDK,所以需要先安装JDK

2.2.2 获取Jenkins安装包

2.2.3 上传到服务器,进行安装

 rpm -ivh Jenkins-2.190.3-1.1.noarch.rpm

2.2.4 修改Jenkins配置

2.2.4.1 centos

 vim /etc/sysconfig/jenkins

修改内容:

 JENKINS_USER="root"

 JENKINS_PORT="8888"

2.2.4.2 unbuntu

 vim /usr/lib/systemd/system/jenkins.service

修改内容:

 USER=root

 Environment="JENKINS_PORT=8888"

 vim /etc/default/jenkins

修改内容:

 JENKINS_USER="root"

 JENKINS_PORT="8888"

 vim /etc/init.d/jenkins

修改内容:

  • 修改do_start_cmd_override()函数中调用check_tcp_port()函数传入的端口号

 check_tcp_port “http” “$HTTP_PORT” “8888” || return 2

2.2.4.3 Jenkins

在以上修改完成后,记得在Jenkins - system manage - Jenkins location将Jenkins的URL地址修改为正确的端口号

2.2.5 启动Jenkins

 systemctl start jenkins

2.2.6 添加安全组/防火墙规则

2.2.7 访问Jenkins

打开浏览器访问:<服务器ip>:8888

2.2.8 跳过插件安装

Jenkins插件默认连接官网下载,速度很慢,经常失败

3 Jenkins插件安装

3.1 修改插件下载地址

  • Jenkins插件国外的下载地址很慢,修改为国内的
  • jenkins - manage jenkins - manage plugins
  • 点击available,等待插件列表加载完成
  • 修改地址文件,替换为国内地址
  •  cd /var/lib/jenkins/updates
  •  sed -i 's/http:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json && sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json
  • manage plugins中点击advanced,修改update site
  •  https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
  • 点击submit
  • 在浏览器输入:<服务器ip>:8888/restart,重启Jenkins

3.2 安装中文汉化插件

  • Jenkins - manage Jenkins - manage plugins
  • 点击available,搜索Chinese
  • 重启Jenkins,Jenkins汉化就完成了
  • 部分菜单汉化会失败

3.3 Jenkins权限管理插件

  • 安装role - based - authorization strategy 插件
  • 开启权限全局安全配置:manage Jenkins - configure global security
  • 授权策略切换为 role - based strategy,保存
  • 创建角色:manage Jenkins - manage and assign roles - manage roles
  • 三种角色:
  • global roles: 全局角色
  • project roles:项目角色
  • slave roles:节点角色
  • 新建全局角色
  • base Role - 分配read权限
  • 新建项目角色
  • roleName - 分配所有权限
  • pattern : 可管理的项目名表达式
  • 授予角色(在此之前需要新建好用户):manage Jenkins - manage and assign roles - assign roles

3.4 jenkins凭证管理插件

  • 安装credential binding插件
  • 安装完成后,主页菜单出现credentials

3.4.1 安装git插件

3.4.1.1 安装插件(略)

3.4.1.2 创建凭证

  • Jenkins - 凭证 - 系统 - 全局凭证 - 添加凭证

3.4.1.2.1 用户密码凭证

  • 使用用户密码凭证,在构建项目时仓库地址只能选择http或https

3.4.1.2.2 ssh密钥

  • 使用root用户生成公钥和私钥
  •  ssh-keygen -t rsa
  • 生成的公钥和私钥保存在/root/.ssh/目录下
  • id_rsa:私钥
  • id_rsa.pub:公钥
  • 把生成的公钥放在代码仓库(gitee、GitHub、gitlab)中
  • 登录代码仓库服务器 - settings - SSH keys
  • 将id_rsa.pub中的内容放到这里
  • 然后在Jenkins中添加私钥凭证
  • 将私钥的内容放到凭证中,用户名为创建公钥和私钥的用户(这里是root)
  • 此时构建项目时仓库地址需要选择ssh

3.4.2 jenkins服务器安装git工具

3.4.2.1 ubuntu

 apt-get install git

3.4.2.2 centos

 yum install git -y

4 maven安装

4.1 安装maven

4.1.1 ubuntu

 apt-get install maven

  • 检查是否安装成功:mvn -version
  • 默认安装路径:usr/share/maven

4.2 配置环境变量

  • 在/etc/profile.d目录下新建文件maven.sh
  •  vim /etc/profile.d/maven.sh # 不采用
  •  vim ~/.bashrc # 采用 root用户
  • 内容如下
  •  export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
  •  export M2_HOME=/usr/share/maven
  •  export MAVEN_HOME=/usr/share/maven
  •  export PATH=$JAVA_HOME/bin:$M2_HOME/bin:$PATH
  •  export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
  • 加载配置
  •  source ~/.bashrc

4.3 更换源和本地仓库地址

创建仓库目录

 mkdir /root/maven_repo

修改镜像和仓库地址

 vim $MAVEN_HOME/conf/settings.xml

添加仓库地址,镜像源地址

 <localRepository>/root/maven_repo</localRepository>

 <mirror>

   <id>alimaven</id>

   <name>aliyun maven</name>

      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>

   <mirrorOf>central</mirrorOf>

 </mirror>

4.4 Jenkins配置

  • Jenkins - global tool configuration
  • 配置JDK:JAVA_HOME填写Jenkins服务器上的JAVA_HOME路径即可
  • 配置maven:MAVEN_HOME填写Jenkins服务器上的MAVEN_HOME路径即可
  • 点击应用 - 保存
  • Jenkins - system configuration - global properties
  • 添加Jenkins全局环境变量
  • JAVA_HOME
  • M2_HOME
  • PATH+EXTRA : $M2_HOME/bin
  • 点击 应用 - 保存

5 jenkins构建maven项目

5.1 构建项目类型

  • FreeStyle Project:自由风格软件项目
  • Maven Project:Maven项目
  • Pipeline Project:流水线项目,灵活度非常高-推荐

所有的项目创建完成后都放在/var/lib/jenkins/workspace目录下

5.2 FreeStyle Project构建

  • 创建项目
  • 拉取代码
  • 源码管理 - git
  • 填好仓库地址和选择对应的凭证
  • 编译打包
  • 构建 - 添加构建步骤 - executor shell
  • 填入mvn clean package命令
  • 部署
  • 安装deploy to container插件
  • 回到配置 - 构建 - 增加构建后操作步骤 - deploy war/ear to a container
  • war/ear files:target/*war
  • context path:略
  • containers - tomcat 8.x remote
  • 添加凭证,tomcat所在服务器的一个用户+密码(可以专门创建一个用户来进行部署)
  • tomcat url:<tomcat所在服务器ip>:<tomcat端口号>

5.3 maven project构建

5.3.1 安装maven integration插件

5.3.2 构建项目

  • 创建项目
  • 拉取代码
  • 源码管理 - git
  • 填好仓库地址和选择对应的凭证
  • 编译打包
  • build
  • Root POM:选择pom文件的位置,项目相对路径
  • Goals and options:编译命令,默认使用mvn执行 - clean package这样填写就可以了
  • 部署
  • 使用deploy to container部署到生产服务器上
  • 如果Jenkins服务器和部署服务器是同一台服务器(个人项目)
  • 可以使用脚本
  • post steps - add post-build step - excitor shell
  • 添加下面内容
  •  cd /home/xaopng/apps # 打开脚本所在目录
  •  sh xiying # 执行脚本
  • 脚本内容(针对spring boot项目)
  •  #!/bin/bash
  •  # app=$1
  •  # port=$2
  •  app=xiying-1.0-SNAPSHOT # 打包后的jar包名
  •  port=8080 # 项目端口号
  •  path=/home/xaopng/apps # jar包存放的位置,需要编译好的jar包移动到此目录
  •  echo this is app : $app
  •  echo port : $port
  •  #若项目已启动,杀死旧进程
  •  api_pid=`ps -ef | grep "$app.jar" | grep -v grep | awk '{print $2}'`
  •  echo api_pid = $api_pid
  •  ​
  •  if [ "$api_pid" != "" ]; then
  •      echo kill api
  •      kill -9 $api_pid
  •  ​
  •      echo sleep 3s
  •      sleep 1
  •      echo sleep 2s
  •      sleep 1
  •      echo sleep 1s
  •      sleep 1
  •  fi
  •  ​
  •  rm -rf $path/$app.jar
  •  rm -rf $path/nohup.out
  •  #将jar包从jenkins工作空间中移动到指定路径下
  •  mv /var/lib/jenkins/workspace/xiying/target/$app.jar $path
  •  cd $path
  •  ​
  •  #防止进程被杀死
  •  BUILD_ID=dontKillMe
  •  #后台进程形式启动项目
  •  nohup java -jar -Dserver.port=$port -Xmx256m -Xms128m $app.jar &
  •  echo $app start success
  •  exit 0

6 构建触发器

6.1 Jenkins内置4种触发器

  • 触发远程构建:通过访问给定地址并在地址种携带token远程构建项目
  • 其他工程构建后触发
  • 定时构建
  • 轮询SCM

6.2 git hook自动触发构建

6.2.1 gitee

  • 安装gitee插件
  • 回到项目配置 - 构建触发器 - Gitee webhook 触发构建
  • 生成密码
  • 登录gitee,进入项目,管理 - webhooks
  • 填写Jenkins给的URL和生成的密码就可以了
  • 有些时候url端口号可能会给错,填写Jenkins启动的端口号就可以了

7 idea插件

7.1 idea安装Jenkins control plugin

  • 设置中配置好Jenkins服务器ip、Jenkins用户
  • jenkins用户的密码是Jenkins中生成API token,并不是用户密码

7.2 Jenkins开启csrf

7.2.1 jenkins 1.x

  • Jenkins - Configure Global Security
  • 取消”防止跨站点请求伪造“复选框

7.2.2 jenkins 2.x

7.2.2.1 centos

 vim /etc/sysconfig/jenkins

修改内容:

 JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true -Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true"

7.2.2.1 ubuntu

 vim /etc/default/jenkins

修改内容:

 JAVA_ARGS="-Djava.awt.headless=true -Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true"


0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
plaing
作者分享
#自我介绍# 大家好,我是幻梦。本科双非,目前在读研究生。本省四年,零零散散学习的Java的许多知识,自己感觉没有把知识系统的练习起来,也没有做项目,做项目的时候下不去手,也没有自己的idea,不知道做什么项目,对于自己没有掌握的知识比较恐惧应用的项目中去,目前在向很多人学习,望在未来能克服自己对未知的恐惧,做一个更好的自己。
4
用户中心bug-无法跳转欢迎页
19
day5 今日 - 域名备案✓ * 提交初审 * 博客文章详情✓ * 当前后端传递Long数据精度丢失时,可在字段上添加@JsonSerialize(using = ToStringSerializer.class) 注解 * 即时聊天✕ * [ 最佳买卖股票时机含冷冻期](https://www.programmercarl.com/0309.最佳买卖股票时机含冷冻期.html#_309-最佳买卖股票时机含冷冻期)✓ - [动规周总结](https://www.programmercarl.com/周总结/20210304动规周末总结.html) ✓ * [买卖股票的最佳时机含手续费](https://www.programmercarl.com/0714.买卖股票的最佳时机含手续费(动态规划).html#_714-买卖股票的最佳时机含手续费)✓ * java技术核心卷20页✓ * 女孩别怕一章✓ * 牛客50题✓ * 用户中心末✕ * [mysql](https://www.bilibili.com/video/BV1Vy4y1z7EX)✓ * 跑步 明日 - [使用线程池更新阅读次数](https://www.bilibili.com/video/BV1Gb4y1d7zb?p=19&spm_id_from=pageDriver) * [ mysql](https://www.bilibili.com/video/BV1Vy4y1z7EX?p=22&spm_id_from=pageDriver) * [最长递增子序列](https://www.programmercarl.com/0300.最长上升子序列.html#_300-最长递增子序列) * [最长连续递增序列](https://www.programmercarl.com/0674.最长连续递增序列.html#_674-最长连续递增序列) * java技术核心卷20页 * 女孩别怕一章 * 用户中心末 * 即时聊天
13
day4 今日 * 牛客50题✓ * 女孩别怕一章✓ * 博客登录拦截器✓ * cdn加速✓ - gitlab服务器搭建直播回放下✓ * 前端监控系统 * 作用 * 监控系统正常运行 * 帮助排除bug * 帮助感知问题,防止用户流失 * * java技术核心卷20页✓ * [买卖股票的最佳时机III](https://www.programmercarl.com/0123.买卖股票的最佳时机III.html#_123-买卖股票的最佳时机iii)✓ * [买卖股票的最佳时机IV](https://www.programmercarl.com/0188.买卖股票的最佳时机IV.html#_188-买卖股票的最佳时机iv)✓ * 收藏列表返回值错误✓ * 分页总数返回错误✓ * 通过mapper查询到的实体对象,要和放到PageInfo里的一致才能正确显示记录总数 明日 - 域名备案 * 博客文章详情 * 即时聊天 * [ 最佳买卖股票时机含冷冻期](https://www.programmercarl.com/0309.最佳买卖股票时机含冷冻期.html#_309-最佳买卖股票时机含冷冻期) - [动规周总结](https://www.programmercarl.com/周总结/20210304动规周末总结.html)  * [买卖股票的最佳时机含手续费](https://www.programmercarl.com/0714.买卖股票的最佳时机含手续费(动态规划).html#_714-买卖股票的最佳时机含手续费) * java技术核心卷20页 * 女孩别怕一章 * 牛客50题 * 用户中心末 * [mysql](https://www.bilibili.com/video/BV1Vy4y1z7EX)
17
day3 今日 - [ 买卖股票的最佳时机](https://www.programmercarl.com/0121.买卖股票的最佳时机.html#_121-买卖股票的最佳时机)✓ - [ 买卖股票的最佳时机II](https://www.programmercarl.com/0122.买卖股票的最佳时机II(动态规划).html#_122-买卖股票的最佳时机ii)✓ * 牛客50题✓ * 女孩别怕一章✓ * 码神博客登录功能✓ * 博客注册✓ * java技术核心卷20页✓ * 服务器搭建直播回放上✓ * CDN加速✕ * 开题报告✓ * 放开获取用户发布帖子列表接口✓ 明日 * 牛客50题 * 女孩别怕一章 * 博客登录拦截器 * cdn加速 * 域名备案 * gitlab服务器搭建直播回放下 * java技术核心卷20页 * 算法题两道 我记得发了day2的呀[尴尬]
14
下载 APP