SpringBoot-03 gitlab-runner CI/CD 自動部署

0x00 TL;NR

本文目標

  • 自動部署
    • gitlab提交代碼后, gitlab-runner負責更新代碼
    • gitlab-runner執(zhí)行script 完成java項目的編譯,和服務(wù)的重啟
  • 部署方式
    • 采用mvn package 生成jar包后, 執(zhí)行命令java -jar a.jar 方式啟動服務(wù).
  • 代碼更新
    • 采用gitlabpersonal 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
安裝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è)置畫面:
    Personal Access Token

    進入Access Tokens 頁面:
    選擇好名稱,超時時間, 最重要的是 scopes要選擇 api
    生成PAT

    點擊生成按鈕, 進入結(jié)果頁面:
    拿到PAT后,請自行外部保存.
    保存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)令牌:
    取得token

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/CDJobs部分, 就可以查看部署過程中的日志信息:

CI/CD執(zhí)行過程

之后可以修改代碼, 每次向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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末意推,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌甜孤,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,843評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異者祖,居然都是意外死亡立莉,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評論 3 392
  • 文/潘曉璐 我一進店門七问,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蜓耻,“玉大人,你說我怎么就攤上這事烂瘫∶叫埽” “怎么了?”我有些...
    開封第一講書人閱讀 163,187評論 0 353
  • 文/不壞的土叔 我叫張陵坟比,是天一觀的道長芦鳍。 經(jīng)常有香客問我,道長葛账,這世上最難降的妖魔是什么柠衅? 我笑而不...
    開封第一講書人閱讀 58,264評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮籍琳,結(jié)果婚禮上菲宴,老公的妹妹穿的比我還像新娘。我一直安慰自己趋急,他們只是感情好喝峦,可當我...
    茶點故事閱讀 67,289評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著呜达,像睡著了一般谣蠢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上查近,一...
    開封第一講書人閱讀 51,231評論 1 299
  • 那天眉踱,我揣著相機與錄音,去河邊找鬼霜威。 笑死谈喳,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的戈泼。 我是一名探鬼主播婿禽,決...
    沈念sama閱讀 40,116評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼矮冬!你這毒婦竟也來了谈宛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,945評論 0 275
  • 序言:老撾萬榮一對情侶失蹤胎署,失蹤者是張志新(化名)和其女友劉穎吆录,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體琼牧,經(jīng)...
    沈念sama閱讀 45,367評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡恢筝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,581評論 2 333
  • 正文 我和宋清朗相戀三年哀卫,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片撬槽。...
    茶點故事閱讀 39,754評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡此改,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出侄柔,到底是詐尸還是另有隱情共啃,我是刑警寧澤,帶...
    沈念sama閱讀 35,458評論 5 344
  • 正文 年R本政府宣布暂题,位于F島的核電站移剪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏薪者。R本人自食惡果不足惜纵苛,卻給世界環(huán)境...
    茶點故事閱讀 41,068評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望言津。 院中可真熱鬧攻人,春花似錦、人聲如沸悬槽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽初婆。三九已至烙博,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間烟逊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評論 1 269
  • 我被黑心中介騙來泰國打工铺根, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留宪躯,地道東北人。 一個月前我還...
    沈念sama閱讀 47,797評論 2 369
  • 正文 我出身青樓位迂,卻偏偏與公主長得像访雪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子掂林,可洞房花燭夜當晚...
    茶點故事閱讀 44,654評論 2 354

推薦閱讀更多精彩內(nèi)容