二丫讲梵 二丫讲梵
首页
  • 最佳实践
  • 迎刃而解
  • Nginx
  • Php
  • Zabbix
  • AWS
  • Prometheus
  • Grafana
  • CentOS
  • Systemd
  • Docker
  • Rancher
  • Ansible
  • Ldap
  • Gitlab
  • GitHub
  • Etcd
  • Consul
  • RabbitMQ
  • Kafka
  • MySql
  • MongoDB
  • OpenVPN
  • KVM
  • VMware
  • Other
  • ELK
  • K8S
  • LLM
  • Nexus
  • Jenkins
  • 随写编年
  • 家人物语
  • 追忆青春
  • 父亲的朋友圈
  • 电影音乐
  • 效率工具
  • 博客相关
  • Shell
  • 前端实践
  • Vue学习笔记
  • Golang学习笔记
  • Golang编程技巧
  • 学习周刊
  • Obsidian插件周刊
关于
友链
  • 本站索引

    • 分类
    • 标签
    • 归档
  • 本站页面

    • 导航
    • 打赏
  • 我的工具

    • 备忘录清单 (opens new window)
    • json2go (opens new window)
    • gopher (opens new window)
    • 微信MD编辑 (opens new window)
    • 国内镜像 (opens new window)
    • 出口IP查询 (opens new window)
    • 代码高亮工具 (opens new window)
  • 外站页面

    • 开往 (opens new window)
    • ldapdoc (opens new window)
    • HowToStartOpenSource (opens new window)
    • vdoing-template (opens new window)
GitHub (opens new window)

二丫讲梵

行者常至,为者常成
首页
  • 最佳实践
  • 迎刃而解
  • Nginx
  • Php
  • Zabbix
  • AWS
  • Prometheus
  • Grafana
  • CentOS
  • Systemd
  • Docker
  • Rancher
  • Ansible
  • Ldap
  • Gitlab
  • GitHub
  • Etcd
  • Consul
  • RabbitMQ
  • Kafka
  • MySql
  • MongoDB
  • OpenVPN
  • KVM
  • VMware
  • Other
  • ELK
  • K8S
  • LLM
  • Nexus
  • Jenkins
  • 随写编年
  • 家人物语
  • 追忆青春
  • 父亲的朋友圈
  • 电影音乐
  • 效率工具
  • 博客相关
  • Shell
  • 前端实践
  • Vue学习笔记
  • Golang学习笔记
  • Golang编程技巧
  • 学习周刊
  • Obsidian插件周刊
关于
友链
  • 本站索引

    • 分类
    • 标签
    • 归档
  • 本站页面

    • 导航
    • 打赏
  • 我的工具

    • 备忘录清单 (opens new window)
    • json2go (opens new window)
    • gopher (opens new window)
    • 微信MD编辑 (opens new window)
    • 国内镜像 (opens new window)
    • 出口IP查询 (opens new window)
    • 代码高亮工具 (opens new window)
  • 外站页面

    • 开往 (opens new window)
    • ldapdoc (opens new window)
    • HowToStartOpenSource (opens new window)
    • vdoing-template (opens new window)
