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工作目录
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
控制页的个人设置画面:
进入Access Tokens
页面:
选择好名称,超时时间, 最重要的是scopes
要选择api
点击生成按钮, 进入结果页面:
拿到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
处, 按下图位置, 就可以拿到相应令牌:
0x05 向gitlab-runner
注册工程
目前为止, 我们有了 gitlab
中的项目repo
,也有了一个运行中的 gitlab-runner
服务.
现在要做的就是, 把这个repo
信息 注册到 gitlab-runner
上.
注意点:
- 注册的是gitlab域名,
不包含
项目后面的/用户名/项目名.git
tags
不能乱写, 在代码提交时, 主分支上, 也要打上相同的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
: 第二步生成的PAT
you-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
部分, 就可以查看部署过程中的日志信息:
之后可以修改代码, 每次向master
提交后, 都可以自动部署
0x09 后记
这种发布方式应该是部署速度最快的方式了(没有之一).
直接在发布机器上下载源码后, 本地打包执行.
缺点也很明显, 就是源码直接放到发布机器上了.
有一点点代码风险而已.
为什么不使用
Docker
?
目前有两个原因在考虑中
Docker
打包方式虽然很美, 但是, 多了好多步骤(打包,上传到私库,再拉库)Docker
在实际使用过程中, 还没感受到它带来的优势(可能目前接触的微服务还是少啊 )
0x0A 更新build 目录
场景:手动rpm 安装完成后,如果想修改工作目录,可参考下面:
- vim /etc/gitlab-runner/config.toml
builds_dir = "/apps/jenkins/builds"
[runners.custom_build_dir]
enabled = true
然后重启:
gitlab-runner restart
gitlab-runner verify
gitlab-runner list