[ jenkins ] git+jenkins+maven + ansible 部署java程序

1. 工具介绍

git:版本控制,一般都是托管到代码仓库的。如 github、coding、gitlab (本文以 coding 为例)

jenkins:持续集成工具之一,也是最常用的工具,主要工作就是将代码从git仓库pull下来,通过maven打包,在部署到服务器上

maven:java 项目管理构建自动化工具,主要是将 java 源代码打包成 jar 程序

ansible:批量部署程序所使用的工具。

下面介绍的部署过程使用到了以上 4 个工具。

主机介绍:

实现思路:

2. 持续集成实例

2.1 首先将源代码托管到 git 仓库,具体操作自行百度,例如:coding仓库。

我这里是一个私有仓库,请自行创建仓库。

2.2 安装 jenkins 和 maven 工具

【jenkins 安装过程】

这里最好将 jenkins 配置文件修改如下:

[[email protected] ~]#vim /etc/sysconfig/jenkins
...
JENKINS_USER="root"
...

修改为 root 这样可以直接使用 root用户打包,不用在其他用户家目录下构建依赖包

本次构建使用了 jenkins 的 pipeline 功能,这里需要安装一些插件:

系统管理 -> 插件管理 -> 可选插件  搜索一下插件进行安装:

Blue Ocean

插件安装完成后,重启下服务:

[[email protected] ~]#systemctl restart jenkins

安装 git 和 maven

安装git

[[email protected] ~]#yum install git -y

安装 maven

下载地址:http://maven.apache.org/download.cgi
[[email protected] /usr/local/src]#tar xf apache-maven-3.1.1-bin.tar.gz -C /usr/local/
[[email protected] /usr/local/src]#cd /usr/local/
[[email protected] /usr/local]#ln -vs /usr/local/apache-maven-3.1.1/ /usr/local/maven
‘/usr/local/maven’ -> ‘/usr/local/apache-maven-3.1.1/’

[[email protected] /usr/local]#ln -vs /usr/local/maven/bin/mvn /usr/bin/
‘/usr/bin/mvn’ -> ‘/usr/local/maven/bin/mvn’

安装好两个工具后,首先通过 git 将源代码克隆下来,通过 maven 进行测试。

[[email protected] ~]#git clone https://git.dev.tencent.com/hukey/winstar-common-api.git
[[email protected] ~]#cd winstar-common-api/
[[email protected] ~/winstar-common-api]#mvn clean package -Dmaven.test.skip=true

第一次通过 mvn 打包时间会长一点。

出现如上信息,则打包完成。

2.3 通过 ansible 将程序推送到需要部署的节点

接下来的思路:

  通过 ansible 将 xxx.jar 文件推送到需要部署的服务器上,启动起来。

安装 ansible 并配置:

[[email protected] ~]#yum install ansible -y

(1)将 ansible 主机连接 程序部署主机设置为免密码登录

[[email protected] ~]#ssh-keygen -t rsa -P ‘‘
[[email protected] ~]#ssh-copy-id [email protected]
[[email protected] ~]#ssh-copy-id [email protected]

(2)配置 ansible 组

[[email protected] ~]#vim /etc/ansible/hosts
...
[common-api]
192.168.118.19:22 ansible_ssh_user=root adrser=/app/node-1/
192.168.118.20:22 ansible_ssh_user=root adrser=/app/node-1/
...

格式:
ip:port ansible_ssh_user=用户名 adrser=设置一个变量,这里设置的变量为一个程序部署目录,这两台主机目录必须存在。

(3)测试 ansible 无密码验证

[[email protected] ~]#ansible common-api -m ping
192.168.118.20 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
192.168.118.19 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

(4)通过 ansible 为两台程序节点部署环境

