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在实际使用过程中, 还没感受到它带来的优势(可能目前接触的微服务还是少啊 )

你可能感兴趣的:(SpringBoot-03 gitlab-runner CI/CD 自动部署)