当前位置: 首页 > article >正文

使用GitLab+Jenkins搭建CICD执行环境

使用GitLab+Jenkins搭建CI\CD执行环境

    • 前言
    • 什么是DevOps?
    • 什么是CI/CD?
    • 使用GitLab+Jenkins搭建CI\CD执行环境
      • GitLab安装
        • 1. 安装和配置所需的依赖
        • 2. 下载并安装极狐GitLab
        • 3. 登录极狐GitLab 实例
        • 4.常用gitlab指令
        • 5.修改密码
      • Jenkins安装
        • 1.Jenkins 的主要特点和用途
        • 2.下载
        • 3.启动
        • 4.配置镜像源
        • 5.配置与初始化
    • 基于GitLab+Jenkins快速实现CI\CD
      • 1、创建一个maven项目
      • 2、配置项目构建及部署过程
    • 项目打包及部署方式可能出现的问题以及优化

前言

本篇文章主要讲解一些运维方面的知识,但不会涉入大深,毕竟我只是一个后端开发人员。但是,就会有很多小伙伴问了,我做后端开发的,为什么要学习运维人员的知识?那要运维的人干什么等等等等…我要说的是,虽然现在一个产品的开发,划分了很多的部分,比如前端,后端,测试,运维等等,但是现在企业也会要求求职人员具备一些其他方面的知识,为什么呢?因为当我们系统报错的时候,都有判断出到底是哪里出错了,快速对问题进行解决,而不是运维人员发现问题,就将系统停掉,再交给开发人员进行修改,这样太浪费时间。因此,在现代化的大型软件项目中,对于开发人员的要求也更为全面。虽然开发人员不要求像专业的运维人员一样,掌握服务器的各种安全策略、参数调优等。但是对于基础的运行环境运维操作也必须要了解,这样才能指导运维人员进行业务环境部署,也就是开发运维一体化。虽然现在有很多工具能够帮助开发人员减少一些复杂的操作,但是开发人员还是需要更多的接触运维的工作。由于开发和运维分开,也给项目开发过程中带来了很多困难。一方面,开发人员只能向运维人员描述具体的部署方式。但是由于开发人员无法接触到生产服务器,所以文字描述的方式往往很难保证操作的准确性。经常会出现开发人员在开发环境运行得很好的迭代包,升级到生产环境上之后无法保证升级的效果。对于现在流行的基于敏捷开发的大型项目来说,很多需求需要以代码分支的方式进行并行开发,然后再合并部署,这其中更是非常容易出现错误,造成生产环境不稳定。另一方面,当项目在线上运行出现故障时,开发人员也很难第一时间接触到错误日志。如果线上出现问题,开发人员往往需要找运维部门协同,才能获取到生产环境的服务日志。这会极大的延缓错误排查的及时性。为了解决这些问题,就诞生了DevOps和CI/CD。

什么是DevOps?

DevOps是Development(开发)和Operation(运维)两个单词的组合,他是一种重视软件开发人员和运维技术人员之间沟通合作的文化、运动或者惯例。通过自动化软件交互和架构变更的流程,使得构建、测试、发布软件时能够更加快捷、频繁和可靠。总的来说更偏向于是一种标准,一种规范。

什么是CI/CD?

在这里插入图片描述

CI/CD可以说就是DevOps的具体实现, CI\CD中的CI指的是持续集成Continuous Integeration,他是开发人员的自动化过程。成功的CI意味着人员同的新代码变更会定期构建、测试并合并到共享存储库(比如Git或者SVN)。而CD指的是持续交付Continuous Delivery和持续部署Continuous Deployment。成功的CD意味着运维人员可以从共享存储库中持续获取到最新的产品副本,并确保最新的产品副本可以正确更新到服务器上。

使用GitLab+Jenkins搭建CI\CD执行环境

了解了一些运维的官方术语后,我们就快速的尝试搭建一下CI\CD执行环境。

GitLab安装

GitLab是企业中最为常用的私有代码仓库解决方案。你可以把他理解为一个企业自己搭建的GitHub或者Gitee。企业通常会通过GitLab搭建自己的代码仓库,开发人员的应用代码都通过GitLab进行协同开发。

GitLab是一个开源项目,分为免费的ce社区版和收费的ee企业版。这里介绍ce社区版的安装过程。

1. 安装和配置所需的依赖

在 CentOS 7 上,下面的命令会在系统防火墙中打开 HTTP、HTTPS 和 SSH 访问。这是一个可选步骤,如果您打算仅从本地网络访问极狐GitLab,则可以跳过它。