创建启动程序目录:
[[email protected] ~]#ansible common-api -m file  -a "path=/app/node-1 state=directory"
192.168.118.19 | SUCCESS => {
    "changed": true,
    "gid": 0,
    "group": "root",
    "mode": "0755",
    "owner": "root",
    "path": "/app/node-1",
    "size": 6,
    "state": "directory",
    "uid": 0
}
192.168.118.20 | SUCCESS => {
    "changed": true,
    "gid": 0,
    "group": "root",
    "mode": "0755",
    "owner": "root",
    "path": "/app/node-1",
    "size": 6,
    "state": "directory",
    "uid": 0
}

为两台程序节点安装jdk

# 将jdk拷贝到远程主机,并解压到 /usr/local/ 目录
[[email protected] ~]#ansible common-api -m unarchive -a "src=/usr/local/src/jdk-8u77-linux-x64.tar.gz dest=/usr/local/"

# 创建软链接文件
[[email protected] ~]#ansible common-api -m file -a "path=/usr/bin/java src=/usr/local/jdk1.8.0_77/bin/java state=link"

[[email protected] ~]#ansible common-api -m file -a "path=/usr/bin/javac src=/usr/local/jdk1.8.0_77/bin/javac state=link"

(5)首先将 jar 包推送到两台服务器上,是为了编写启动脚本比较方便。

[[email protected] ~]#ansible common-api -m copy -a "src=/root/winstar-common-api/target/winstar-common-api-1.0.0-SNAPSHOT.jar dest={{adrser}}"

(6)编写程序启动脚本

[[email protected] /app/node-1]#vim service.sh
#!/bin/bash
cd /app/node-1
start(){
  if [ -f `ls *.jar` ];then
    APP=$(ls *.jar)
    nohup java -jar $APP &
  else
    echo "Error: no app!"
  fi
}

stop(){
  pkill -9 java
}

update(){
  if [ ! -d backup ];then
    mkdir -p backup
  fi
  mv -f *.jar backup
  rm -rf nohup.out
}

case $1 in
start)
  start
  ;;
stop)
  stop
  ;;
update)
  stop
  update
  ;;
*)
  echo "Usage: $0 [start | stop | update]"
esac

编写了一个比较简单的脚本,这个脚本只是用来测试使用,如果生产环境使用,还有许多地方需要进行改善。

将这个脚本放在两个程序节点 /app/node-1/目录下。

(7)通过 ansible 测试程序能否正常启动成功

第一步,将程序从控制节点拷贝到程序节点:

# 安装 net-tools 包,主要用到 netstat 命令
[[email protected] ~]#ansible common-api -m yum -a "name=net-tools state=present"
# 查看目前在工作的端口信息
[[email protected] ~]#ansible common-api  -a "netstat -ntplu"
192.168.118.19 | SUCCESS | rc=0 >>
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      891/sshd            
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1454/master        
tcp6       0      0 :::22                   :::*                    LISTEN      891/sshd            
tcp6       0      0 ::1:25                  :::*                    LISTEN      1454/master         

192.168.118.20 | SUCCESS | rc=0 >>
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      882/sshd            
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1369/master        
tcp6       0      0 :::22                   :::*                    LISTEN      882/sshd            
tcp6       0      0 ::1:25                  :::*                    LISTEN      1369/master

# 将应用程序拷贝到程序节点
[[email protected] ~]#ansible common-api -m copy -a "src=/root/winstar-common-api/target/winstar-common-api-1.0.0-SNAPSHOT.jar dest={{adrser}}"

第二步,启动程序,查看程序端口

# 启动应用程序
[[email protected] ~]#ansible common-api  -a "sh {{adrser}}/service.sh start"
# 启动完毕间隔一段时间,查看应用程序端口是否启动完成
[[email protected] ~]#ansible common-api  -a "netstat -ntplu"
192.168.118.19 | SUCCESS | rc=0 >>
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      891/sshd            
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1454/master        
tcp6       0      0 :::3090                 :::*                    LISTEN      3447/java          
tcp6       0      0 :::3091                 :::*                    LISTEN      3447/java          
tcp6       0      0 :::22                   :::*                    LISTEN      891/sshd            
tcp6       0      0 ::1:25                  :::*                    LISTEN      1454/master         

