GitLab于Linux实现自动化部署的核心流程
GitLab通过CI/CD(持续集成/持续部署)功能实现Linux环境下的自动化部署,依赖GitLab Runner(执行任务的代理工具)和**.gitlab-ci.yml**(流水线配置文件)两大核心组件。以下是具体实现步骤:
GitLab Runner是执行.gitlab-ci.yml
中任务的工具,需先在Linux服务器上安装并注册到GitLab项目。
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash
sudo apt-get install gitlab-runner -y
对于CentOS/RHEL,使用:curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
sudo yum install gitlab-runner -y
sudo gitlab-runner register
,按提示输入:
https://gitlab.example.com
);linux-runner
);linux
,用于匹配项目中的标签限制)。在项目根目录创建.gitlab-ci.yml
文件,定义流水线阶段(stages)和任务(jobs)。以下是一个基础示例:
stages:
- build # 构建阶段:编译代码、生成产物
- test # 测试阶段:运行单元测试、集成测试
- deploy # 部署阶段:将产物推送至生产环境
variables:
MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository" # 示例变量:Maven本地仓库路径
build_job:
stage: build
image: maven:3.8.6-openjdk-11 # 使用Maven镜像
script:
- echo "开始构建项目..."
- mvn clean package -DskipTests # 编译代码并打包(跳过测试)
artifacts: # 定义构建产物(后续job可使用)
paths:
- target/*.jar # 将target目录下的jar包传递给下一阶段
test_job:
stage: test
image: maven:3.8.6-openjdk-11
script:
- echo "运行单元测试..."
- mvn test # 执行测试用例
deploy_job:
stage: deploy
image: alpine:latest # 使用轻量级Alpine镜像
before_script:
- apk add --no-cache openssh # 安装SSH客户端(用于连接远程服务器)
script:
- echo "开始部署到生产服务器..."
- scp -o StrictHostKeyChecking=no target/*.jar user@your_server_ip:/opt/app/ # 复制jar包到服务器
- ssh -o StrictHostKeyChecking=no user@your_server_ip "cd /opt/app && nohup java -jar *.jar &" # 后台启动应用
only:
- master # 仅当代码推送到master分支时触发
关键说明:
stages
:定义流水线的执行顺序(需按build→test→deploy
依次执行);image
:指定任务运行的Docker镜像(如Java项目用maven
,Python项目用python
);script
:编写具体的Shell命令(如mvn package
、scp
);artifacts
:将前一阶段的产物(如编译后的jar包)传递给后续阶段;only
:限制触发条件(如仅master
分支变更时触发部署)。部署阶段需通过SSH连接远程Linux服务器,因此需配置免密登录,避免每次输入密码。
ssh-keygen -t rsa -b 4096 -C "gitlab-runner@example.com"
默认密钥路径为~/.ssh/id_rsa
(私钥)和~/.ssh/id_rsa.pub
(公钥)。ssh-copy-id user@your_server_ip
输入服务器密码后,公钥会自动添加到目标服务器的~/.ssh/authorized_keys
文件中。ssh user@your_server_ip "echo '免密登录成功!'"
若无需密码即可执行命令,则配置成功。敏感信息(如SSH私钥、服务器地址、数据库密码)不应直接写在.gitlab-ci.yml
中,需通过GitLab CI/CD变量管理。
DEPLOY_SERVER_IP
(变量名);your_server_ip
(服务器IP);File
(若为私钥,如SSH_PRIVATE_KEY
,需选择File类型,Runner会自动创建临时文件)。script:
- echo "部署到服务器:$DEPLOY_SERVER_IP"
- scp -o StrictHostKeyChecking=no target/*.jar $DEPLOY_USER@$DEPLOY_SERVER_IP:/opt/app/
变量值会在运行时自动替换,确保敏感信息安全。将.gitlab-ci.yml
文件提交到GitLab仓库并推送至远程分支(如master
),Runner会自动检测到变更并启动流水线:
git add .gitlab-ci.yml
git commit -m "Add CI/CD pipeline for automated deployment"
git push origin master
localRepository
或Node.js的node_modules
:cache:
paths:
- .m2/repository/ # Maven缓存
- node_modules/ # Node.js缓存
test_unit:
stage: test
script: mvn test
test_lint:
stage: test
script: npm run lint # 假设是Node.js项目
build_image:
stage: build
script:
- docker build -t registry.example.com/myapp:$CI_COMMIT_SHORT_SHA .
- docker login -u $DOCKER_USER -p $DOCKER_PASSWORD registry.example.com
- docker push registry.example.com/myapp:$CI_COMMIT_SHORT_SHA
kubectl
将镜像部署到K8s集群:deploy_k8s:
stage: deploy
script:
- kubectl apply -f k8s/deployment.yaml # 应用K8s配置文件
only:
- master
需提前配置KUBECONFIG
变量(包含K8s集群的访问权限)。通过以上步骤,可实现GitLab与Linux环境的无缝自动化部署,覆盖从代码提交到应用上线的完整流程,显著提升开发与运维效率。