GitHub (opens new window)
  • Nexus系列文章

  • Jenkins系列文章

    • Jenkins入门系列笔记汇总整理
    • 前言与介绍
    • Jenkins初始部署与简单配置
    • Jenkins各配置选项介绍
    • Jenkins中一个项目的构建
      • 絮叨几句
        • 服务器配备:
        • 现在需要在要操作的服务器上做一些准备工作
      • 配置开始
    • Jenkins配置项目构建的钉钉通知
    • Jenkins忘记管理员密码怎么办
    • Jenkins与gitlab的交互探微
    • Jenkins根目录详解
    • Jenkins插件之显示构建时间
    • Jenkins插件之批量修改配置
    • Jenkins配置简单构建邮件推送
    • Jenkins复杂邮件推送配置详解
    • Jenkins配置复杂构建邮件推送
    • Jenkins构建安卓项目之前的一些唠叨
    • Jenkins构建安卓项目配置
    • Jenkins与Gitlab分支的交互
    • Jenkins构建nodejs项目
    • 使用docker部署Jenkins及初始配置
    • 配置gitlab提交代码Jenkins自动构建
    • Jenkins回滚方案探微
    • Jenkins角色控制(小黄锁)探微
    • Jenkins构建的应用配置问题解决探微
    • Jenkins构建中tag的应用
    • Jenkins插件之Ansicolor(神器)
    • 最基础核心的Jenkins功能部署一个java应用
    • Jenkins+sonar构建代码扫描
    • Jenkins+docker+gitlab将应用部署到docker
    • Jenkins参数化构建犀利插件Active-Choices-Plugin
    • 记一次将代码中参数外显到构建历史中的操作
    • Jenkins升级与迁移的经验分享
    • pipeline笔记之从一个简单的项目构建开始
    • Jenkinsfile声明式语法详解
    • 自动构建的原始配置以及pipeline中的用法
    • 多分支构建的实践与思考
    • 使用Jenkinsfile类前端项目的部署与回滚
    • 如何在Jenkinsfile中定义一个全局的时间戳变量
    • Jenkins中自由风格回滚方案的最佳实践
    • Jenkins中pipeline风格回滚方案的最佳实践
    • pipeline结合ansible剧本进行批量的部署与回滚配置
    • 最近配置安卓iOS打包本地化流程中一些值得记录的内容
    • pipeline中如何在environment环节声明一个含有通配符的变量
    • git-Parameter插件在pipeline共享库中的实践详解
    • jenkins作为ci检测代码是否合并的实践
    • 将Jenkins共享库的Jenkinsfile放到ci静态检测的实践
    • Jenkins的pipeline实践之GitSCM参数配置项详解
    • Jenkins中pipeline对接CMDB接口获取主机列表的发布实践
    • Jenkins有任务无法kill提示即将关闭
    • Jenkins基于Share Library共享库的最佳实践探索
    • Jenkins结合MySql Database插件的平台化实践思路
    • Jenkins-Groovy中三元表达式的用法
    • Jenkins-Groovy中Switch的高阶用法
    • Jenkins-pipeline之利用activity choice插件对接查询MySQL数据实现动态参数化的功能
    • CentOS通过yum快速安装Jenkins
    • Jenkins-pipeline语法之错误处理详解(文末有干货)
    • Jenkins常用插件汇总以及简单介绍
    • Jenkins所遇报错汇总及解决
    • Jenkins管理维护运维规范
  • ELK笔记

  • Kubernetes笔记

  • LLM专题

  • 系列专题
  • Jenkins系列文章
二丫讲梵
2018-03-24
目录

Jenkins中一个项目的构建

文章发布较早,内容可能过时,阅读注意甄别。

# 絮叨几句

在上一篇的文章当中,基本上准备工作都做好了,现在就来真刀真枪来进行项目的构建了,在做真正的项目构建之前,有一些简单的准备工作还是要做的。

我这里就用公司里边的 Java 项目,全程演示一遍怎么完成这里边的配置。而如果是其他的诸如前端啊,PHP 之类的项目,则就更简单了,ok,先来做一些准备工作。

# 服务器配备:

Jenkins 192.168.96.26
Gitlab 192.168.96.27
Nexus 192.168.96.28
MySQL 192.168.96.29
Test Tomcat 192.168.96.17

这个地方看似需要准备的挺多的,其实很多都是已经搞好了的。中间的三个基本上都是我们搭建好了之后,交付给开发人员或者 DBA 让他们进行操作,我们这里讲的,就只是对 Jenkins 以及另外一台上的 tomcat 之间的项目关系。

很多时候就是这样,把 Jenkins 作为单独的服务器,然后其他的服务器上,可能会有四到五台的 tomcat 来进行测试,这里模拟的就是这种测试环境,很多时候看到的网上的教程都是在 Jenkins 服务器本地直接进行的构建,其实都是一个道理,只要弄通了这整个流程的来龙去脉,能够抓住不变的东西,那么任凭其他的再怎么变,也都不足担心。