sudo yum install -y curl policycoreutils-python openssh-server perl  //依赖插件
sudo systemctl enable sshd
sudo systemctl start sshd
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo systemctl reload firewalld

(可选)如果要使用 Postfix 来发送电子邮件通知,执行以下安装命令。

sudo yum install postfix
sudo systemctl enable postfix
sudo systemctl start postfix

在安装 Postfix 的过程中可能会出现一个配置界面,在该界面中选择“Internet Site”并按下回车。把“mail name”设置为您服务器的外部 DNS 域名并按下回车。如果还有其他配置界面出现,继续按下回车以接受默认配置。

如果您想使用其他解决方案发送电子邮件,请跳过上面 Postfix 安装步骤并在安装极狐GitLab 后配置外部 SMTP 服务器。

2. 下载并安装极狐GitLab

执行以下命令配置极狐GitLab 软件源镜像。

curl -L get.gitlab.cn | bash

接下来,安装极狐GitLab。安装之前,需要确保您的DNS设置正确。

此外,如果需要修改访问的地址和端口,可以修改/etc/gitlab/gitlab.rb配置文件,修改其中的external_url属性即可

external_url 'http://192.168.101.65:8090'

如果您想为初始管理员用户( root )指定自定义的初始密码,可以根据文档指导进行配置。否则将默认生成随机密码。

接下来执行如下命令开始安装:

sudo EXTERNAL_URL="https://gitlab.example.com" yum install -y gitlab-jh
3. 登录极狐GitLab 实例

使用第二步 EXTERNAL_URL 中配置的地址来访问安装成功的极狐GitLab 实例。用户名默认为 root 。如果在安装过程中指定了初始密码,则用初始密码登录,如果未指定密码,则系统会随机生成一个密码并存储在 /etc/gitlab/initial_root_password 文件中, 查看随机密码并使用 root 用户名登录。

在这里插入图片描述

注意:出于安全原因,24 小时后,/etc/gitlab/initial_root_password 会被第一次 gitlab-ctl reconfigure 自动删除,因此若使用随机密码登录,建议安装成功初始登录成功之后,立即修改初始密码。

服务启动完成后,就可以访问gitlab服务了。用自己修改的ip加端口访问。

在这里插入图片描述

接下来就可以登录进入GitLab,维护基础权限信息,并将项目代码上传到Git仓库当中。这些基础的操作跟GitHub或者Gitee基本上是一样的。

4.常用gitlab指令
  • gitlab-ctl reconfigure 重新配置gitlab。

  • gitlab-ctl start 启动gitlab

  • gitlab-ctl stop 停止gitlab

  • gitlab-ctl restart 重启gitlab

  • gitlab-ctl status 查看gitlab服务状态

  • gitlab-ctl tail 查看gitlab服务日志。

5.修改密码

如果忘记密码怎么办?输入一下指令即可

gitlab-rails console   //连接gitlab
u=User.where(id:1).first  //拿到root账户
u.password='12345678'
u.password_confirmation='12345678'  //修改密码为12345678
u.save! //保存
exit //关闭连接
gitlab-ctl restart 重启gitlab

完成以上操作,使用新密码登录即可。

Jenkins安装

1.Jenkins 的主要特点和用途

自动化构建:Jenkins 可以从源代码库(如Git、SVN 等)中获取最新的代码,并自动进行构建。它支持各种构建工具和构建脚本,如Ant、Maven、Gradle 等。

持续集成:Jenkins 可以将多个开发者的代码集成到共享的主线分支中,并定期执行构建和测试。这有助于发现和解决集成问题,确保软件的稳定性和可靠性。

测试自动化:Jenkins 可以与各种测试框架和工具集成,如 JUnit、Selenium、JMeter 等。它可以自动执行各种测试,并生成测试报告和分析结果。

部署自动化:Jenkins 可以自动化部署应用程序到目标服务器或云平台。它支持各种部署工具和配置管理工具,如 Docker、Kubernetes、Ansible 等。

插件生态系统:Jenkins拥有一个强大的插件生态系统,提供了各种功能和集成选项。用户可以根据需要选择和安装插件,以扩展和定制 Jenkins 的功能。

2.下载

Jenkins是企业最常用的一个自动化部署软件。下载地址为https://www.jenkins.io/download/ 。建议下载LTS(长期支持)版本的war包部署。下载获取jenkins.war文件。

