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

前言

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

准备工作

流程介绍

自动化部署的工具有很多,我一开始是打算折腾一下Jenkins的,不过没搞起来。然后就选择使用GitLab,因为GitLab就自带了CICD的功能。
在这里插入图片描述
部署项目无非就是打成jar包,将jar包放到Web服务器中,再将jar包运行起来,步骤都是固定的,只不过之前每次都是我们手动操作而已。而自动化部署的原理其实就是我们先用脚本将部署的步骤写好,然后在特定的时候自动执行这些脚本。那么如何在提交代码的时候执行指定的脚本了,这就要借助CICD工具和github-runner了。

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

我用的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

打开该文件,并复制其内容

在这里插入图片描述
v然后将其配置到GitLab中:
在这里插入图片描述
到此,所有的准备工作就做好啦!

编写自动化脚本

然后随便在GitLab中创建一个项目,
在这里插入图片描述

# 变量
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服务器中了。
在这里插入图片描述
怎么样,这样是不是很方便呢。省下的时间又可以摸鱼了。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值