CI/CD

本文档详述了一个自动化部署流程,涉及关闭防火墙和SELinux,使用Git进行版本管理,通过Jenkins自动化构建与部署,利用FTP服务分享软件包,以及在Web服务器上执行自动上线脚本进行部署。整个流程确保了从代码提交到web服务更新的无缝衔接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

永久关闭防火墙和selinux

软件版本管理13

下载到子目录

准备两台web服务器

部署代码到web服务器

自动化部署流程

web服务自动部署

安装httpd服务

编写自动上线脚本


永久关闭防火墙和selinux

[root@git ~]# systemctl stop firewalld
[root@git ~]# systemctl disable firewalld
[root@git ~]# setenforce 0
[root@git ~]# vim +7 /etc/selinux/config
  7 SELINUX=disabled

  • 启动之前准备好的机器:192.168.4.10、192.168.4.20、192.168.4.30

  • 设置gitlab容器开机自启:/etc/rc.local是开机后会自动运行的脚本,写到这个文件中的命令,开机后都会自动运行

[root@git ~]# vim /etc/rc.d/rc.local   # 在文件尾部追加一行内容如下:
... ...
podman start gitlab
[root@git ~]# chmod +x /etc/rc.d/rc.local
配置jenkins
访问http://192.168.4.30:8080,用户名是admin

安装插件:jenkins的很多功能都是能过插件实现的,比如发邮件、比如中文支持。
[root@jenkins ~]# yum install -y tar
[root@jenkins ~]# tar xf jenkins_plugins.tar.gz 
# 拷贝文件的时候,注意选项,-r可以拷贝目录,-p保留权限
[root@jenkins ~]# cp -rp jenkins_plugins/* /var/lib/jenkins/plugins/
[root@jenkins ~]# systemctl restart jenkins
# 刷新web页面,如果出现中文,则插件安装成功

软件版本管理13

  • 可以在git中使用tag标记将某一次commit提交标识为某一版本

 

[root@develop ~]# cd myproject/    # 进入项目目录
[root@develop myproject]# git tag  # 查看标记,默认没有标记
[root@develop myproject]# git tag 1.0  # 将当前提交,标识为1.0
[root@develop myproject]# git tag
1.0
[root@develop myproject]# echo 'hello world' > index.html
[root@develop myproject]# git add .
[root@develop myproject]# git commit -m "add index.html"
[root@develop myproject]# git tag 1.1

# 将本地文件和tag推送到gitlab服务器
[root@develop myproject]# git push    # 只推送文件,不推送标记
[root@develop myproject]# git push --tags

在gitlab上查看标记:

配置jenkins访问gitlab代码仓库 

 

参数化构建过程中,“名称”是自己定义的变量名,用于标识tag或分支

 git仓库地址,在gitlab上找到myproject仓库的http地址,注意将gitlab名称改为IP地址

指定分支构建的时候,使用上面步骤创建的变量$web

 

点击保存。

在项目页面, 可以进行构建测试。

 测试下载

 

构建过程中,边栏左下角会有一个闪烁的灰球,构建成功是蓝球,失败是红球。点击它,可以看详情。

 

 在jenkins上查看下载的内容:

[root@jenkins ~]# ls /var/lib/jenkins/workspace/myproject/
README.md  hosts  passwd

下载到子目录

  • jenkins下载不同的版本到自己的子目录,不共享相同目录

 

新增时,如果没有中文,英文是“checkout to a sub directory”

 

点击保存。

测试:

# 删除之前下载的内容
[root@jenkins ~]# rm -rf /var/lib/jenkins/workspace/myproject/

 执行多次构建,构建不同版本:

查看下载目录:

[root@jenkins ~]# ls /var/lib/jenkins/workspace/myproject/
myproject-1.0  myproject-1.1

 

准备两台web服务器

​​​​​​​
  • web1:192.168.4.100,配置YUM,关闭SELINUX/防火墙
  • web2:192.168.4.200,配置YUM,关闭SELINUX/防火墙 

 

部署代码到web服务器

自动化部署流程

  1. 程序员编写代码,推送到gitlab服务器

  2. Jenkins服务器从gitlab上下载代码

  3. Jenkins处理下载的代码

    • 删除下载目录的版本库
    • 将下载的代码打包
    • 计算程序压缩包的md5值
    • 在Jenkins上安装ftp服务,共享程序压缩包
  4. web服务器下载软件包,并应用(通过脚本实现)

  5. 访问测试

在Jenkins上配置FTP服务器

# 安装vsftpd
[root@jenkins ~]# yum install -y vsftpd

# 启用ftp的匿名访问
[root@jenkins ~]# vim +12 /etc/vsftpd/vsftpd.conf 
anonymous_enable=YES

# 起服务
[root@jenkins ~]# systemctl enable vsftpd --now

