温馨提示×

Linux GitLab怎样实现自动化部署

小樊
51
2025-10-04 01:01:40
栏目: 智能运维

Linux环境下GitLab实现自动化部署的核心流程
GitLab通过CI/CD(持续集成/持续部署)功能实现自动化部署,核心依赖GitLab Runner(执行任务的代理)和**.gitlab-ci.yml**(流水线配置文件)。以下是详细步骤:

1. 安装并配置GitLab Runner

GitLab Runner是执行.gitlab-ci.yml中任务的组件,需先在Linux服务器(部署目标环境)上安装并注册。

  • 安装Runner
    以CentOS为例,通过包管理器安装:
    # 安装依赖
    sudo yum install -y curl policycoreutils-python openssh-server postfix
    # 启动Postfix(用于邮件通知)
    sudo systemctl enable postfix && sudo systemctl start postfix
    # 添加GitLab Runner仓库并安装
    curl -sS https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh | sudo bash
    sudo yum install -y gitlab-runner
    
  • 注册Runner
    执行以下命令,按提示输入GitLab项目URL和注册令牌(从GitLab项目→Settings→CI/CD→Runners获取):
    sudo gitlab-runner register
    
    注册成功后,Runner会监听GitLab触发的流水线任务。

2. 创建.gitlab-ci.yml配置文件

在项目根目录下创建.gitlab-ci.yml,定义流水线阶段(build/test/deploy)和作业(Job),明确每个阶段的执行任务。

  • 基础结构示例(以Java Spring Boot项目为例):
    stages:
      - build    # 构建阶段:编译代码、打包
      - test     # 测试阶段:运行单元测试
      - deploy   # 部署阶段:推送至服务器
    
    variables:
      MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository"  # Maven本地仓库路径
      IMAGE_TAG: "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA"  # Docker镜像标签(用提交短哈希)
    
    cache:  # 缓存依赖,加速后续构建
      paths:
        - .m2/repository/
        - target/
    
    build-job:
      stage: build
      image: maven:3.8.6-jdk-11  # 使用Maven镜像
      script:
        - mvn clean package -DskipTests  # 编译并打包(跳过测试)
      artifacts:  # 保存构建产物,供后续阶段使用
        paths:
          - target/*.jar
    
    unit-test:
      stage: test
      image: maven:3.8.6-jdk-11
      script:
        - mvn test  # 运行单元测试
    
    docker-build:
      stage: deploy
      image: docker:20.10.23  # 使用Docker镜像
      services:
        - docker:dind  # 启用Docker-in-Docker(构建镜像)
      script:
        - docker build -t $IMAGE_TAG .  # 构建Docker镜像
        - docker push $IMAGE_TAG  # 推送镜像至GitLab Registry
    
    配置项说明:
    • stages:定义流水线阶段顺序(必须按顺序执行);
    • script:每个Job的执行命令;
    • artifacts:将构建产物(如JAR文件)传递给后续Job;
    • cache:缓存依赖目录,减少重复下载;
    • variables:定义全局变量(如镜像标签)。

3. 配置SSH免密登录(目标服务器)

若部署作业需要通过SSH连接到目标Linux服务器(如拉取代码、重启服务),需配置免密登录,避免在配置文件中暴露私钥。

  • 生成密钥对(在Runner服务器上):
    ssh-keygen -t rsa -b 4096 -C "gitlab-runner"  # 默认保存至~/.ssh/id_rsa
    
  • 复制公钥至目标服务器
    ssh-copy-id user@target-server-ip  # 将公钥添加至目标服务器的~/.ssh/authorized_keys
    
  • 配置.gitlab-ci.yml使用私钥(可选,更安全的方式是通过GitLab CI/CD变量传递):
    在项目Settings→CI/CD→Variables中添加变量DEPLOY_SSH_PRIVATE_KEY(类型为File,值为目标服务器私钥),然后在Job中引用:
    deploy-job:
      stage: deploy
      script:
        - mkdir -p ~/.ssh
        - echo "$DEPLOY_SSH_PRIVATE_KEY" > ~/.ssh/id_rsa
        - chmod 600 ~/.ssh/id_rsa
        - ssh user@target-server-ip "cd /deploy/path && git pull && systemctl restart app.service"
    

4. 触发自动化部署

  • 自动触发:默认情况下,当代码推送到关联的分支(如master/main)或创建合并请求时,GitLab会自动触发流水线。
  • 手动触发:若需手动控制,可在.gitlab-ci.yml中为Job添加when: manual,或在GitLab项目→CI/CD→Pipelines页面点击“Run Pipeline”。

5. 高级配置(可选)

  • 使用Docker/Kubernetes
    通过Docker镜像构建应用,用Kubernetes进行滚动部署(示例Job):
    k8s-deploy:
      stage: deploy
      image: bitnami/kubectl:latest  # 使用kubectl镜像
      script:
        - echo "$KUBECONFIG" > ~/.kube/config  # 从变量读取Kubeconfig(配置K8s集群访问)
        - kubectl set image deployment/app app=$IMAGE_TAG --namespace=prod  # 更新K8s Deployment镜像
    
  • 缓存优化:缓存node_modules(Node.js项目)、.m2/repository(Maven项目)等目录,减少构建时间。
  • 通知功能:在Job中添加after_script,通过邮件、Slack或Webhook发送部署结果通知。
  • 多环境部署:通过only/exceptrules控制Job执行环境(如develop分支触发测试环境部署,master分支触发生产环境部署)。

通过以上步骤,可实现Linux环境下GitLab的自动化部署,覆盖从代码提交到生产环境发布的全流程,提升开发效率和部署可靠性。

0