jenkins实战1-jenkins+maven+git构建项目
这篇博客讲了如何安装和部署jenkins,如何在jenkins服务器本地构建部署项目,但是有时候jenkins 机器和需要部署的服务机器不在一起,这时可以使用jenkins远程构建来解决这个问题.
jenkins 远程构建的原理也很简单,通过将代码pull 到jenkins服务器 的工作目录,打包,然后再远程拷贝到部署的服务器,再执行shell命令.即可完成项目发布.
方案一(适合单节点部署)
1.首先需要jenkins安装 Publish Over SSH 插件
安装完成后需要重启jenkins
启动后配置
name 写部署服务器名字 hostname 写 服务器ip user 写 服务用户名 remote directory 是jenkins远程项目拷贝部署服务器的目录,很重要,我这里就写tomcat 目录. 勾选 使用密码登录 passphrase password 写服务器登录密码.
配置就完成了
然后新建项目
新建项目和本地构建是差不多的.
jenkins 服务器执行shell 这里就不要写发布或者重启服务器了只有打包命令.
构建后操作比较重要,它会把打的包 发布到部署的服务器,然后执行一段 shell
注意source file(项目包文件) 需要写相对路径, 比如我项目目录是 /root/.jenkins/workspace/face-secret-service-test 项目包文件是
/root/.jenkins/workspace/face-secret-service-test/target/facesecret.war source file就写 target/facesecret.war remove prefix 写 target/ remote direct就是目标目录.会和前面配置的remote directory 拼接起来,我这里就没写了.
exec command 就是把项目拷贝到服务器后执行的命令. 我这里比较简单, 把war 扔到tomcat webapps 目录下 然后重启tomcat
这种方式有一个缺点,如果生产环境是集群的,jenkins 要建立很多个 item,太多了有点乱,而且容易出错。所以这边还有第二个方案。
方案二(适合多节点部署)
1.首先在jenkins 建立 变量 host 把需要部署的机器ip 添加上
2. jenkins 机器和 目标机器设置免密登录
mkdir .ssh
cd .ssh/
ssh-keygen -t rsa # 创建ssh秘钥,一路回车下去
ll # 查看
cat id_rsa.pub >> authorized_keys #复制公钥到文件
scp authorized_keys root@192.168.53.134:~/.ssh/authorized_keys
jenkins 机器和目标机器都将 公钥复制到 authorized_keys 文件中,然后分别复制到两台机器的 ~/.ssh/ 目录 ,即可实现两台机器的免密登录。
编写构建脚本,原理就是使用scp 命令 拷贝文件到指定服务器,然后执行 远程shell。
#!/bin/bash
BUILD_ID=DONTKILLME
cd /root/.jenkins/workspace/springboot-test/
mvn clean package -Dmaven.test.skip=true
echo $host
ssh root@$host "/root/project/stop.sh"
scp /root/.jenkins/workspace/springboot-test/target/*.jar root@$host:/root/project/
ssh root@$host "/root/project/start.sh"
start.sh
#!/bin/bash
source /etc/profile
nohup java -jar /root/project/springboot-test-0.0.1-SNAPSHOT.jar >/dev/null 2>&1 &
stop.sh
#!/bin/bash
source /etc/profile
kill -9 $(netstat -nlp | grep :8080 | awk '{print $7}' | awk -F"/" '{ print $1 }')
点击 build width paramters ,在host 中输入想要部署节点的ip,即可实现部署,多个节点可以一台一台的部署,生产环境比较推荐这样做,因为部署失败了,整个集群还是可用的。当然大家也可以修改jenkins 上的执行shell,用符号分隔ip,然后通过遍历方式同时部署到多个节点。这里就不再赘述了。