# ftp的数据目录默认是/var/ftp。
# 在ftp上创建保存压缩包的路径
[root@jenkins ~]# mkdir -p /var/ftp/deploy/packages
# 因为jenkins服务需要向该目录保存文件,所以设置jenkins对它有权限
[root@jenkins ~]# chown -R :jenkins /var/ftp/deploy
[root@jenkins ~]# chmod -R 775 /var/ftp/deploy/

 访问 ftp:192.168.4.3

 

配置jenkins把gitlab下载的代码打包

在jenkins上修改myproject项目

 

 

# 定义存储软件包路径的变量
pkg_dir=/var/ftp/deploy/packages
# 将下载的代码目录拷贝到下载目录
cp -r myproject-$web $pkg_dir
# 删除下载目录的版本库,不是必须的,只是为了严谨
rm -rf $pkg_dir/myproject-$web/.git
cd $pkg_dir   # 切换到下载目录
# 将下载的目录打包
tar czf myproject-$web.tar.gz myproject-$web
# 下载目录已打包,目录就不需要了,删除它
rm -rf myproject-$web
# 计算压缩包的md5值,保存到文件
md5sum myproject-$web.tar.gz | awk '{print $1}' > myproject-$web.tar.gz.md5
cd ..
echo -n $web > ver.txt   # 将版本号写入文件

以上步骤改好后,保存。

测试修改的任务。

 

 

 

web服务自动部署

安装httpd服务

[root@web1 ~]# yum install -y httpd tar wget
[root@web1 ~]# systemctl enable httpd --now
[root@web1 ~]# ss -tlnp | grep :80
LISTEN    0         128                      *:80                     *:*        users:(("httpd",pid=9721,fd=4),("httpd",pid=9720,fd=4),("httpd",pid=9719,fd=4),("httpd",pid=9717,fd=4))

 

编写自动上线脚本

  • 下载软件包
  • 检查软件包是否损坏
  • 解压、部署到web服务器
[root@web1 ~]# vim /usr/local/bin/web.sh
#!/bin/bash

# 定义软件包服务器和本地路径
ftp_url=ftp://192.168.4.30/deploy
deploy_dir=/var/www/deploy
dest=/var/www/html/tedu-cloud

# 创建用于部署的函数
down_file(){
        # 获取要下载的软件版本
        version=$(curl -s $ftp_url/ver.txt)
        # 下载版本文件到本地
        wget -q $ftp_url/ver.txt -O $deploy_dir/ver.txt
        # 下载软件压缩包
        wget -q $ftp_url/packages/myproject-$version.tar.gz -O $deploy_dir/myproject-$version.tar.gz
        # 计算本地压缩包Md5值
        hash=$(md5sum $deploy_dir/myproject-$version.tar.gz | awk '{print $1}')
        # 获取网上md5文件中的md5值
        ftp_hash=$(curl -s $ftp_url/packages/myproject-$version.tar.gz.md5)
        # 如果文件未损坏则解压
        if [ "$hash" == "$ftp_hash" ]; then
            tar xf $deploy_dir/myproject-$version.tar.gz -C $deploy_dir
        else
            rm -f $deploy_dir/myproject-$version.tar.gz
        fi
        # 如果存在目标软链接,先删除它
        if [ -e "$dest" ]; then
        	rm -f $dest
        fi
        # 创建软链接
        ln -s $deploy_dir/myproject-$version $dest
}

# 如果$deploy_dir不存在,先创建它
if [ ! -e "$deploy_dir" ]; then
	mkdir $deploy_dir
fi

# 如果本地不存在版本文件,则意味着是新服务器,要部署软件
if [ ! -f $deploy_dir/ver.txt ]; then
    down_file
fi

# 如果本地存在版本文件,但是和服务器上的版本文件不一样,则要部署新版本
if [ -f $deploy_dir/ver.txt ]; then
        ftp_ver=$(curl -s $ftp_url/ver.txt)
        local_ver=$(cat $deploy_dir/ver.txt)
        if [ "$ftp_ver" != "$local_ver" ]; then
            down_file
        fi
fi
[root@web1 ~]# chmod +x /usr/local/bin/web.sh
[root@web1 ~]# yum install -y wget
[root@web1 ~]# web.sh 
# 访问http://192.168.4.100/tedu-cloud/可以看到部署的文件
[root@web1 html]# ls /var/www/html/
tedu-cloud

完整测试流程:

  • 程序员编写新版本并推送到服务器
  • Jenkins上构建新版本
  • web服务器上执行web.sh部署新版本
# 程序员编写新版本
[root@develop myproject]# vim index.html 
<marquee>Welcome to tedu</marquee>
[root@develop myproject]# git add .
[root@develop myproject]# git commit -m "modify index.html"
[root@develop myproject]# git tag 2.0
# 程序员推送到服务器
[root@develop myproject]# git push
[root@develop myproject]# git push --tags

 

 

