CI/CD 与 DevOps 二

CI/CD + DevOps 完整示例 Demo

整体方案:GitLab + GitLab CI + Docker + Nginx + 服务器 实现效果:本地提交代码 → 自动构建 Docker 镜像 → 自动部署到服务器,一套完整 DevOps 流水线。


一、整体架构

  1. 开发:本地编写简单 Web 项目
  2. 代码托管:GitLab
  3. CI:代码提交自动编译、构建、镜像打包
  4. CD:自动推镜像、远程部署到服务器
  5. 运维:服务器 Docker 运行,Nginx 反向代理

二、项目结构(示例:极简 Node.js Web)

新建文件夹 devops-demo

plaintext

复制代码
devops-demo/
├── app.js          # 简单web服务
├── Dockerfile      # 镜像构建
├── .gitlab-ci.yml  # CI/CD核心流水线配置
└── nginx.conf      # Nginx反向代理

1. app.js(Node.js 示例)

js

复制代码
const express = require('express');
const app = express();
const port = 3000;

app.get('/', (req, res) => {
  res.send(`DevOps CI/CD Demo - ${new Date()}`);
});

app.listen(port, () => {
  console.log(`服务启动: http://localhost:${port}`);
});

2. Dockerfile

dockerfile

复制代码
FROM node:18-alpine
WORKDIR /app
COPY package.json .
RUN npm install express
COPY . .
EXPOSE 3000
CMD ["node", "app.js"]

3. package.json

json

复制代码
{
  "name": "devops-demo",
  "dependencies": {
    "express": "^4.18.2"
  }
}

4. nginx.conf

nginx

复制代码
server {
    listen 80;
    server_name _;

    location / {
        proxy_pass http://demo-service:3000;
        proxy_set_header Host $host;
    }
}

5. .gitlab-ci.yml(CI/CD 核心配置,最重要

yaml

复制代码
# 阶段:构建 → 打包镜像 → 部署
stages:
  - build
  - build_image
  - deploy

# 1. 构建阶段:编译、单元测试
build:
  stage: build
  image: node:18
  script:
    - npm install
    - echo "构建完成"

# 2. 打包Docker镜像,推送到镜像仓库(DockerHub)
build_image:
  stage: build_image
  image: docker:latest
  services:
    - docker:dind
  script:
    - docker login -u $DOCKER_USER -p $DOCKER_PWD
    - docker build -t $DOCKER_USER/devops-demo:latest .
    - docker push $DOCKER_USER/devops-demo:latest

# 3. CD部署:远程SSH到服务器,拉镜像重启容器
deploy:
  stage: deploy
  image: alpine:latest
  script:
    - apk add openssh-client
    - ssh-keyscan $SERVER_IP >> ~/.ssh/known_hosts
    - ssh root@$SERVER_IP "
        docker pull $DOCKER_USER/devops-demo:latest;
        docker stop demo-service || true;
        docker rm demo-service || true;
        docker run -d --name demo-service --restart always -p 3000:3000 $DOCKER_USER/devops-demo:latest;
      "

三、服务器环境准备(DevOps 运维侧)

1. 服务器安装

bash

运行

复制代码
# 安装docker
yum install docker -y
systemctl start docker
systemctl enable docker

# 安装nginx
yum install nginx -y
systemctl start nginx

2. Nginx 部署配置

上传 nginx.conf/etc/nginx/conf.d/default.conf 重启 nginx:

bash

运行

复制代码
nginx -s reload

3. 开放端口

安全组放行:80、3000


四、GitLab CI 配置(关键环境变量)

GitLab 项目 → 设置 → CI/CD → 变量,添加:

  1. DOCKER_USER:DockerHub 用户名
  2. DOCKER_PWD:DockerHub 密码
  3. SERVER_IP:你的云服务器公网 IP
  4. SSH_PRIVATE_KEY:服务器私钥(免密登录)

五、完整 DevOps CI/CD 运行流程

  1. 本地修改代码 → git push 提交到 GitLab
  2. GitLab CI 自动触发流水线
  3. CI 阶段:自动安装依赖、构建、测试
  4. 打包镜像:构建 Docker 镜像并推送到 DockerHub
  5. CD 部署:SSH 登录服务器,拉取镜像,重启容器
  6. 访问服务器 IP:http://你的IP,看到页面自动更新

六、扩展:DevOps 完整闭环(监控 + 日志)

在服务器上部署:

  • Prometheus + Grafana:监控容器 CPU / 内存 / 接口状态
  • ELK:收集日志 实现:开发 → CI/CD 上线 → 监控告警 → 迭代优化 完整 DevOps 闭环
相关推荐
zhengqweasd4 分钟前
流量没跑满、带宽空闲,业务依然卡顿
运维·服务器·网络
Y3815326622 小时前
Docker Compose 服务依赖与健康检查:healthcheck 让容器按正确顺序启动
运维·docker·容器
稳联技术老娜2 小时前
伺服内嵌EtherNet IP方案:嵌入式小板SPI通讯固件Demo程序适配改造
运维·服务器·网络
en.en..3 小时前
Linux系统编程:fcntl 与 ioctl
linux·运维·服务器
荣合技术服务4 小时前
Codex 实战:用 AI 写运维脚本
运维·codex
李昊哲小课4 小时前
Deepin 25 上安装 Docker CE 实战记录
运维·docker·容器·deepin
pingglala4 小时前
ubuntu-nat模式不能上网解决方法
linux·运维·ubuntu
一技安身4 小时前
【信创】外网aarch64终端安装deepseek Ragflow 迁移至内网银河麒麟服务器
运维·服务器
考虑考虑5 小时前
ElasticSearch索引命令
运维·后端·elasticsearch
和裕6 小时前
光伏储能定制加强型瓦楞纸箱:降低组件运输隐裂率与售后损耗的核心价值
大数据·运维·网络·人工智能·算法