首先,需要安装JDK。 Jenkins运行需要JDK环境支持。Java Support Policy通过这个链接,对照自己jdk版本,下载合适的war包

War Jenkins的历史版本链接 我下方演示的是jdk17和Jenkins2479.2.因为用其他版本安装插件比较麻烦,所以选择最新的版本。
在这里插入图片描述

3.启动

配置完成就可以直接启动Jenkins。 启动指令

java -jar Jenkins.war --httpPort=8080   //默认端口8080,可指定别的端口
nohup java -jar jenkins.war & //后台启动。这种方式不会占用当前命令行窗口,日志输出到nohup.out下。

在第一次启动的过程中,Jenkins会在日志文件中打印默认的admin用户密码。这个需要留意一下。

*************************************************************
Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:
e3c2de8a2084429ea733ef30512a0523
This may also be found at: /root/.jenkins/secrets/initialAdminPassword
*************************************************************
4.配置镜像源

建议先配置镜像地址,因为后续需要下载插件,会很慢

找到 jenkins 的工作目录.jenkins ,查看启动日志信息,信息=里面告诉了工作目录位于什么地方。
在这里插入图片描述
在这里插入图片描述

找到 hudson.model.UpdateCenter.xml 文件打开.将 https://updates.jenkins.io/update-center.json 替换成国内镜像网址(需要管理员权限修改)

国内镜像网址:https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

updates 目录下,编辑 default.json 文件,将该文件中国外的地址全部替换成国内的(需要管理员权限修改)

https://www.google.com 替换成 https://www.baidu.com
https://updates.jenkins.io/download 替换成 https://mirrors.tuna.tsinghua.edu.cn/jenkins

修改完配置之后需要重启 jenkins。

5.配置与初始化

启动完成后,就可以访问Jenkins的前台管理页面http://localhost:8080/。第一次访问时,前端页面会会引导进行一些初始化工作。例如,需要输入admin用户的默认密码,这个密码就在启动日志当中。

在这里插入图片描述

然后会引导安装一些插件。这一步比较自由。你可以按照默认方式安装,也可以选择一些你认识的常用插件安装。关键插件漏了没有关系,后续也可以再安装插件。建议后面自己按需安装。

在这里插入图片描述

配置管理员账号密码

在这里插入图片描述

再配置一下端口就能正常的访问,localhost替换成127.0.0.1使用,然后就可以进入到jenkins的首页。

在这里插入图片描述

接下来需要安装几个核心的插件。选择 Manage Jenkins-> Manage Plugins,进入插件管理页面。

在这里插入图片描述
在这里插入图片描述

在这里需要安装几个核心的插件。包括Git 、Git client、NodeJS Plugin、Maven integration plugin。如果你希望Jenkins能够更多的显示中文,还可以安装 Localization:Chinese(Simplified)插件。下载完成后有些插件需要重启才能生效。Jenkins重启的方式是直接在浏览器上访问restart接口。

在这里插入图片描述

基于GitLab+Jenkins快速实现CI\CD

接下来需要在Jenkins中配置一个构建任务。下面就以一个demo项目的后端工程为例,演示配置过程。

1、创建一个maven项目

在Jenkins首页选择新建Item,然后选择构建一个maven项目

在这里插入图片描述

2、配置项目构建及部署过程

接下来在Jenkins中配置项目的配置项还是挺多的,这里只列出几个关键的配置。其他部分可以自行调整。

首先需要在源码管理部分配置对应的git仓库地址,从gitlab上拉取源代码。

在这里插入图片描述

构建触发器部分,可以选择配置Poll SCM选项。这个选项可以定时扫描Git代码仓库。当发现Git仓库代码有变化,即有代码提交时,就会触发一次构建任务.
在这里插入图片描述

这里面Poll SCM是一个比较常用的配置。通过这个配置,可以让jenkins定期去检查代码库。如果发现代码库有更新,则自动触发当前任务,完成项目的构建以及部署。当前项目编译任务太重,提交也不太频繁,所以就选择不配置该属性。

接下来的Build部分,就可以选择需要执行的编译脚本。

在这里插入图片描述

这一步相当于指定使用 mvn package -Dmaven.test.skip=true指令对后端项目进行重新打包构建。

如果是前端项目,就需要用Nodejs的npm run build指令来构建。

构建完成之后,就会在后端项目的各个模块的target目录下生成可执行的包。这时,可以选择用Jenkins将这些Jar包分发到远程服务器上,并直接运行。

前端项目也可以用同样的方式传递到远端服务器上。远端指令只需要执行 nginx -s reload 更新一下即可。

