配置需求
- 1c 2g 服务器 1 台
尝试 Vultr、Amazon aws 和阿里云 ECS 后,得出结论: 若 Git Provider 为 GitHub,由于网络原因,应选用 Vultr 等 VPS 或 aws 等国外服务器。 但价格相对较国内云提供商较贵,若使用 1c 1g 服务器在构建中服务器容易崩溃。 Gitee 是国内连接速度最快的 Git Provider,但 Jenkins 对于 Gitee 的插件支持少。 所以采用 GitLab + 阿里云 Ecs 解决方案。
在明确需求之后,则需要参考官方文档着手部署 Jenkins 服务器。
Jenkins 会在 Build 完成之后 kill 掉脚本中开启的进程,所以建议使用 nohup java -Dhudson.util.ProcessTree.disable=true -jar jenkins.war &
运行 Jenkins
服务器准备
- git
Jenkins 需要从 GitLab 向 Jenkins 服务器拉取代码。
- jdk1.8
Jenkins 需要运行在 Java 8 环境下
- maven
该项目需要使用 Maven 打包
Jenkins 插件
- Maven Integration
Jenkins 需要创建一个 Maven Item
- Publish Over SSH
在 mvn 打包后需要部署到目标服务器上
- GitLab Plugin
需要从 GitLab 拉取项目
- GitLab Hook Plugin
配置 GitLab 触发器
Jenkins 配置
配置好插件后,需要对 Jenkins 进行一定的配置。
Publish Over SSH 配置
Manage Jenkins->Configure System 找到 Publish Over SSH 。 在 SSH Servers 中 Add 一个 SSH Server,正确填写项目部署服务器信息。 点击 Advanced,勾选 Use password authentication, or use a different key,正确填写密码,测试并保存。
项目配置
- 新建项目
选择 Maven Project,Source Code Management 选择 Git,填入项目地址,账户信息以及目标分支。
- 配置触发器。
在 Build Triggers 中选择 Build when a change is pushed to GitLab,记下后面 GitLab webhook URL,根据需求配置 Advanced 中信息。
- 配置构建后动作。
在 Post-build Actions 中选择已配置好的服务器,根据实际情况填写 Transfers 中信息。
e.g.
选项名称 | 填写参数 | 说明 |
Source files | **/workhelper*.jar | Jenkins 会找到目录下符合该正则表达式的文件 |
Remove prefix | target/ | 通常 Maven 打包后文件都会在 target 目录下 |
Remote directory | 空 | 该目录相对于 Publish Over SSH 中配置的 Remote Directory |
Exec command | 见下文代码 | 部署后命令,是项目传输后运行的脚本 |
#!/bin/bash
#Exec command 中的代码段
cd /root/project/
./stop.sh
./replace.sh
echo "Execute shell Finish"
BUILD_ID=dontKillMe /root/project/startup.sh
复制代码
- GitLab 配置
GitLab 项目中 Settings->Integrations,URL 填写上文记录的 GitLab webhook URL,根据需求选择触发器,点击 Add webhook
Jenkins 中 Manage Jenkins->Configure System 找到 GitLab,取消 Enable authentication for '/project' end-point
Jenkinsfile 样例
Jenkins 需要找到项目中的 Jenkinsfile 才能按照需求工作,Jenkinsfile 位于项目根目录下。
node {
checkout scm
echo "current branch: $BRANCH_NAME"
if (BRANCH_NAME.startsWith("release")) {
sh "mvn clean install"
}
}
复制代码
这里 Jenkinsfile 使用 Groovy 语法。
脚本样例
在项目通过 Publish Over SSH 传输到服务器上之后,需要一定的操作才能正确部署。
#!/usr/bin/env bash
port=8848
#根据端口号查询对应的pid
pid=$(netstat -nlp | grep :$port | awk '{print $7}' | awk -F"/" '{ print $1 }');
#杀掉对应的进程,如果pid不存在,则不执行
if [ -n "$pid" ]; then
kill -9 $pid;
fi
复制代码
#!/usr/bin/env bash
cp /root/workhelper-0.0.1-SNAPSHOT.jar /root/project/workhelper-0.0.1-SNAPSHOT.jar
复制代码
startup.sh
#!/usr/bin/env bash
nohup java -jar workhelper-0.0.1-SNAPSHOT.jar >log.log 2>&1 &
复制代码