# 现在需要在要操作的服务器上做一些准备工作

  • 1, 将 Jenkins 的秘钥拷贝到 Git 服务器,以使其在拉取代码的时候免密码操作。
  • 2, 将 Jenkins 的秘钥拷贝到 testtomcat 服务器,以使其在同步等操作的时候免密码。
  • 3, 在 test tomcat 服务器添加与 mysql 的连接。我们公司是将 mysql 的 ip 写入到了 test tomcat 服务的 hosts 里边了。
  • 4, 设置 Jenkins 上的 maven 与 nexus 的连接。
vim /usr/local/maven/conf/settings.xml
1

image

接着还需要将 maven 像 jdk 那样把环境写入到系统配置当中,不然等会儿编译可能会报错。

vim /etc/profile

在最底下添加。
# maven所在的目录
export M2_HOME=/usr/local/maven
export M2=$M2_HOME/bin
export PATH=$M2:$PATH
1
2
3
4
5
6
7

现在,终于,可以,进行一个项目的配置了。

# 配置开始

来到 Jenkins 界面中。

image

输入项目的名称,选中构建一个自由风格的项目。


提示

插曲:大家可能看到这张图带有水印与其他的不一样,因为这张是修改过程中后补上来的。在此要感谢一下读者 cooki 同学,详细情况在下边留言当中已有表明。嗟乎,人生能有这样的读者,夫复何求!!!

image


回归正题。

也可以在最低下复制其他的项目名称,直接 copy 其他的项目的配置,这样会省去很多相同的操作,非常 nice。

image

点击确定,进行下一步

image

选择参数化构建过程,这里都是拿干货来说了,其他不重要的,可以自己进行测试着玩。 最后配置出来是这个样子

image

基本上这样就能够满足测试之需求了,注意这里边的名称都是可以作为参数进行传递的。一般项目都是有部署与回滚的功能,而在部署当中,添加一个 Git 分支的选择,这对于开发来讲,是非常必要的。

接下来是代码管理

image

我们这里用的是 Git 代码库,首先把项目的链接复制过来,然后需要添加一个能够登陆的用户,下边 add 添加一个就行,如果这个地方总是返回 128 错误,应该是 Jenkins 添加秘钥到 Git 了,但是还没有进行过登陆的确认,这个时候到服务器上进行一次代码的 clone,然后就会看到这个地方的报错消失了。

这个时候,先不做其他任何操作,我们直接保存设置,然后进行一次构建看看再说。

image

点击进去

image

如果是第一次构建,那么这个地方会从 nexus 库当中下载很多需要的依赖包,但是这些并不是我想展示出来看的,真正想看到的是,Jenkins 会在自己的工作目录当中创建这样一个项目,然后将所有的代码给拉取过来,随后进行编译的动作。

image

这个就是刚刚创建的项目名称,进去之后就能看到源代码了。 源码当然是不能看咯,不过现在可以把目光拉到 Jenkins 刚才的构建界面来。

image

这个构建项目需要依赖于 antx.properties 这个配置文件但是第一次构建还没有这个文件,因此会提示让更新一下,而 Jenkins 的 web 界面又是不提供这种交互功能的,于是来到服务器上进行编译并更新。(注意,以后如果开发人员再次对这个文件更新或者更改,部署的时候可能还会出现这样的情况,会一直提示让选择更新,却又选择不了,于是,需要告知开发人员,遇到这种情况,立马叉掉停止构建。)

到服务器上进入刚才的项目目录执行下边命令

mvn clean install -Dmaven.test.skip=true
1

稍等一会儿,会提示让更新:

image

输入 y q y 就行了,然后会保存在 root 目录下,如下图中所展示:

image

接着就会看到编译成功的界面

image

