热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

本文已收录至我的Github仓库DayDayUP:github.comRobodLeeDayDayUP,欢迎Star⭐⭐⭐⭐⭐转载请注明出处࿱





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


⭐⭐⭐⭐⭐转载请注明出处:https://blog.csdn.net/weixin_43461520/article/details/127439014



前言

之前部署项目的时候都是手动的打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可以参考这篇教程:

https://support.huaweicloud.com/bestpractice-ecs/zh-cn_topic_0142594569.html

教程中是基于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的用法远不止这些。我只是按照我的使用方式简单介绍了一下,更加详细的用法可以去查阅官方文档:https://docs.gitlab.cn/jh/ci/



⭐⭐⭐⭐⭐转载请注明出处:https://blog.csdn.net/weixin_43461520/article/details/127439014


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


如果您觉得文章还不错,请给我来个点赞,收藏,关注








推荐阅读
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 本文介绍了django中视图函数的使用方法,包括如何接收Web请求并返回Web响应,以及如何处理GET请求和POST请求。同时还介绍了urls.py和views.py文件的配置方式。 ... [详细]
  • CEPH LIO iSCSI Gateway及其使用参考文档
    本文介绍了CEPH LIO iSCSI Gateway以及使用该网关的参考文档,包括Ceph Block Device、CEPH ISCSI GATEWAY、USING AN ISCSI GATEWAY等。同时提供了多个参考链接,详细介绍了CEPH LIO iSCSI Gateway的配置和使用方法。 ... [详细]
  • 本文介绍了一种处理AJAX操作授权过期的全局方式,以解决Asp.net MVC中Session过期异常的问题。同时还介绍了基于WebImage的图片上传工具类。详细内容请参考链接:https://www.cnblogs.com/starluck/p/8284949.html ... [详细]
  • 小程序自动授权和手动接入的方式及操作步骤
    本文介绍了小程序支持的两种接入方式:自动授权和手动接入,并详细说明了它们的操作步骤。同时还介绍了如何在两种方式之间切换,以及手动接入后如何下载代码包和提交审核。 ... [详细]
  • JavaScript和HTML之间的交互是经由过程事宜完成的。事宜:文档或浏览器窗口中发作的一些特定的交互霎时。能够运用侦听器(或处置惩罚递次来预订事宜),以便事宜发作时实行相应的 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • 工作经验谈之-让百度地图API调用数据库内容 及详解
    这段时间,所在项目中要用到的一个模块,就是让数据库中的内容在百度地图上展现出来,如经纬度。主要实现以下几点功能:1.读取数据库中的经纬度值在百度上标注出来。2.点击标注弹出对应信息。3 ... [详细]
  • 概述H.323是由ITU制定的通信控制协议,用于在分组交换网中提供多媒体业务。呼叫控制是其中的重要组成部分,它可用来建立点到点的媒体会话和多点间媒体会议 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • OWASP(安全防护、漏洞验证工具)开放式Web应用程序安全项目(OWASP,OpenWebApplicationSecurityProject)是一个组织 ... [详细]
author-avatar
mobiledu2502882465
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有