0x00 TL;NR
本文目标
- 自动部署
- 向
gitlab提交代码后,gitlab-runner负责更新代码gitlab-runner执行script完成java项目的编译,和服务的重启- 部署方式
- 采用
mvn package生成jar包后, 执行命令java -jar a.jar方式启动服务.- 代码更新
- 采用
gitlab的personal access token进行更新, 有一定安全风险, 自行评估.
0x01 安装gitlab-runner
- 下载
gitlab-runner
此文件由go语言开发, 下载下来就是一个执行文件.
下载完成后, 添加执行权限.
sudo curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64
sudo chmod +x /usr/local/bin/gitlab-runner
安装gitlab-runner
- 创建工作目录
# gitlab-runner工作目录
mkdir -p /app/gitlab-runner
chmod 777 /app/gitlab-runner
# 用于git clone 下载的目录
mkdir -p /app/mvn_deploy
chmod 777 /app/mvn_deploy
- 安装服务并启动
# 指定工作目录 /app/gitlab-runner
gitlab-runner install --user=gitlab-runner --working-directory=/app/gitlab-runner
gitlab-runner start
安装并启动
状态查看
如果配置过程中, 想查看服务的运行状态, 可以执行service gitlab-runner status进行查询运行日志
tail -f /var/log/messages
- 创建用户
useradd gitlab-runner
0x02 生成(查询)用户的Personal Access Token
关于
PAT(Personal Access Token)
PAT是由gitlab系统生成, 作用域是面向gitlab用户.
作用是, 可以免用户名和密码进行git操作.(由于本案例实施环境没有开放
22端口, 所以没有采用ssh的免密git方式)
- 生成
PAT
进入gitlab控制页的个人设置画面:
Personal Access Token
进入Access Tokens页面:
选择好名称,超时时间, 最重要的是scopes要选择api
生成PAT
点击生成按钮, 进入结果页面:
拿到PAT后,请自行外部保存.
保存PAT
0x03 新建测试工程
这里采用一个最基础的 Spring Boot Web项目做为测试工程.
@RestController
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@RequestMapping("/**")
public String index(){
return "Hello Demo";
}
}
然后提交项目到gitlab.
0x04 提取工程的注册token
CI/CD注册令牌此令牌与项目关联, 用于
gitlab-runner注册时使用.
- 提取注册
token
来到gitlab项目页的Settings处, 按下图位置, 就可以拿到相应令牌:
取得token
0x05 向gitlab-runner注册工程
目前为止, 我们有了 gitlab中的项目repo,也有了一个运行中的 gitlab-runner服务.
现在要做的就是, 把这个repo信息 注册到 gitlab-runner上.
注意点:
- 注册的是gitlab域名,
不包含项目后面的/用户名/项目名.gittags不能乱写, 在代码提交时, 主分支上, 也要打上相同的tag- 最后一步
executor,我们选择shell. 意为执行shell脚本.
# 执行注册命令
gitlab-runner register
############################################
# 下面是注册的交互过程:
############################################
Runtime platform arch=amd64 os=linux pid=24524 revision=de7731dd version=12.1.0
Running in system-mode.
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
# 注意: 这里只写gitlab的域名部分
https://your.gitlab.com/
Please enter the gitlab-ci token for this runner:
# 这里写repo的token
you_token
Please enter the gitlab-ci description for this runner:
[10_XX_XXX_XX]:
Please enter the gitlab-ci tags for this runner (comma separated):
# 重要: gitlab_runner, 会以此tag 作为触发条件
apple
Registering runner... succeeded runner=sBNKezF7
Please enter the executor: virtualbox, docker-ssh+machine, kubernetes, docker-ssh, parallels, shell, docker+machine, custom, docker, ssh:
# 重要: 指定runner要执行的方式, 这里使用 shell方式进行处理
shell
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
注册过程
0x06 编写 .gitlab-ci.yml
接下来, 我们在Java工程的根目录添加文件 .gitlab-ci.yml
看名称就知道它的用途: 提交到gitlab后, 会被 gitlab自动处理.
stages:
- deploy
deploy:
stage: deploy
script:
- /app/soft/gitlab_deploy username demo
only:
- master
tags:
- apple
其实这个脚本是被 gitlab-runner监听并执行.
最重要的就是script那一行, 它代表一行bash命令:
相当于在 gitlab-runner的所在服务器执行了:
/app/soft/gitlab_deploy username demo 这条命令.
先别急着提交, 还有两个文件要编写 - -!
0x07 gitlab_deploy脚本编写
那么在提交 .gitlab-ci.yml之前, 我们先来完成执行脚本的编写.
两个变量需要自行修改
PAT: 第二步生成的PATyou-gitlab.com:gitlab域名部分- 最后一行 还有一个脚本, 需要放在
java项目根目录
#!/bin/bash
if [ $# -ne 2 ]
then
echo "arguments error!"
exit 1
else
deploy_path="/app/mvn_deploy/$2"
if [ ! -d "$deploy_path" ]
then
project_path="https://gitlab-ci-token:{PAT}@{you-gitlab.com}/"$1/$2".git"
git clone $project_path $deploy_path
else
cd $deploy_path
git pull
fi
/bin/bash $deploy_path/run.sh
fi
-
java工程根目录下的run.sh
这个脚本定义了mvn打包,和启动命令.
之所以放在java工程下面, 是因为此文件可以自定义启动参数.
#!/bin/bash
mvn clean package -Dmaven.test.skip=true
ps -ef | grep `ls target/*.jar` | grep "java -" | awk '{print $2}' | xargs -i kill -9 {}
nohup java -Xms128m -Xmx256m -jar `ls target/*.jar` 2>&1 &
0x08 提交代码
经过这么长的准备, 终于要开测啦
git add .
git commit -m "add_file"
git tag apple
git push origin master --tags
然后,在gitlab网页上, CI/CD的Jobs部分, 就可以查看部署过程中的日志信息:
CI/CD执行过程
之后可以修改代码, 每次向master提交后, 都可以自动部署
多次提交
0x09 后记
这种发布方式应该是部署速度最快的方式了(没有之一).
直接在发布机器上下载源码后, 本地打包执行.
缺点也很明显, 就是源码直接放到发布机器上了.
有一点点代码风险而已.
为什么不使用
Docker?
目前有两个原因在考虑中
Docker打包方式虽然很美, 但是, 多了好多步骤(打包,上传到私库,再拉库)Docker在实际使用过程中, 还没感受到它带来的优势(可能目前接触的微服务还是少啊 )














网友评论