CI/CD 入门实践:从代码到生产的自动化之旅

什么是 CI/CD

CI(Continuous Integration,持续集成)是指频繁地将代码合并到主分支,并自动进行构建和测试。CD(Continuous Delivery/Deployment,持续交付/部署)是指将通过测试的代码自动部署到生产环境。

简单来说,CI/CD 就是一套自动化的流程,让你的代码从提交到部署全程自动化,减少人工操作,提高发布效率。

Jenkins 入门 Pipeline

Jenkins 是目前最流行的 CI/CD 工具之一。下面是一个完整的 Jenkins Pipeline 示例,展示了从拉代码到远程发布的完整流程:

pipeline {
    agent any

    triggers {
        gitlab(triggerOnPush: true)
    }

    options {
        disableConcurrentBuilds()
    }

    environment {
        REMOTE_USER = "root"
        REMOTE_HOST = "47.116.193.82"
        REMOTE_DIR  = "/data/www/tool"
    }

    stages {
        stage('清理工作区') {
            steps {
                deleteDir()
            }
        }

        stage('拉代码') {
            steps {
                git branch: 'test',
                    url: 'http://192.168.233.11:8929/yeyou/go.git',
                    credentialsId: 'gitlab-token'
            }
        }

        stage('打包') {
            steps {
                sh '''
                set -e

                tar --warning=no-file-changed \
                    --exclude=.git \
                    --exclude=node_modules \
                    -czf release.tar.gz .
                '''
            }
        }

        stage('上传') {
            steps {
                sh '''
                set -e

                scp release.tar.gz ${REMOTE_USER}@${REMOTE_HOST}:/tmp/
                '''
            }
        }

        stage('远程发布') {
            steps {
                sh '''
                set -e

                ssh root@47.116.193.82 "
                    set -e

                    cd /data/www/tool

                    echo '备份'
                    tar -czf /tmp/backup_$(date +%s).tar.gz . || true

                    echo '清理旧文件'
                    rm -rf * .[^.]* || true

                    echo '解压新版本'
                    tar -xzf /tmp/release.tar.gz -C /data/www/tool

                    echo '完成'
                "
                '''
            }
        }
    }

    post {
        success {
            echo "✅ 部署成功"
        }

        failure {
            echo "❌ 部署失败(旧版本已备份在 /tmp)"
        }
    }
}

核心概念解析

1. agent

agent any 表示该 Pipeline 可以在任何可用的 Jenkins 节点上运行。你也可以指定特定的节点标签。

2. triggers

gitlab(triggerOnPush: true) 配置 GitLab 推送触发器,当代码推送到 GitLab 时自动触发构建。

3. stages

stages 是 Pipeline 的核心,包含多个 stage,每个 stage 代表一个阶段:

  • 清理工作区:清理之前构建留下的文件
  • 拉代码:从 Git 仓库拉取指定分支的代码
  • 打包:将代码打包成 tar.gz 文件
  • 上传:将打包文件上传到远程服务器
  • 远程发布:在远程服务器上执行部署脚本

4. post

post 块在 Pipeline 结束后执行,根据构建结果执行不同操作,比如发送通知。

常见问题与解决

tar: file changed as we read it

这是因为在 tar 打包过程中,文件系统发生了变化(可能是 Jenkins 写入临时文件)。解决方法是在 tar 命令中添加 --warning=no-file-changed 参数:

tar --warning=no-file-changed \
    --exclude=.git \
    --exclude=node_modules \
    -czf release.tar.gz .

SSH 免密登录配置

为了让 Jenkins 能够免密 SSH 到远程服务器,需要配置 SSH 密钥:

# 在 Jenkins 服务器上生成密钥
ssh-keygen -t rsa -b 4096

# 将公钥复制到远程服务器
ssh-copy-id root@47.116.193.82

CI/CD 的优势

  • 自动化:减少人工操作,降低出错概率
  • 快速反馈:代码提交后立即知道是否有问题
  • 可追溯:每次构建都有记录,方便回滚
  • 提高效率:发布时间从小时级降到分钟级
  • 团队协作:多人协作时自动合并和测试代码

进阶建议

对于更复杂的项目,建议:

  • 添加单元测试、集成测试阶段
  • 使用 Docker 容器化部署
  • 配置蓝绿部署或金丝雀发布
  • 集成监控和告警系统
  • 使用更现代的工具如 GitLab CI、GitHub Actions 或 ArgoCD
返回分类列表