我正在参与「启航计划」

本文已录入至我的Github库房DayDayUP:github.com/RobodLee/DayDayUP,欢迎Star

⭐⭐⭐⭐⭐转载请注明出处:blog.csdn.net/weixin_4346…

前言

之前布置项目的时分都是手动的打jar包,然后将jar包上传到服务器运转,非常麻烦。上个月去其他公司待了一段时间,发现了主动化布置这么一个好东西,只需本地一提交代码,就会主动打包发布到指定的服务器上,免去了手动布置的麻烦。之前手头上只要一台阿里云,也就没搞了,正好这几天华为云有活动,近乎白嫖了两台服务器,所以正好能够试试主动化布置。

准备工作

流程介绍

主动化布置的工具有很多,我一开始是计划折腾一下Jenkins的,不过没搞起来。然后就选择运用GitLab,因为GitLab就自带了CICD的功用。

你是个成熟的项目了,该学会自动构建自动部署了

布置项目无非便是打成jar包,将jar包放到Web服务器中,再将jar包运转起来,过程都是固定的,只不过之前每次都是咱们手动操作罢了。而主动化布置的原理其实便是咱们先用脚本将布置的过程写好,然后在特定的时分主动履行这些脚本。那么怎样在提交代码的时分履行指定的脚本了,这就要凭借CICD工具和github-runner了。

咱们将脚本写好,若干过程加在一起就称作为一个job,而gitlab-runner便是履行job的东西。在job中就指定好了要用哪个gitlab-runner来运转,这样GitLab服务器在咱们提交代码时将代码再发送到指定的gitlab-runner中,再由其履行打包、运转的指令就OK了。

装置GitLab

怎样装置GitLab能够参阅这篇教程:

support.huaweicloud.com/bestpractic…

教程中是基于CentOS7.2的,我用的CentOS7.9也是能够的。不过自己折腾着玩的小伙伴能够装社区版,我一开始装的企业版,用起来卡卡的,常常加载不出来,换了社区版就好了。装置时只需把教程中的ee换成ce便是社区版了。

你是个成熟的项目了,该学会自动构建自动部署了

CICD是GitLab内置的功用,所以就不用额定装置了。

在Web服务器上装置和注册gitlab-runner

gitlab-runner是用来运转主动化使命的。装置很简单,就下面两个指令:

curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh | sudo bash
yum install gitlab-runner

装置完成后就需求将gitlab-runner的信息注册到GitLab中,否则GitLab怎样知道gitlab-runner的地址呢。

在此之前,要先用管理员账号登录到GitLab中,然后在设置中找到Runner选项,点击页面中的注册一个实例Runner,就会呈现Token,把这个Token仿制下来。

你是个成熟的项目了,该学会自动构建自动部署了

然后回到Web服务器中,运转注册指令:

gitlab-runner register

然后页面中就会呈现一些需求填写的信息:

你是个成熟的项目了,该学会自动构建自动部署了

这样就注册好了,回到GitLab的页面中,就能够看到这个gitlab-runner已经注册成功了。

你是个成熟的项目了,该学会自动构建自动部署了

Maven和JDK

因为现在编译和运转都是在Web服务器上,所以自然要在Web服务器中装置MavenJDK,至于这两货怎样装置我就不多说了,搞Java的这个应该是根本操作吧。

不过这儿要注意一点,便是Maven和JDK的环境变量不仅要在/etc/profile中装备一份,还要在/root/.bash_profile中也装备一份。否则脚本运转的时分或许会报**“command not found: mvn”**等过错。

装备免密登录

你是个成熟的项目了,该学会自动构建自动部署了

前面说过。提交代码时,CICD将代码发送到gitlab-runner中。而Maven和JDK都是装置在Web服务器中的,所以咱们需求在gitlab-runner中去操作Web服务器。尽管gitlab-runner是装置在Web服务器中的,可是它俩的关系能够理解成是宿主机和虚拟机,gitlab-runner经过ssh连接到Web服务器中进行操作,为了便利,需求装备免密登录。

# 切到gitlab-runner账号
su - gitlab-runner
# 创立秘钥对
ssh-keygen
# 仿制秘钥对到Web服务器中
ssh-copy-id root@182.XX.XX.XX

你是个成熟的项目了,该学会自动构建自动部署了

然后试一下在gitlab-runner用户下能否登录到Web服务器中,能够登录就阐明没问题,假如不行再回头看看哪步出错了。

你是个成熟的项目了,该学会自动构建自动部署了

然后还需求将公钥存入到GitLab服务器中,默认的存储路径是:/home/gitlab-runner/.ssh/id_rsa.pub

翻开该文件,并仿制其内容

你是个成熟的项目了,该学会自动构建自动部署了