192.168.118.20 | SUCCESS | rc=0 >>
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      882/sshd            
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1369/master        
tcp6       0      0 :::3090                 :::*                    LISTEN      3200/java          
tcp6       0      0 :::3091                 :::*                    LISTEN      3200/java          
tcp6       0      0 :::22                   :::*                    LISTEN      882/sshd            
tcp6       0      0 ::1:25                  :::*                    LISTEN      1369/master

应用端口:3090,管理端口:3091 说明启动成功。

至于 stop 和 update 可以自行测试,必须要保证脚本的可用性,因为后面会用到。

2.4 配置 jenkins pipeline流水线

登录 jenkins -> 新建任务

应用并保存,这样 jenkins 配置已经完成。要使用 jenkins 的 pipeline 功能,要需要在 git 仓库里新增几个配置文件。

2.5 在 git 仓库配置 pipeline 文件

登录到仓库页面

Jenkinsfile 文件内容如下:

pipeline{
    agent any
    stages {
        stage(‘Build‘) {
            steps{
                sh ‘mvn clean package -Dmaven.test.skip=true‘
                echo ‘Build success.‘
            }
        }
        stage(‘Test‘) {
            steps{
                sh ‘mvn test‘
            }
            post {
                always {
                    junit ‘target/surefire-reports/*.xml‘
                }
            }
        }
        stage(‘Deliver‘) {
            steps {
                sh ‘sh ./jenkins/scripts/deliver.sh‘
            }
        }
    }
}

代码内容很简单,分为三段:

1. 打包
2. 测试
3. 发布

重点关注下 第三个 发布是通过出一个脚本来实现的。因此这个目录和脚本必须也放置到 git 仓库。 将 jenkins pipeline 配置文件和脚本放置到 git仓库,这样更易于维护,而且对 jenkins 的使用会更加灵活。

注意脚本放置的目录,脚本内容如下:

#!/bin/bash
# Author: hukey
# date: 2019-07-16 17:23:20
#
function status(){
ansible common-api -a "netstat -ntplu"
}

function update(){
  if [ ! -f target/*.jar ];then
      echo ‘[Error]:java.jar not exist, update failed.‘
      exit 1
  fi
  JAR=$(ls target/*.jar)
  ansible ‘common-api‘ -m shell -a ‘{{adrser}}/service.sh update‘
  ansible ‘common-api‘ -m copy -a "src=$JAR dest={{adrser}}"
}

function start(){
  ansible ‘common-api‘ -m shell -a ‘{{adrser}}/service.sh start‘
}

update
sleep 3
start

上面的脚本,必须和 app-node 中的脚本对应着来看,简要说下:

首先 执行 update 操作,将 app-node 上的应用程序停止并备份到backup目录,将本地的 jar 程序拷贝到 app-node 节点;

再次 通过 start 将 app-node 上的程序启动起来。

这样一个持续性的流水线工作就完成了。

3. 持续集成测试

点击构建,然后查看后台日志输出信息:

当返回 SUCCESS 说明构建成功了。也可以通过 Blue Ocean 查看

到这里, 采用 jenkins 构建 java 项目持续集成已经完毕,这里采用的是手动触发构建,如果需要自动构建可以通过 webHook 来实现。

原文地址:https://www.cnblogs.com/hukey/p/11232424.html

时间: 2024-11-02 23:35:29

[ jenkins ] git+jenkins+maven + ansible 部署java程序的相关文章

Jenkins+git+webhook自动触发部署和测试任务

Jenkins+git+webhook自动触发部署和测试任务 需求: 目前上线前会将需要上线的代码push到release分支,然后由人工填写参数点击触发jenkins上的任务.希望这个过程能完成自动化,只要有人往release上推代码,就自动跑部署release分支并测试 解决办法及步骤: 1.在jenkins里需要自动触发的job里的"源码管理"部分添加设置,如下图.填好git仓库url和需要检测的分支名称 注意事项: a.在填url的时候可能会提示找不到命令的错误,遇到这个错的解

使用Maven自动部署Java Web项目到Tomcat问题小记

导读 首先说说自己为啥要用maven管理项目,一个直接的原因是:我在自己电脑上开发web项目,每次部署到服务器上时都要经历如下步骤: 首先在Eclipse里将项目打包成war包 将服务器上原来的项目文件夹删掉 cd /var/lib/tomcat7/webapps sudo rm XXX.war sudo rm -rf XXX 将war包传到服务器上,比如用pscp命令上传 pscp -pw "xxx" XXX.war [email protected]:/var/lib/tomcat

Jenkins和maven自动化构建java程序

转自:http://www.cnblogs.com/gao241/archive/2013/04/08/3008380.html,版权归原作者所有. Jenkins是一个非常出色的持续集成服务器,本文主要介绍在CentOS系统中Jenkins的基本安装配置方法,供参考. 一. 软件包: 1. 下载apache-maven-2.2.1-bin.tarhttp://www.apache.org/dyn/closer.cgi/maven/binaries/apache-maven-2.2.1-bin.

Linux下搭建jenkins+svn+http+maven自动化部署

服务器设置: 卸载redhat的yum,安装centos的yum,配置第三方yum 1.删除redhat原有的rpm -qa |grep yum |xargs rpm -e yum --nodeps 2.下载yum安装文件,如果下载时找不到文件,http://mirrors.163.com/centos/6/os/x86_64/ wget http://mirrors.163.com/centos/6/os/x86_64/Packages/yum-3.2.27-14.el6.centos.noa

.net core 项目+jenkins+git+docker实现自动化部署

一.准备环境 1.1 运行环境Linxu系统 CentOS7.5[腾讯云] 1.2 安装Docker https://www.cnblogs.com/bob-zb/p/12401407.html 1.3 在Docker中安装jenkins https://www.cnblogs.com/bob-zb/p/12402368.html 1.4 准备git仓库,本人使用的是码云 二.创建.net core 项目 创建成功后会自动生成Dockerfile 文件,未对Dockerfile 做任何修改,然后

jenkins+git实现docker持续部署

jenkins所做的事情很简单,就拿我现在的情况来说吧,(1).每次开发完成,我都会push到我的远程仓库:(2).我再将我push到远程仓库的代码pull到我的测试服务器上:(3).在测试服务器上,我要重启下我的项目:(4).我再执行我的shell的测试脚本将代码打包放到tomcat/webapps下面:(5).最后去看我的脚本执行情况,得到结果每次都是这样的一个重复步骤,这还是自己开发,自己测试的情况,如果是别人开发,那别人push后还得发邮件告诉我,我这边可以测试了.耽误的时间现在jenk

maven 教程入门 maven 配置管理 编译java程序

方法/步骤 1 先在E盘下创建maven 文件夹, 然后在maven创建maven0703文件夹 最后在maven0703下创建src 文件夹和pom.xml文件 步骤阅读 2 创建pom.xml文件,在文件中添加以下信息: 步骤阅读 3 然后在src下创建:main 和 test 文件夹 main 下又创建:Hello.java 文件存放到 java/com/liu/maven/Hello.java 步骤阅读 4 创建Hello.java文件,在下面加入以下代码: 步骤阅读 5 编译Java文

maven中运行java程序

从命令行运行1.运行前先编译代码,exec:java不会自动编译代码,你需要手动执行mvn compile来完成编译.mvn compile2.编译完成后,执行exec运行main方法. 不需要传递参数:mvn exec:java -Dexec.mainClass="com.vineetmanohar.module.Main" 需要传递参数:mvn exec:java -Dexec.mainClass="com.vineetmanohar.module.Main"

linux系统部署Java程序获取ip时报Caused by: java.net.UnknownHostException: XXXXXXXXXX: XXXXXXXXXX: Name or service not known

问题一: Caused by: java.net.UnknownHostException: XXXXXXXXXX: XXXXXXXXXX: Name or service not known vi /etc/hosts 127.0.0.1 iZuf68tztea6l5ccdz7wemZ XXXXXXXXXX自己的主机名