注意:现在这种操作逻辑呢,是 Jenkins 将代码从 Git 服务器拉去到 Jenkins 服务器上,然后在 Jenkins 服务器本机上进行编译的操作,比较建议这样的操作,因为 Jenkins 服务器相对于那些可能有四五个 tomcat 在跑着的服务器来说,压力会小很多很多,因此建议在 Jenkins 编译然后将 war 包同步到测试服务器。

编译完成之后,会在相应的目录下边生成一个 war 包,具体是什么目录,则由开发人员在代码当中定义的,不过一般规范化的话,会在 web/target 下

image

那么,再将这个包拷到测试服务器对应目录下,重启 tomcat 不就行了,事实上就是这样的,现在我们回到 Jenkins 的 web 界面来将这些事儿给完成了。

image

在构建界面找到 Execute shell,可能上级目录略有不同,但是找到这个就对了,将构建的脚本进去。脚本内容如下:

#!/bin/bash
#git checkout new_website_dev_20160430
#git pull
#mvn clean package -Dmaven.test.skip=true

APP_DIR=/usr/local/tomcat/WAR   #注意这个目录对方服务器(也就是test tomcat服务器)默认没有,需要创建

function MVN-SCP(){
chattr +i /root/antx.properties
cd $WORKSPACE
mvn clean install -Dmaven.test.skip=true
chattr -i /root/antx.properties

scp  $WORKSPACE/web/target/ROOT.war root@192.168.96.17:$APP_DIR/
[ $? -ne 0 ] && echo -e '\033[31m[ error ] Failed to scp the ROOT.war\033[0m' && exit 1
sleep 1
}

function deploy()
{
echo "MVN & SCP"
  MVN-SCP
  sleep 3
ssh root@192.168.96.17 "echo "调用部署" && /usr/local/scripts/deploy.sh $mode"
}

function rollback()
{
ssh root@192.168.96.17 "echo "调用部署" && /usr/local/scripts/deploy.sh $mode"
}

case $mode in
 deploy)
        deploy
        ;;
 rollback)
        rollback
        ;;
 *)
        echo $"Usage: $0 {deploy|rollback}"
        exit 1
        ;;
esac
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

这里的脚本主要就是完成两件事情,首先把本地拉取的代码进行编译,然后把编译好了的 war 包传到远程 tomcat 服务器,接着调用远程服务器的部署脚本(这个脚本下边会列出),这些操作都并不复杂,如果对 Linux 服务器所有目录结构以及 shell 脚本熟悉的话。更多的,则就是细心的配置了,很多时候出问题,基本上都是变量不统一或者脚本调用有误。

刚才说了部署的时候调用了一下远程的部署脚本,那么在远程服务器上的脚本是怎样的呢,是这样的:

#!/bin/bash
source /etc/profile
tomcat_dir=/usr/local/tomcat
bak_dir=$tomcat_dir/WAR_backup
date=$(date +"%Y%m%d%H%M%S")
stop_tomcat(){
   ps aux |grep tomcat|grep -v grep|awk '{print $2}'|xargs kill -9
}
start_tomcat(){
   /bin/bash  $tomcat_dir/bin/startup.sh
}

deploy(){
echo "stop_tomcat"
   stop_tomcat

 echo "backup_war"
 [ ! -d $bak_dir ] && mkdir -p $bak_dir
   cp $tomcat_dir/webapps/ROOT.war $bak_dir/ROOT_$(date +"%y%m%d%H%M%S").war && \mv $tomcat_dir/webapps/ROOT.{war,warbak}
 echo "rm -rf $tomcat_dir/webapps/ROOT"
   rm -rf $tomcat_dir/webapps/ROOT && mv $tomcat_dir/WAR/ROOT.war $tomcat_dir/webapps/
   sleep 2

 echo "start_tomcat"
   start_tomcat
   sleep 10
}

rollback(){
 echo "stop_tomcat"
   stop_tomcat
   sleep 2

 echo "rollback"
   rm -f $tomcat_dir/webapps/ROOT.war && rm -rf $tomcat_dir/webapps/ROOT
   cp $tomcat_dir/webapps/ROOT.{warbak,war}

 echo "start_tomcat"
   start_tomcat
   sleep 10
}

