前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >喝杯咖啡,一键部署完成!(建议收藏)

喝杯咖啡,一键部署完成!(建议收藏)

作者头像
悟空聊架构
发布2023-09-01 11:13:59
2420
发布2023-09-01 11:13:59
举报

上一篇我们聊到如何用 Docker 打包部署:丝滑的打包部署,一套带走

这次我们来聊下如何一键部署分支代码到服务器。

本文主要内容如下:

背景

新项目没有完善的部署流程,只能自己先搭一套来顶一顶了。

服务器资源如下:

原理图如下所示:

Jenkins 打包部署原理图

  • Jenkins 部署在一台服务器上,然后安装了很多必备的 Jenkins 插件。比如拉取 Gitlab 仓库代码的插件、远程执行命令和拷贝文件的插件。
  • Jenkins 开始运行一个任务时,通过 Git 插件从 Gitlab 仓库拉取代码到本地目录。
  • Jenkins 通过 JDK 和 Maven 工具对 Java 代码进行打包部署。
  • Jenkins 通过 SSH 插件执行远程命令,将包进行备份、清理操作。
  • Jenkins 将 JAR 包拷贝到远程服务器的固定目录下。
  • Jenkins 执行远程命令,更新服务。

Jenkins 简易安装教程

Jenkins 官方网站对 Jenkins 如何安装已经讲解得非常清晰了,所以这里不再赘述,贴一下官方网站,自行去看吧。

Jenkins 下载地址:

代码语言:javascript
复制
https://www.jenkins.io/download/

Jenkins 安装步骤:

代码语言:javascript
复制
https://www.jenkins.io/doc/book/installing/

安装完成后,我们需要配置 Jenkins。

配置 Jenkins

因为我们要打包部署的项目是 Java 项目,所以需要将 Java JDK 所在的目录和 Maven 所在目录配置到 Jenkins 中,这样 Jenkins 打包时就能利用这两个工具进行打包。

配置全局工具:Maven

配置如下:

Jenkins配置入口

Jenkins Global Tool Configuration

配置环境变量:

  • Java JDK
  • Maven

全局属性配置

上面的配置完成后,我们就可以测试下是否可以将代码仓库中的某个分支的代码拉取下来进行打包。

通过 Jenkins 一键部署

在使用 Jenkins 时,我们必须创建一个任务才行,然后这个任务里面可以配置要执行的各种操作。

Jenkins中自动构建项目的类型有很多,常用的有以下三种:

  • 自由风格软件项目(FreeStyle Project)
  • Maven项目(Maven Project)
  • 流水线项目(Pipeline Project)

每种类型的构建其实都可以完成一样的构建过程与结果,只是在操作方式、灵活度等方面有所区别,在

实际开发中可以根据自己的需求和习惯来选择。

下面演示创建一个简单的自由风格项目来完成项目的集成过程:

拉取代码->编译 Java 项目->备份服务器 JAR 包->删除服务器 JAR 包->拷贝 JAR 包到服务器->更新服务。

创建一个项目

创建一个项目

创建成功后就会出现一条记录:

Dashboard 界面

为了测试我们的 Jenkins 是否能正常拉取代码并打包,我们需要配置 Gitlab 代码仓库的地址、用户名、密码。

配置拉取的代码仓库
  • 仓库 URL
  • 用户名和密码

配置拉取的代码仓库地址和认证方式

配置打包

配置 Maven 打包

代码语言:javascript
复制
echo "开始打包"
mvn clean package
echo "打包完成"

配置到这一步后,我们可以先验证下这些配置是否生效。

运行项目

在 Dashboard 可以看到配置完成的任务,点击 Build Now 按钮即可开始拉取代码、打包项目。

我们还可以从控制台输出看到打包记录。

Jenkins 会从 Gitlab 仓库拉取指定分支的代码,然后运行 mvn clean package 命令,进行打包。

打印 Jenkins 运行项目的结果

输出记录中打印出了以下关键信息:代码拉取后存放在哪,打的 jar 包在哪。

代码和生成的 jar 包在到这个根目录找到:

代码语言:javascript
复制
C:\ProgramData\Jenkins.jenkins\workspace\passjava-dev

还可以从打印日志的最后看到这次打包用时 2 min 33 秒,任务的执行状态为 Finished Success。

接下来就是将这些 JAR 包拷贝到远程服务器地址。

拷贝安装包

安装插件

拷贝安装包需要用到一个插件:Publish Over SSH。

Dashboard>Manage Jenkins->插件管理->Avaliable plugins。

下图是已经安装好了这款插件的截图。

Jenkins 插件管理

配置这个插件的全局配置:

  • SSH Server Name:远程服务器的名字,后面在配置拷贝包的时候可以根据名字选择拷贝到哪台服务器。
  • Hostname:SSH Server 的 Hostname。
  • Username:SSH Server 登录名和密码或密钥。
  • Remote Directory:指定将文件拷贝到哪个目录。

