LinuxDevOps项目实战教程_持续集成持续部署流程解析
发布时间 - 2026-01-08 00:00:00 点击率:次CI/CD是围绕代码变更建立的可重复、可验证、可回滚的交付节奏,核心为每次提交触发自动化构建测试并通过后自动部署,全程无人工干预。
持续集成(CI)与持续部署(CD)不是工具堆砌,而是围绕代码变更建立的一套可重复、可验证、可回滚的交付节奏。核心在于:每次提交触发自动化构建与测试,通过后自动进入预发布或生产环境,中间不依赖人工干预。
CI/CD 流程的关键节点拆解
一个典型的 Linux DevOps 项目 CI/CD 流程包含以下不可跳过的环节:
- 代码拉取(Git Hook 或 Webhook 触发):推荐用 GitLab CI / GitHub Actions 原生集成,避免自建轮询;分支策略建议 main 为稳定发布分支,develop 为集成分支,feature/* 用于并行开发
-
环境准备(容器化优先):使用 Docker 构建轻量一致的构建环境,例如 Node.js 项目用
node:18-alpine,Python 项目用python:3.11-slim;避免“在我机器上能跑”的问题 -
构建与静态检查:执行
npm install && npm run build或pip install -r requirements.txt && python setup.py sdist,同时加入 ESLint、mypy、shellcheck 等扫描,失败即终止流程 - 自动化测试分层执行:单元测试(快,本地可运行)→ 集成测试(依赖 DB/API Mock)→ 端到端测试(如 Cypress / Selenium),任一环节失败,不进入下一阶段
- 制品归档与镜像推送:构建产物(tar 包 / wheel 文件 / Docker 镜像)统一上传至私有仓库(Nexus / Harbor),打上 Git commit SHA 和语义化标签(如 v1.2.0-rc1)
- 部署策略按环境分级:dev 环境直接覆盖部署;staging 环境做蓝绿或金丝雀验证;production 环境强制需审批(可通过 CI 工具配置 manual job)+ 健康检查(curl 检查 /actuator/health 或 readiness probe)
Linux 下常用 CI/CD 工具链组合
在真实服务器环境落地时,应优先选择轻量、易维护、权限可控的方案:
-
自托管 Runner + Shell 脚本驱动:适合中小团队。用 GitLab Runner 注册到内网 Linux 主机,配合
.gitlab-ci.yml调用本地 shell 脚本完成构建部署,所有操作日志可审计,无需暴露 API Token 到公有云 -
Jenkins Pipeline(Declarative):适合已有 Jenkins 基础的团队。用 Jenkinsfile 定义 stage(build/test/deploy),配合 SSH Plugin 或 Kubernetes Plugin 实现跨主机部署;注意关闭 Script Security Sandbox 中高危函数(如
sh 'rm -rf /') -
GitHub Actions Self-hosted Runner:适合 GitHub 托管代码但需内网部署的场景。将 runner 部署在企业 Linux 服务器上,通过
runs-on: self-hosted调度任务,敏感凭证存于 GitHub Secrets,不落盘
部署安全与可观测性加固要点
CI/CD 流水线本身是攻击面,上线前必须检查:
-
最小权限原则:Runner 运行用户禁止 root,部署目标机器仅开放必要端口(如 22/80/44
3),SSH 使用密钥+证书登录,禁用密码认证 -
制品完整性校验:Docker 镜像启用
cosign sign签名,部署脚本中用cosign verify校验;二进制包发布前生成 SHA256SUMS 并 GPG 签名 - 部署后自动巡检:用 Ansible 或 curl + jq 检查服务端口、响应状态码、关键日志关键词(如 “started”、“ready”);失败自动告警(邮件 / 钉钉 / Webhook)并尝试回滚(调用上一版镜像或备份 tar 包)
- 日志与追踪对齐:CI 日志保留至少 90 天;每个部署 job 输出唯一 trace_id,关联应用日志(ELK)和链路追踪(Jaeger / OpenTelemetry)
从零搭建一个可运行的 CI/CD 示例(GitLab CI)
以 Python Flask 应用为例,在项目根目录创建 .gitlab-ci.yml:
stages: - test - build - deploytest: stage: test image: python:3.11-slim before_script:
- pip install pytest pytest-cov script:
- pytest tests/ --cov=app --cov-report=term-missing artifacts: paths: [htmlcov/] expire_in: 1 week
build: stage: build image: docker:stable services: [docker:dind] before_script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY script:
- docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .
- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
deploy-staging: stage: deploy image: alpine:latest before_script:
- apk add openssh-client script:
- ssh -o StrictHostKeyChecking=no $STAGING_USER@$STAGING_HOST "docker pull $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA && docker tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA $CI_REGISTRY_IMAGE:staging && docker-compose -f docker-compose.staging.yml up -d" only:
- develop
该配置实现:提交到 develop 分支 → 自动测试 → 构建并推镜像 → 部署到预发服务器。所有敏感变量(
$STAGING_USER、$CI_REGISTRY_PASSWORD)在 GitLab 项目 Settings → CI/CD → Variables 中加密配置。
# linux # word # python # html # js # node.js # git # node # docker # github # npm
相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571 】
相关推荐: 高端建站三要素:定制模板、企业官网与响应式设计优化 Laravel Blade模板引擎语法_Laravel Blade布局继承用法 如何用西部建站助手快速创建专业网站? 利用JavaScript实现拖拽改变元素大小 Laravel中的Facade(门面)到底是什么原理 Python自然语言搜索引擎项目教程_倒排索引查询优化案例 如何在IIS中配置站点IP、端口及主机头? Firefox Developer Edition开发者版本入口 如何在服务器上三步完成建站并提升流量? Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例 米侠浏览器网页背景异常怎么办 米侠显示修复 Laravel如何实现多对多模型关联?(Eloquent教程) HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】 Laravel distinct去重查询_Laravel Eloquent去重方法 使用PHP下载CSS文件中的所有图片【几行代码即可实现】 三星网站视频制作教程下载,三星w23网页如何全屏? 如何实现建站之星域名转发设置? 中山网站推广排名,中山信息港登录入口? Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives javascript中的try catch异常捕获机制用法分析 Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程 Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置 香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化 如何在企业微信快速生成手机电脑官网? Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】 合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍? Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案 专业商城网站制作公司有哪些,pi商城官网是哪个? laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程 java ZXing生成二维码及条码实例分享 Laravel怎么判断请求类型_Laravel Request isMethod用法 青岛网站建设如何选择本地服务器? 百度输入法ai组件怎么删除 百度输入法ai组件移除工具 Win11怎么开启自动HDR画质_Windows11显示设置HDR选项 如何在Ubuntu系统下快速搭建WordPress个人网站? 手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站? Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤 如何在香港服务器上快速搭建免备案网站? Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程 Laravel如何使用withoutEvents方法临时禁用模型事件 详解Android——蓝牙技术 带你实现终端间数据传输 制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站? Bootstrap整体框架之JavaScript插件架构 韩国服务器如何优化跨境访问实现高效连接? Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程 Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录 打造顶配客厅影院,这份100寸电视推荐名单请查收 如何在阿里云购买域名并搭建网站? 微信小程序 HTTPS报错整理常见问题及解决方案 linux top下的 minerd 木马清除方法


3),SSH 使用密钥+证书登录,禁用密码认证