【DevOps专项】GitLab 与 Jenkins 介绍及部署持续集成环境
GitLab与Jenkins结合构建持续集成环境1.持续集成概述及运行流程1.1CI/CD介绍编码 → 构建 → 集成 → 测试 → 交付 → 部署1.1.1 持续集成CI 持续集成Continuous integration是指开发者在代码的开发过程中可以**频繁的一天多次将代码合并到主干源码仓库并立刻进行构建、单元测试。**根据测试结果我们可以确定新代码和原有代码能否正确地集成在一起。持续集成的优点快速发现错误。每完成一点开发就集成到主干可以快速发现错误定位错误也比较容易防止分支大幅偏离主干。如果不是经常集成主干又在不断更新会导致以后集成的难度变大甚至难以集成。 **持续集成的目的就是让产品可以快速迭代同时还能保持高质量。**它的核心措施是代码集成到主干之前必须通过自动化测试。只要有一个测试用例失败就不能集成。持续集成并不能消除Bug而是让它们非常容易发现和改正。1.1.2 持续交付CD需要人工审批 持续交付Continuous delivery指的是在持续集成的基础上将集成后的代码部署到更贴近真实运行环境(类生产环境)中。 比如我们完成单元测试后可以把代码部署到连接数据库的Staging环境中做更多的测试。**如果代码没有问题就可以部署到生产环境。**持续交付可以看作持续集成的下一步。它强调的是不管怎么更新软件是随时随地可以交付的。Staging临时工作台1.1.3 持续部署CD完全自动化 持续部署continuous deployment**是持续交付的下一步指的是代码通过评审以后部署到生产环境。持续部署的目标是代码在任何时刻都是可部署的可以进入生产阶段。**持续部署的前提是能自动化完成测试、构建、部署等步骤。总的来说CI/CD提供了一个优秀的 DevOps 环境。对于整个开发团队来说能很大地提升开发效率好处与挑战并行。无论如何频繁部署、快速交付以及开发测试流程自动化都将成为未来软件工程的重要组成部分。1.1.4 持续交付/持续部署区别总结来说持续交付是“箭在弦上引而不发”随时能发但扣动扳机需要人来决定持续部署是“全自动发射系统”只要检测合格自动出膛。对运维工作而言**前者更强调变更可控、审计合规与业务协同后者更考验自动化测试的严密性、监控的敏锐度以及系统的自我修复能力。**绝大多数企业会先做到持续交付等流水线足够稳定、监控回滚机制足够成熟后再挑选非核心业务逐步尝试持续部署。维度持续交付持续部署人工干预生产部署前需人工审批如产品、运维或业务负责人确认全流程无人工干预完全自动化部署触发人工决策何时部署到生产环境代码通过测试后自动部署到生产环境风险控制人工把关提供安全网和控制权依赖完善的自动化测试和监控回滚机制交付频率灵活可控根据业务需求决定高频迭代可能每天多次部署适用场景对稳定性要求高的核心业务系统追求高速迭代、快速响应的互联网产品2.项目部署方式介绍2.1 手动部署完整展示了从版本控制服务器含钩子程序触发经由Jenkins调度通过Git/SVN 插件获取源码再由Maven 插件打包为 War 包最终通过Deploy 插件部署至Tomcat应用服务器的全流程。2.2 自动部署3.实验环境准备]# systemctl disable --now firewalld]# sed -i /^SELINUX/ c SELINUXdisabled /etc/selinux/config172.25.254.44 GitLab172.25.254.45 Jenkins172.25.254.46 Apache3.1 部署GitLab3.1.1GitLab概述官网https://about.gitlab.com国区官网https://gitlab.cn/实现一个自托管的 Git 项目仓库可通过 Web界面进行访问公开的或者私人项目。GitLab 拥有与Github 类似的功能能够浏览源代码管理缺陷和注释。可以管理团队对仓库的访问它非常易于浏览提交过的版本并提供一个文件历史库。它还提供一个代码片段收集功能可以轻松实现代码复用便于日后有需要的时候进行查找。注gitlab-ce 社区版gitlab-ee 是企业版收费3.1.2 部署过程主机内存需要大于4G3.1.2.1 安装gitlab需要组件[rootGitLab ~]# yum install -y curl policycoreutils openssh-server openssh-clients postfix cronie3.1.2.2 安装gitlab-cehttps://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/[rootGitLab ~]# yum install -y curl policycoreutils-python-utils openssh-server perl[rootGitLab ~]# rpm -ivh gitlab-ce-17.1.6-ce.0.el9.x86_64.rpm注GitLab分为社区版GitLab Community Edition和企业版GitLab Enterprise Edition。社区版免费企业版收费但是功能比社区版多。根据目前的需求选择安装社区版GitLab-CE。GitLab官网上有详细的安装说明根据自己的操作系统选择相应的版本按步骤操作即可。3.1.2.3 配置GitLab访问地址# 修改gitlab外部访问地址[rootGitLab ~]# vim /etc/gitlab/gitlab.rbexternal_urlhttp://172.25.254.44可以修改为IP地址也可以修改为自定义的gitlab域名。3.1.2.4 重置GitLab简而言之修改了gitlab.rb后必须运行此命令才能让修改真正起效。[rootcong11 ~]# gitlab-ctl reconfigure它的主要作用是读取主配置文件/etc/gitlab/gitlab.rb中的设置并在后台调用Chef Solo自动化配置管理工具对系统状态进行收敛。具体流程包括生成配置根据gitlab.rb中的参数自动生成各子组件如 Nginx、PostgreSQL、Redis、Puma/Unicorn 等所需的底层详细配置文件。重启/重载服务如果检测到配置变动或文件更新会自动重启或平滑重载相关服务确保新配置生效。3.1.2.5 查看端口并登录至GitLabgitlab默认使用内置的nginx做为web界面。[rootGitLab ~]# ss -antlupe | grep nginx# 浏览器访问http://172.25.254.44[rootGitLab ~]# cat /etc/gitlab/initial_root_passwordPassword:vCuJyM8aVkvP5ZqkObaAdxmiielF2jVLnBbbua4WIV8# http://172.25.254.44- root -vCuJyM8aVkvP5ZqkObaAdxmiielF2jVLnBbbua4WIV83.1.2.6 更改界面语言如果语言没有更改过来的话可以进行刷新网页即可。3.1.2.6 修改密码root Kaser123注意GitLab 的相关参数配置都存在/etc/gitlab/gitlab.rb文件里。GitLab 默认使用 80 端口对外提供服务如安装前服务器有启用80安装完访问会报错。需更改gitlab的默认端口# vim /etc/gitlab/gitlab.rb这时候就可以通更改后的 IP 端口号码进行访问了。每次重新配置都需要执行gitlab-ctl reconfigure使之生效。日志位置/var/log/gitlab可以进去查看访问日志以及报错日志等供访问查看以及异常排查。gitlab-ctl tail#查看所有日志gitlab-ctl tail nginx/gitlab_access.log#查看nginx访问日志3.1.2.7 关闭GitLab注册功能并重启记得进行保存更改[rootGitLab ~]# gitlab-ctl restart# 可以稍微等待一会加载不然就会返回5023.1.2.8GitLab常用命令的使用关闭 gitlab# gitlab-ctl stop启动 gitlab# gitlab-ctl start重启 gitlab# gitlab-ctl restartgitlab 主配置文件/etc/gitlab/gitlab.rb日志地址/var/log/gitlab/服务地址/var/opt/gitlab/仓库地址/var/opt/gitlab/git-data重置配置gitlab-ctl reconfigure重启服务gitlab-ctl stop/start/restart3.2 配置邮箱报警官网各种邮箱配置实例https://docs.gitlab.com/omnibus/settings/smtp.html3.2.1 修改配置文件[rootcong11 ~]# vim /etc/gitlab/gitlab.rbgitlab_rails[smtp_enable]truegitlab_rails[smtp_address]smtp.163.com# SMTP服务器gitlab_rails[smtp_port]465gitlab_rails[smtp_user_name]xxxxxxxxxxxxxx.com# 邮箱账号gitlab_rails[smtp_password]xxxxxxxx# 设备授权码gitlab_rails[smtp_authentication]logingitlab_rails[smtp_tls]truegitlab_rails[gitlab_email_from]xxxxxxxxxxxx.com# 重载[rootGitLab ~]# gitlab-ctl reconfigure3.2.2 登陆控制台发送测试邮件# 登录控制台要等一段时间[rootGitLab ~]# gitlab-rails consoleirb(main):001:0Notify.test_email(xxxx163.com,test,hello world).deliver_now Delivered mail 69e77ca5448de_e3cf2f6c158b4GitLab.mail(759.9ms)irb(main):002:0Notify.test_email(xxxxqq.com,test,hello world).deliver_now3.3 创建群组与账号3.3.1 创建群组3.3.2 创建账号3.3.3 创建项目可以在群组里创建项目也可以创建私有的项目然后使用使用方法跟github一样。点击创建项目创建一个test测试仓库3.4 搭建Jenkins官方官网https://jenkins.io/国区网站https://jenkins.io/zh/**Jenkins 概述**是一个开源软件项目是基于Java开发的一种持续集成、交付、部署的基于web界面的平台用于自动化各种任务包括构建、测试和部署软件。3.4.1 部署Jenkins[rootJenkins ~]# yum install -y fontconfig java-21-openjdk# 上传rpm包[rootJenkins ~]# yum install -y jenkins-2.516.2-1.1.noarch.rpm[rootJenkins ~]# systemctl enable --now jenkins.service[rootJenkins ~]# systemctl status jenkins.service# 浏览器访问http://172.25.254.45:8080[rootJenkins ~]# cat /var/lib/jenkins/secrets/initialAdminPassword80561469586f480abb1a6a9a387459113.4.2 安装插件在线|离线并创建管理员账户安装推荐的插件需要魔法也有可能爆红。就需要重新再次安装如果安装完发现全部爆红。没有关系直接离线手动安装即可。一般来说都是再次安装就是可以的如果不行的话就需要使用Plugins离线安装。# 如果网络环境不对# 此时会发现很慢而且过不去上传资源包里面的文件即可[rootjenkins ~]# cd /var/lib/jenkins/[rootjenkins jenkins]# systemctl stop jenkins.service[rootjenkins jenkins]# rm -fr plugins[rootjenkins ~]# lsjenkins-2.516.2-1.1.noarch.rpm plugins.tar.gz[rootjenkins ~]# tar zxf /root/plugins.tar.gz -C /var/lib/jenkins/[rootjenkins ~]# systemctl enable --now jenkins.service[rootjenkins ~]# systemctl restart jenkins.service # 一定要进行重启[rootjenkins ~]# cat /var/lib/jenkins/secrets/initialAdminPasswordf0d8f8bb85ff4b81aa65db1aff88d0ac# 再次去测试即可# 出现满屏红后退之后进行安装即可adminadmin3.5 配置Jenkins使用GitLab更新代码3.5.1 安装相关补充插件Credentials Plugin默认已经安装 Gitlab Plugin Git Plugin 和 Git Client Plugin GitLab Hook Gitlab Authentication SSH Plugin Publish Over SSH Credentials Plugin Git plugin Git client plugin Git Authentication GitLab GitlabHook Publish Over SSH SSH3.5.2 配置Jenkins免密拉取GitLab代码# 生成密钥对[rootJenkins ~]# ssh-keygen# 查看公钥[rootJenkins ~]# cat .ssh/id_rsa.pubssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCr3TDlySD1FrvnOrv8ae1vkqlp/o44ReEFKT7A19tN7/G4MW2jNxhjDHlszVW8mIJWKyKdo5l2Ed5I4Ieteeq3JsqPMKkf36y15o8QgfjbGJdd9lp21Lh5j2AVEVlgZ7zO1ydZ5tTYkfyLSkQ3xz4dQOVSGwuw664BpMGnmxp7LxvU5kHm5s9ncg4iHvE2vNUrf8cVTkO/vtB2obvVXRjOVMqO8eQbhNkRgBFhqKKg5K0DeGcee6Y3kn9lzJsw2zdivgmQMzbx1WxCWIlRQi7B3y5aodGTvaKY79Fdrj0wIC5wP3X/tMXFZTB9iuJjRBpdx/HcR44Rkjm4W6Z8jyHirKn2Czd33InAXek/8WhQrKBaLHoBBvks8AAnH8VUCoHFmnd8pH2KbnUPAXfUDNYDNLqcBLGKeOip2FFcvDxQdlXSxugePOnyxhHpTHMdsEQsvNbqRPAs6u2dOhoFdmi9zmFbtuzDxC5suQnqkx2N7fK1tbidhFwabp2krootJenkins[rootJenkins ~]# yum install -y git[rootJenkins ~]# git clone git172.25.254.44:dev/test.git[rootJenkins ~]# cd test/[rootJenkins test]# lsREADME.md[rootJenkins test]# cat README.mdThis is Version1.此时实现了免密克隆3.5.3 将id_rsa私钥配置至Jenkins# 查看自己私钥[rootJenkins ~]# cat ~/.ssh/id_rsa-----BEGIN OPENSSH PRIVATE KEY----- xxxx省略省略省略xxxx xxxx省略省略省略xxxx xxxx省略省略省略xxxx xxxx省略省略省略xxxx xxxx省略省略省略xxxx -----END OPENSSH PRIVATE KEY-----