配置远程服务器地址

备份服务器 JAR 包

在上传打包好的 JAR 包之前,需要将应用服务器上的 JAR 备份。

备份的步骤如下:

  • 在远程服务器创建一个备份目录 bak
  • 在备份目录bak上创建一个以当前时间作为目录名的目录。
  • 将远程服务器的上 JAR 重命名为原文件名+时间戳的名字。

备份服务器 JAR 包

拷贝 JAR 包到远程服务器

需要配置以下内容:

  • SSH Server:指定要将文件拷贝到哪个服务器,格式为 <用户名>@<ip 地址>。
  • Transfer Set Source files:jenkins 编译后的 JAR 地址。通过之前的编译信息我们知道,JAR 包地址在如下路径:
代码语言:javascript
复制
C:\ProgramData\Jenkins.jenkins\workspace<Jenkins 任务名><编译目录>
  • Remove prefix:要移除的文件路径前缀。
  • Remte directory:拷贝到哪个路径下,如果之前已经配置过全局的文件夹,则拷贝的文件会放到 <全局文件夹>/之下,如果全局文件夹之下没有这个 Remote directory 目录,则创建一个。这里我们不需要配置,全局配置已经可以满足条件了。
  • 如果还有其他 JAR 包也需要拷贝则需要再添加一项。

拷贝多个 JAR 包到远程服务器

滚动更新服务

项目采用的 Docker Swarm 方式来管理集群中的微服务。

Jenkins 通过 插件 发送命令到应用服务器上执行指定的脚本

配置远程执行脚本的命令

代码语言:javascript
复制
echo "部署 jar 包"
cd /nfs-data/wukong/
nohup sudo sh restart.sh
exit

这个命令使用 nohupsudo 权限来执行名为 restart.sh 的脚本。nohup 命令用于将脚本在后台运行,即使终端会话结束,脚本仍然继续运行。

远程服务器上创建脚本

如果想要 jenkins 执行远程服务器上的脚本,则需要先在远程服务器上创建一个可执行的脚本。

这里我们需要重启服务器的容器服务,所以在这个目录 /nfs-data/wukong/ 编写一个 restart.sh 脚本。

代码语言:javascript
复制
echo "部署 passjava 服务"
nohup sudo docker service update accountservice --force > /nfs-data/wukong/jenkins/account.txt
nohup sudo docker service update gatewayservice --force > /nfs-data/wukong/jenkins/gateway.txt
nohup sudo docker service update qmsservice --force > /nfs-data/wukong/jenkins/qms.txt

这个命令使用--force选项来更新名为"accountservice、gatewayservice、qmsservice"的 Docker 服务。命令的输出被重定向到文件/nfs-data/wukong/jenkins/xxx.txt中。

部署

再次测试是否能正确编译代码,上传 jar 包,部署微服务。

部署结果如下:Finished: SUCESS

部署结果

遇到的问题

问题 1、添加 Git 仓库时,无法访问

SSL certificate problem: unable to get local issuer certificate

解决方案:

代码语言:javascript
复制
git config --system http.sslVerify false

git config --global http.sslVerify false

参考链接:https://stackoverflow.com/questions/39746535/jenkins-git-ssl-certificate-error

问题 2

代码语言:javascript
复制
stderr: fatal: unable to access 'url of my git/': SSL certificate problem: self signed certificate in certificate chain

解决方案:

代码语言:javascript
复制
git config --system http.sslVerify false

git config --global http.sslVerify false

参考链接:https://stackoverflow.com/questions/39746535/jenkins-git-ssl-certificate-error

问题 3

Exception when publishing, exception message

问题 3 的记录

解决方案

远程机器上需要用 sudo 命令执行 docker 命令,这个时候需要输入密码,通过配置账号 xx 执行 sudo 命令不需要输入密码。

解决思路

问题 3 的解决思路

问题 4:could not identify password for [xxx]

问题 4 解决思路

问题 5:ssh 超时配置

代码语言:javascript
复制
ERROR: Exception when publishing, exception message [Exec timed out or was interrupted after 120,011 ms]

问题 5 的记录

解决方案:修改超时时间设置

问题 5 的解决方案

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-06-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 悟空聊架构 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • Jenkins 简易安装教程
  • 配置 Jenkins
  • 通过 Jenkins 一键部署
    • 创建一个项目
      • 配置拉取的代码仓库
      • 配置打包
    • 运行项目
      • 拷贝安装包
        • 安装插件
      • 备份服务器 JAR 包
        • 拷贝 JAR 包到远程服务器
          • 滚动更新服务
            • 远程服务器上创建脚本
              • 部署
              • 遇到的问题
                • 问题 1、添加 Git 仓库时,无法访问
                  • 问题 2
                    • 问题 3
                      • 解决方案
                      • 解决思路
                    • 问题 4:could not identify password for [xxx]
                      • 问题 5:ssh 超时配置
                      相关产品与服务
                      容器服务
                      腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档