# web服务器上执行`web.sh`部署新版本
[root@web1 html]# web.sh 
[root@web1 html]# ls /var/www/deploy/
myproject-1.1         myproject-2.0         ver.txt
myproject-1.1.tar.gz  myproject-2.0.tar.gz
# 访问http://192.168.4.100/tedu-cloud
03-14
<think>好的,我现在需要处理用户关于CI/CD原理及实现流程的查询。首先,我得确认用户的需求是什么。他们提到了想了解CI/CD的概念或实现方法,特别是原理和流程。根据用户的引用内容,他们可能已经接触过一些基础信息,但需要更系统的解释。 首先,我要回顾CI/CD的基本概念。CI是持续集成,CD可以是持续交付或持续部署。需要区分这三个术语,并解释它们之间的关系。用户提供的引用[1]提到CI/CD阶段涉及人员、过程和技术,这可能是一个结构化的切入点。此外,引用[2]提到GitLab CI/CD的触发机制,这可以作为实现方法的一个例子。 接下来,我需要组织回答的结构。用户希望结构清晰,分步解释。可能需要分为原理和实现流程两部分。原理部分要涵盖CI和CD的核心目标,比如自动化测试、快速反馈、减少手动干预等。实现流程则可以按照阶段来划分,如代码提交、构建、测试、部署等,并结合引用中的内容,比如CI/CD管道被触发的条件。 还要注意用户提到的系统级指令,比如使用正确的中文,数学公式的格式,但这里可能不需要数学公式,不过要确保LaTeX正确。同时,生成相关问题,可能需要考虑CI/CD的不同方面,如工具选择、优化方法、与DevOps的关系等。 需要检查用户提供的引用内容是否相关。引用[1]讨论了CI/CD的阶段和管道的重要性,引用[2]提到了触发CI/CD管道的机制。这些可以作为支持材料,在回答中适当引用,以增强可信度。 可能存在的一个问题是,用户引用的内容似乎部分与CI/CD相关,但引用[1]提到“CI/CD阶段:了解人员、过程和技术”,而引用[2]是关于GitLab CI/CD的触发方式。需要确保在回答中正确引用这些内容,比如在解释流程时提到自动化触发,或者在讨论阶段时引用[1]。 另外,用户要求生成相关问题,需要确保问题涵盖原理、实现细节、工具、挑战等方面,以帮助用户进一步探索。例如,可能的问题包括CI/CD管道的组成部分、如何选择工具、与传统方法的对比等。 最后,要确保回答符合格式要求:使用中文,结构清晰,分点说明,引用标识自然添加。避免使用Markdown格式,但用户提供的示例中有代码块,可能需要用类似的格式展示CI/CD流程的示例,但根据系统指令,用户可见层可能需要避免代码块,或者用文字描述。需要再次检查系统指令,用户可见层是否允许代码块。根据示例,用户可见层中的回答可以有代码块,比如示例中的Python代码,所以在实现流程中可以加入一个YAML配置示例,比如GitLab CI/CD的.gitlab-ci.yml文件示例,用代码块展示。 总结步骤: 1. 定义CI/CD及其核心概念。 2. 分原理和实现流程两部分详细说明。 3. 结合引用内容,如CI/CD阶段和触发机制。 4. 提供实现流程的步骤,并附上示例代码块。 5. 生成相关问题,覆盖原理、工具、优化等。</think>### CI/CD 原理及实现流程 #### 一、CI/CD 核心概念 **CI(持续集成)** 是频繁将代码变更合并到主干分支的过程,通过自动化构建和测试快速发现错误,确保代码质量[^1]。 **CD(持续交付/持续部署)** 是 CI 的延伸: - **持续交付**:自动将已验证的代码部署到类生产环境,但需手动触发最终发布。 - **持续部署**:完全自动化地将代码发布到生产环境,无需人工干预。 #### 二、实现原理 1. **自动化流程** CI/CD 通过工具链(如 GitLab CI、Jenkins)实现代码提交→构建→测试→部署的全流程自动化,减少人为错误并提升效率[^2]。 2. **快速反馈机制** 每次代码提交触发自动化测试,开发者可即时修复问题,避免缺陷累积。 3. **环境一致性** 使用容器化技术(如 Docker)或配置管理工具(如 Ansible),确保开发、测试、生产环境的一致性。 #### 三、典型实现流程 1. **代码提交与触发** 开发者将代码推送到远程仓库(如 GitLab),触发 CI/CD 管道[^2]。 ```yaml # GitLab CI 示例 (.gitlab-ci.yml) stages: - build - test - deploy build_job: stage: build script: - echo "编译代码..." - make build test_job: stage: test script: - echo "运行单元测试..." - make test deploy_job: stage: deploy script: - echo "部署到生产环境..." - make deploy ``` 2. **构建阶段** 编译代码并生成可执行文件或容器镜像。 3. **测试阶段** 执行单元测试、集成测试、安全扫描等。 4. **部署阶段** 根据策略自动部署到指定环境(如测试环境、生产环境)。 #### 四、核心价值 - **缩短交付周期**:自动化减少手动操作,加速迭代[^1]。 - **提高软件质量**:早期间题发现降低修复成本。 - **支持 DevOps 协作**:打通开发与运维团队间的壁垒。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值