0x00 TL;NR
本文目標
- 自動部署
- 向
gitlab
提交代碼后,gitlab-runner
負責更新代碼gitlab-runner
執(zhí)行script
完成java
項目的編譯,和服務(wù)的重啟- 部署方式
- 采用
mvn package
生成jar
包后, 執(zhí)行命令java -jar a.jar
方式啟動服務(wù).- 代碼更新
- 采用
gitlab
的personal access token
進行更新, 有一定安全風險, 自行評估.
0x01 安裝gitlab-runner
- 下載
gitlab-runner
此文件由go
語言開發(fā), 下載下來就是一個執(zhí)行文件.
下載完成后, 添加執(zhí)行權(quán)限.
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
- 創(chuàng)建工作目錄
# gitlab-runner工作目錄
mkdir -p /app/gitlab-runner
chmod 777 /app/gitlab-runner
# 用于git clone 下載的目錄
mkdir -p /app/mvn_deploy
chmod 777 /app/mvn_deploy
- 安裝服務(wù)并啟動
# 指定工作目錄 /app/gitlab-runner
gitlab-runner install --user=gitlab-runner --working-directory=/app/gitlab-runner
gitlab-runner start
狀態(tài)查看
如果配置過程中, 想查看服務(wù)的運行狀態(tài), 可以執(zhí)行service gitlab-runner status
進行查詢運行日志
tail -f /var/log/messages
- 創(chuàng)建用戶
useradd gitlab-runner
0x02 生成(查詢)用戶的Personal Access Token
關(guān)于
PAT(Personal Access Token)
PAT
是由gitlab
系統(tǒng)生成, 作用域是面向gitlab
用戶.
作用是, 可以免用戶名和密碼進行g(shù)it操作.(由于本案例實施環(huán)境沒有開放
22
端口, 所以沒有采用ssh
的免密git
方式)
- 生成
PAT
進入gitlab
控制頁的個人設(shè)置畫面:
進入Access Tokens
頁面:
選擇好名稱,超時時間, 最重要的是scopes
要選擇api
點擊生成按鈕, 進入結(jié)果頁面:
拿到PAT
后,請自行外部保存.
0x03 新建測試工程
這里采用一個最基礎(chǔ)的 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
注冊令牌此令牌與項目關(guān)聯(lián), 用于
gitlab-runner
注冊時使用.
- 提取注冊
token
來到gitlab
項目頁的Settings
處, 按下圖位置, 就可以拿到相應(yīng)令牌:
0x05 向gitlab-runner
注冊工程
目前為止, 我們有了 gitlab
中的項目repo
,也有了一個運行中的 gitlab-runner
服務(wù).
現(xiàn)在要做的就是, 把這個repo
信息 注冊到 gitlab-runner
上.
注意點:
- 注冊的是gitlab域名,
不包含
項目后面的/用戶名/項目名.git
tags
不能亂寫, 在代碼提交時, 主分支上, 也要打上相同的tag
- 最后一步
executor
,我們選擇shell
. 意為執(zhí)行shell
腳本.
# 執(zhí)行注冊命令
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 作為觸發(fā)條件
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要執(zhí)行的方式, 這里使用 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
監(jiān)聽并執(zhí)行.
最重要的就是script
那一行, 它代表一行bash
命令:
相當于在 gitlab-runner
的所在服務(wù)器執(zhí)行了:
/app/soft/gitlab_deploy username demo
這條命令.
先別急著提交, 還有兩個文件要編寫 - -!
0x07 gitlab_deploy
腳本編寫
那么在提交 .gitlab-ci.yml
之前, 我們先來完成執(zhí)行腳本的編寫.
兩個變量需要自行修改
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
工程下面, 是因為此文件可以自定義啟動參數(shù).
#!/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 提交代碼
經(jīng)過這么長的準備, 終于要開測啦
git add .
git commit -m "add_file"
git tag apple
git push origin master --tags
然后,在gitlab
網(wǎng)頁上, CI/CD
的Jobs
部分, 就可以查看部署過程中的日志信息:
之后可以修改代碼, 每次向master
提交后, 都可以自動部署
0x09 后記
這種發(fā)布方式應(yīng)該是部署速度最快的方式了(沒有之一).
直接在發(fā)布機器上下載源碼后, 本地打包執(zhí)行.
缺點也很明顯, 就是源碼直接放到發(fā)布機器上了.
有一點點代碼風險而已.
為什么不使用
Docker
?
目前有兩個原因在考慮中
Docker
打包方式雖然很美, 但是, 多了好多步驟(打包,上傳到私庫,再拉庫)Docker
在實際使用過程中, 還沒感受到它帶來的優(yōu)勢(可能目前接觸的微服務(wù)還是少啊 )
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