然后将其装备到GitLab中:

你是个成熟的项目了,该学会自动构建自动部署了

到此,一切的准备工作就做好啦!

编写主动化脚本

然后随便在GitLab中创立一个项目,在项目的根目录下增加gitlab-ci.yml文件,然后在里面编写脚本。

你是个成熟的项目了,该学会自动构建自动部署了

# 变量
variables:
  # 项目存放目录,要先创立
  project_path: "/root/CICD_Project"
  # 项目布置的服务器ip
  deploy_ip: "182.XX.XX.XX"
# 阶段
stages:
  # develop分支构建阶段
  - my_develop
  # main分支构建阶段
  - my_main
before_script:
  - echo "======== before script ========"
after_script:
  - echo "======== after script ========"
  # 删去.git目录,否则下次构建时或许会报错
  - rm -rf .git
# job
my_develop_build:
  only:
    refs:
      # 仅限develop分支改动时触发该job
      - develop
  # runner的标签,指定用哪个runner去运转job
  tags:
    - aliyun-runner-1
  # 该使命是哪个阶段
  stage: my_develop
  # 脚本
  script:
    # 删去旧项目文件
    - ssh -o StrictHostKeychecking=no root@${deploy_ip} "cd ${project_path} && rm -rf ./*"
    # 把提交的最新代码仿制到指定的项目目录下
    - scp -r -o StrictHostKeychecking=no ./* root@${deploy_ip}:${project_path}
    # 编译项目
    - ssh -o StrictHostKeychecking=no root@${deploy_ip} "cd ${project_path} && source /root/.bash_profile && mvn package"
    # 运转项目
    - ssh -o StrictHostKeychecking=no root@${deploy_ip} "cd ${project_path} && chmod +x run.sh && ./run.sh"
my_main_build:
  only:
    refs:
      - main
  tags:
    - huawei1month
  stage: my_main
  script:
    - echo "main-------------------------------------"

我这儿定义了两个Job,两个Job别离对应两个阶段,然后别离在不同的分支提交时履行,当然你也能够依据你的需求装备一次履行多个阶段等。

然后script里便是详细要履行的脚本了。每个指令前面的“ssh -o StrictHostKeychecking=no root@${deploy_ip}”是固定写法,用于免密登录到Web服务器中,后面引号内的便是详细的指令了,和咱们在终端里写的是相同的。

做的事情很简单,无非便是打包运转罢了,运转的脚本我又独自写到run.sh文件中了。

# 切换到项目目录下
cd /root/CICD_Project/target
# 杀死之前的项目进程。这儿的cut -c9-14是截取进程id,不一定都是-c9-14
# 能够先运转ps -ef|grep java|grep CICD_Project-0.0.1-SNAPSHOT.jar看一下进程id是第几位到第几位
ps -ef|grep java|grep CICD_Project-0.0.1-SNAPSHOT.jar|cut -c9-14|xargs kill -9
# 停5秒
sleep 5s
# 使环境变量生效
source /root/.bash_profile
# 运转项目
nohup java -jar CICD_Project-0.0.1-SNAPSHOT.jar >/root/cicd.log 2>&1 &

这儿值得注意的便是2>&1。它的作用便是不在控制台输出日志,一定要加上,否则到时分运转job时就会一向输出在输出日志而导致job一向处于运转中而不结束。

然后提交代码后就会主动进行编译并发布到Web服务器中了,因为这台服务器是第一次运转,所以下载所需Maven依靠的时间长了点。

你是个成熟的项目了,该学会自动构建自动部署了

我这儿写了一个测试接口:

@RestController
@RequestMapping("/1")
public class DemoController {
    @GetMapping("/1")
    public String test() {
        String a = "欢迎重视我的微信公众号:Robod";
        System.out.println(a);
        return a;
    }
}

拜访一下,成功显示了,阐明代码布置的没有问题:

你是个成熟的项目了,该学会自动构建自动部署了

再修正一下代码,从头提交一下,修正的代码很快就编译好了并发布到了Web服务器中了。

你是个成熟的项目了,该学会自动构建自动部署了

怎样样,这样是不是很便利呢。省下的时间又能够摸鱼了。

你是个成熟的项目了,该学会自动构建自动部署了

当然,GitLab CICD的用法远不止这些。我仅仅按照我的运用方法简单介绍了一下,更加详细的用法能够去查阅官方文档:docs.gitlab.cn/jh/ci/

⭐⭐⭐⭐⭐转载请注明出处:blog.csdn.net/weixin_4346…

本文已录入至我的Github库房DayDayUP:github.com/RobodLee/Da…,欢迎Star

假如您觉得文章还不错,请给我来个点赞保藏重视

学习更多编程常识,欢迎重视微信公众号『 R o b o d 』: