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

0x00 TL;NR

本文目标

  • 自动部署
    • gitlab提交代码后, gitlab-runner负责更新代码
    • gitlab-runner执行script 完成java项目的编译,和服务的重启
  • 部署方式
    • 采用mvn package 生成jar包后, 执行命令java -jar a.jar 方式启动服务.
  • 代码更新
    • 采用gitlabpersonal 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域名,不包含项目后面的/用户名/项目名.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/CDJobs部分, 就可以查看部署过程中的日志信息:

CI/CD执行过程

之后可以修改代码, 每次向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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容