case "$1" in
'deploy')
   deploy
   echo "deploy success!!!"
;;
'rollback')
   rollback
   echo "rollback success!!!"
;;
*)
   echo "Usage: $0 {deploy | rollback}"
   exit 1
esac
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

而这个脚本的内容也是非常简单的,无论是部署还是回滚,都首先把服务停掉,然后进行 war 的对应操作,最后再启动服务。

如果说这个地方 tomcat 启动失败。那么就从前往后一步一步捋,先看 Jenkins 构建是否正常,然后再看 tomcat 启动日志,数据库连接是否正常,相关的环境配置是否妥当。

需要注意一点:这个脚本放置的位置需要与上一个脚本里边指向的位置(/usr/local/scripts)以及名称(deploy.sh)相同。

当然,这个地方的两个小脚本,只是作为一个示例来讲解出利用脚本与 Jenkins 的配合,实际生产还应该结合自己环境情况进行不同的调整。

那么,整个一系列的部署就是这个样子的。

最后,摘抄一段网上看到的表述 Jenkins 优点的几点: 摘抄自http://blog.csdn.net/u013602835/article/details/54632843

提示

关于这 4 点,实际使用中还是比较方便的:

  • 1,构建项目自动化打包可以省去开发人员好多时间,重要的是,Jenkins 为我们维护了一套高质量可用的代码,而且保证了一个纯净的环境。我们经常会出现由于本地配置出错而导致打包失败的情况。现在 Jenkins 就是一个公平的评判者,它无法正确的编译出 ipa,那就是有编译错误或者配置问题。开发人员没必要去争论本地是可以运行的,拉取了谁谁谁的代码以后就不能运行了。共同维护 Jenkins 的正常编译,因为 Jenkins 的编译环境比我们本地简单的多,它是最纯净无污染的编译环境。开发者就只用专注于编码。这是给开发者带来的便利。
  • 2,这个可以用来自动化测试。在本地生成大批的测试用例。每天利用服务器不断的跑这些用例。每天每个接口都跑一遍。看上去没必要,但是实际上今天运行正常的系统,很可能由于今天的代码改动,明天就出现问题了。有了 Jenkins 可以以天为单位的进行回归测试,代码只要有改动,Jenkins 就把所有的回归测试的用例全部都跑一遍。在项目工期紧张的情况下,很多情况测试都不是很重视回归测试,毕竟很可能测一遍之后是徒劳的“无用功”。然而由于回归测试不及时,就导致到最后发版的时候系统不可用了,这时候回头查找原因是比较耗时的,查看提交记录,看到上百条提交记录,排查起来也是头疼的事情。以天为单位的回归测试能立即发现问题。测试人员每天可以专注按单元测试,一周手动一次回归测试。这是给测试者带来的便利。
  • 3,这个是静态代码分析,可以检测出很多代码的问题,比如潜在的内存泄露的问题。由于 Jenkins 所在环境的纯净,还是可以发现一些我们本地复杂环境无法发现的问题,进一步的提高代码质量。这是给质检带来的便利。
  • 4,随时部署。Jenkins 在打包完成之后可以设定之后的操作,这个时候往往就是提交 app 到跑测试用例的系统,或者部署到内测平台生成二维码。部署中不能安装等一些低级问题随之立即暴露。测试人员也只需要扫一下二维码即可安装,很方便。这也算是给测试带来的便利。
微信 支付宝
#jenkins
上次更新: 2024/07/04, 22:40:37
Jenkins各配置选项介绍
Jenkins配置项目构建的钉钉通知

← Jenkins各配置选项介绍 Jenkins配置项目构建的钉钉通知→

最近更新
01
睡着的人不关灯
06-12
02
学习周刊-总第215期-2025年第24周
06-12
03
学习周刊-总第214期-2025年第23周
06-05
更多文章>
Theme by Vdoing | Copyright © 2017-2025 | 点击查看十年之约 | 浙ICP备18057030号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式