这样就完成了一个基础项目的配置过程。接下来,保存之后,就可以选择Jenkins首页对应项目右侧的三角指令发起一次构建了。构建过程中如果有问题,可以查看构建日志,进行排查。

这里完成的是一个最简单的Maven项目构建。实际上,在企业中,还会构建更复杂的任务。

例如集成Docker,进行虚拟化部署。

添加Blue Ocean插件做一些代码质量检测,邮件通知等复杂的步骤。甚至使用Pepeline构建更为复杂的任务流水。

或者搭建SonarQube服务,并通过jenkins集成。这样就可以使用SonarQube服务来进行代码质量检测。

项目打包及部署方式可能出现的问题以及优化

基于Jenkins的CI\CD配置方式就是执行Maven对项目进行编译,然后将Jar包传到远端服务器上执行。这个过程跟我们手动进行任务部署是差不多的,只不过Jenkins将这些过程自动完成了。

但是这里其实有一个小问题。当前电商项目在编译时,是在pom.xml中采用SpringBoot的Maven插件将整个项目打成了一个可执行的Jar包。 这样打出来的Jar包可以直接使用Java -jar指令执行。

<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.3.2.RELEASE</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
                <!-- 解决运行包不能被其他包依赖的问题 -->
                <configuration>
                    <classifier>exec</classifier>
                </configuration>
            </plugin>
        </plugins>
</build>

但是,这种方式也有一个很大的问题,就是Jar包太大了。这么大的Jar包,编译会很耗时,并且在网络中传输是非常麻烦的。所以,对于一些大型项目,通常不会采用这种一体化的fat Jar的方式。而会选择将依赖单独打成小的Jar包。这样后续每次更新只需要更新调整过的少量Jar包即可。那有哪些Maven打包方式可以帮助我们打出小的jar包呢?

其实Maven提供了很多的打包插件。例如将上面的plugin部分替换为maven-dependency-plugin,就可以将项目打成小包。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <!-- <version>2.10</version> -->
    <executions>
        <execution>
            <id>copy-dependencies</id>
            <phase>package</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <outputDirectory>export</outputDirectory> <!-- 将依赖包放入export文件夹 -->
                <excludeTransitive>false</excludeTransitive>
                <stripVersion>true</stripVersion>
            </configuration>
        </execution>
    </executions>
</plugin>

通过这种方式,就可以将所有依赖的jar包都放到export文件夹中,target目录下的jar包只包含当前项目的源码,文件大小就会小很多。

将export目录下的所有jar包和target下的当前项目jar包上传到服务器的同一个目录当中,就可以直接运行了。这种方式就跟很多开源框架的运行方式相似了。至于要如何运行呢?当然就不能用java -jar指令简单执行了,需要通过java -cp指令指定依赖包和主启动类执行。至于如何使用这个指令,你之前学过的很多开源组件都可以提供帮助了。比如shardingproxy、RocketMQ等,都有这样的脚本。

这里也给出一个简单的Linux执行脚本示例,供你参考。

more runapp.sh 
#!/bin/sh
#执行jar包
RUN_LIBS=""
#依赖jar包 自行制定目录
SUPPORT_LIBS=""
RUN_LIB_PATH="/app/lib"
SUPPORT_LIB_PATH="/app/support"
#加载程序包
for i in ${RUN_LIB_PATH}/* ; do
   RUN_LIBS=${RUN_LIBS}:$i
done
#加载依赖包
for i in ${SUPPORT_LIB_PATH}/* ; do
   SUPPORT_LIBS=${SUPPORT_LIBS}:$i
done
#整合classpath
CLASSPATH=${RUN_LIBS}:${SUPPORT_LIBS}
export CLASSPATH
#调用java指令执行。-D输入参数 java中可以用 System.getProperties读取。同时指定执行入口类 SpringBootApplication  这是一个典型的Springboot的执行方式。
java  -Xdebug  -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,address=27899,suspend=n -cp $CLASSPATH  -Dspring.profiles.active=prod com.tuling.TulingmallCartApplication -D
user.timezone=GMT+08 1>tulingmall-admin.out 2>tulingmall-admin.err &
echo Start App Success!

实际上这样定制脚本对于提高运行效率是非常重要的,你学了很多次的JVM调优就体现在脚本定制的过程中。在脚本最后的java指令中,可以添加哪些优化参数?

另外,这种部署方式,你可以自己尝试用jenkins配置自动部署吗?

实际上,Maven还提供了非常多插件。比如对于很多复杂的项目,可能需要将不同的模块输出到多个不同的jar包当中,而不是所有代码全都输出一个jar包。下面就是使用maven-jar-plugin插件的一个可行的示例,将不同模块的代码分别整合到test1.jar和test2.jar中。有兴趣你可以自己尝试下。

<plugin> 
  <groupId>org.apache.maven.plugins</groupId>  
  <artifactId>maven-jar-plugin</artifactId>  
  <version>3.0.2</version>  
  <configuration>  <!-- manifest配置信息 主要是可以配置主执行类。有主执行类,可以用java-jar直接执行。没有的话就需要指定执行类 -->
    <archive> 
      <manifest> 
        <addClasspath>true</addClasspath>  
        <classpathPrefix>support/</classpathPrefix>  
        <mainClass>com.kklmars.Test1Application</mainClass> 
<!-- 可以按上面的方式自己配置,也可以指定MF文件打包。 -->
        <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
      </manifest> 
    </archive>  
  </configuration>
  <executions> 
    <execution> 
      <id>test2-jar</id>  
      <phase>package</phase>  
      <goals> 
        <goal>jar</goal> 
      </goals>  
      <configuration> 
        <classifier>test1</classifier>  
        <includes> 
          <include>com/kklmars/**</include>  
          <include>mybatis/**</include>  
          <include>templates/**</include>  
          <include>*.properties</include>  
          <include>dubbo.xml</include> 
        </includes> 
      </configuration> 
    </execution>  
    <execution> 
      <id>test2-jar</id>  
      <phase>package</phase>  
      <goals> 
        <goal>jar</goal> 
      </goals>  
      <configuration> 
        <classifier>test2</classifier>  
        <includes> 
          <include>com/test2/crawler/*</include>  
          <include>com/test2/crawler/*</include>  
          <include>com/test2/utils/**</include>  
          <include>log4j.properties</include> 
        </includes> 
      </configuration> 
    </execution>  
  </executions> 
</plugin>

如果你对Maven感兴趣,可以去Maven官网上看看Maven目前官方提供的插件。 https://maven.apache.org/plugins/index.html。 这上面能找到非常多有趣的插件,并且都有详细的说明。比如changelog插件,可以打印出Maven仓库中最近的提交记录。checkstyle和pmd插件可以对代码进行静态检查。javadoc插件可以打印出项目文档,你还可以用pdf插件,打印出pdf版本的项目文档。或者使用antrun插件去执行一些ant脚本(老程序员应该对ant很熟悉)。

以上就是本篇博客的全部内容,环境这块配置也是十分复杂的,总容易出现各种各样的问题,我也在配置过程中不断进行修正,最终成功运行,希望各位小友在阅读后也能自己动手实践。遇到问题自己动手解决,这样才能够收获更多的经验。最后希望各位能够点赞关注收藏,让我能够发表更多的文章。


http://www.kler.cn/a/467028.html

相关文章:

  • 如何通过API实现淘宝商品评论数据抓取?item_review获取淘宝商品评论
  • Android中创建ViewModel的几种方法
  • 4.1.2 栈和队列(一)
  • [python3]Excel解析库-xlutils
  • v-model与 mvvm 回顾
  • 在Linux中,如何查看和修改网络接口配置?
  • 滴滴工作流引擎Turbo与logicFlow研究
  • 嵌入式ARM平台 openwrt系统下 基于FFmpeg 的视频采集及推流 实践
  • TypeScript 快速入门指南
  • Java.函数-acwing
  • docker容器间基于Link单向通信
  • 搭建macOS虚拟机环境
  • 【C++】你了解异常的用法吗?
  • ASA第六天笔记
  • 怎样认识camera-ISP
  • Linux(Centos 7.6)命令详解:ls
  • 不锈钢均温板结合强力粘合技术革新手机内部架构
  • Java100道面试题
  • GaussDB逻辑解码技术原理深度解析
  • 使用JMeter玩转tidb压测
  • df.replace(regex={‘b‘: {r‘\s*\.\s*‘: np.nan}})
  • Java项目实战II基于小程序的驾校管理系统(开发文档+数据库+源码)
  • 如何判断状态:停留还是移动。【计算加速度de方案】
  • 计算机网络——数据链路层-功能、组帧和差错控制
  • 博客标题:使用Go和RabbitMQ构建高效的消息队列系统
  • IEEE PDF eXpress遇到Font TimesNewRomanPSMT is not embedded的解决方案