gitlab ci/cd 自动化部署到阿里云 ecs 的核心是通过在 ecs 上配置 gitlab runner 并编写 .gitlab-ci.yml 文件实现。1. 在 ecs 上使用 docker 安装 gitlab runner,并注册到 gitlab 项目,推荐使用 docker executor 以实现环境隔离;2. 在 gitlab 项目中配置 ci/cd 变量,包括 ssh_private_key(文件类型)、ecs_host 和 ecs_user,确保安全访问;3. 编写 .gitlab-ci.yml 文件定义 stages(如 build、deploy),利用 cache 加速构建,artifacts 传递产物,并在 deploy 阶段通过 ssh 安全连接 ecs 执行部署命令;4. 遵循最佳实践:避免使用 root 用户,采用专用用户和最小权限原则,挂载持久化卷保存 runner 配置,限制并发任务数,结合阿里云监控资源使用;5. .gitlab-ci.yml 支持变量注入、条件执行(only/manual)、错误处理(set -e)和 docker 部署流程(build/push/pull)。该方案实现代码提交后自动测试、构建与部署,提升效率与可靠性,且配置文件纳入版本控制,具备高可追溯性,最终形成安全、可控、可维护的自动化流水线。

用 GitLab CI/CD 将项目部署到阿里云 ECS,本质上就是把原来那些手动复制、粘贴、登录服务器、执行命令的繁琐步骤,通过一套预设的自动化流程彻底解放出来。它把代码的提交、测试、构建到最终上线,变成了一个流水线式的自动过程,大大提升了开发效率和部署的可靠性。
要实现 GitLab CI/CD 到阿里云 ECS 的自动化部署,核心在于在 ECS 上安装并配置一个 GitLab Runner,并编写一个
.gitlab-ci.yml
ECS 实例准备与 GitLab Runner 配置
# 假设你已经安装了 Docker sudo docker run -d --name gitlab-runner --restart always \ -v /srv/gitlab-runner/config:/etc/gitlab-runner \ -v /var/run/docker.sock:/var/run/docker.sock \ gitlab/gitlab-runner:latest
sudo docker run --rm -it -v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner:latest register \ --url YOUR_GITLAB_URL \ --token YOUR_REGISTRATION_TOKEN \ --description "My ECS Runner" \ --executor "shell" # 或者 "docker" 如果你的项目在容器中运行
选择
shell
docker
GitLab 项目配置:SSH Key 与 CI/CD 变量
SSH_PRIVATE_KEY
root
~/.ssh/authorized_keys
ECS_HOST
ECS_USER
root
编写 .gitlab-ci.yml
.gitlab-ci.yml
stages:
- build
- deploy
variables:
# 部署到 ECS 的目标路径
DEPLOY_DIR: "/www/your-project"
cache:
paths:
- node_modules/
build_job:
stage: build
image: node:16-alpine # 使用一个 Node.js 镜像来构建
script:
- echo "开始构建项目..."
- npm install --registry=https://registry.npmmirror.com # 使用国内镜像加速
- npm run build
- echo "项目构建完成。"
artifacts:
paths:
- dist/ # 假设你的构建产物在 dist 目录下
expire_in: 1 day # 缓存一天
deploy_job:
stage: deploy
# 确保这个 job 只有在 main 分支更新时才运行
only:
- main
script:
- echo "开始部署到 ECS..."
# 确保 SSH 私钥文件权限正确
- chmod 600 "$SSH_PRIVATE_KEY"
# 使用 ssh-agent 添加私钥,避免每次 SSH 都提示
- eval $(ssh-agent -s)
- ssh-add "$SSH_PRIVATE_KEY"
# 关闭严格主机密钥检查,避免首次连接提示
- mkdir -p ~/.ssh
- echo -e "Host *\n\tStrictHostKeyChecking no\n\tUserKnownHostsFile=/dev/null" > ~/.ssh/config
# 通过 SSH 连接到 ECS 并执行部署命令
- ssh ${ECS_USER}@${ECS_HOST} "
mkdir -p ${DEPLOY_DIR} &&
cd ${DEPLOY_DIR} &&
# 备份旧版本(可选)
# mv current_release old_release || true &&
# 从 GitLab 仓库拉取最新代码
git pull origin main || git clone https://gitlab.com/your-group/your-project.git . &&
# 安装依赖(如果需要)
npm install --production --registry=https://registry.npmmirror.com &&
# 重启服务,这里以 PM2 为例
pm2 reload ecosystem.config.js || pm2 start ecosystem.config.js
"
- echo "部署完成!"对我而言,GitLab CI/CD 最打动人的地方在于它的“一体化”理念。你想想看,代码仓库、版本控制、问题追踪、CI/CD 流水线,所有这些都在同一个平台里,触手可及。这不像以前,代码在 GitHub,CI/CD 在 Jenkins,项目管理在 Jira,每次切换上下文都像是在不同房间里找工具,效率低不说,还容易出错。
选择 GitLab CI/CD,我觉得主要有几点:
首先,学习曲线相对平缓。它的
.gitlab-ci.yml
其次,强大的集成能力。因为是原生集成,它能无缝访问你的代码、分支、标签,甚至可以直接操作 GitLab 的 API,实现更复杂的自动化流程,比如在部署成功后自动创建发布标签,或者在测试失败时自动创建 Jira 任务(虽然我更喜欢直接在 GitLab Issues 里处理)。
再来,成本效益。对于小型团队或者个人开发者来说,GitLab 提供了非常慷慨的免费套餐,包含了 CI/CD 功能,这无疑降低了自动化部署的门槛。你不需要额外维护一套 Jenkins 或者其他 CI/CD 服务器,节省了时间和金钱。
最后,也是我个人最看重的,是它能把 CI/CD 配置本身也纳入版本控制。
.gitlab-ci.yml
.gitlab-ci.yml
在 ECS 上配置 GitLab Runner,这玩意儿,说起来简单,做起来总有些坑。但只要遵循一些最佳实践,就能让它成为你部署流水线里最坚实的基石。
选择合适的 Executor:
node:16
python:3.9
dind
安全性是重中之重:
root
gitlab-runner
.gitlab-ci.yml
.gitlab-ci.yml
chmod 600 $SSH_PRIVATE_KEY
资源管理与监控:
config.toml
concurrent
持久化配置与备份:
config.toml
/etc/gitlab-runner
/srv/gitlab-runner/config
config.toml
我曾经犯过一个错误,直接用
root
.gitlab-ci.yml
rm -rf /
.gitlab-ci.yml
.gitlab-ci.yml
阶段(Stages)的划分与逻辑流: 一个清晰的
stages
build
dist
test
deploy
cleanup
test
build
deploy
test
变量(Variables)的妙用: 充分利用 GitLab 的 CI/CD 变量功能,可以极大地提高
.gitlab-ci.yml
CI_COMMIT_BRANCH
CI_COMMIT_TAG
CI_PROJECT_DIR
构建(Build)任务:产物与缓存:
image
node:latest
python:3.9-slim
cache
node_modules
.m2
cache:
paths:
- node_modules/ # 缓存 Node.js 依赖
key: ${CI_COMMIT_REF_SLUG} # 按分支或标签缓存,避免不同分支互相影响artifacts
dist
部署(Deploy)任务:SSH 与远程执行: 这是最核心的部分。
before_script: - chmod 600 "$SSH_PRIVATE_KEY" - eval $(ssh-agent -s) - ssh-add "$SSH_PRIVATE_KEY" - mkdir -p ~/.ssh - echo -e "Host *\n\tStrictHostKeyChecking no\n\tUserKnownHostsFile=/dev/null" > ~/.ssh/config
这几行代码是标准操作,用于将私钥安全地加载到
ssh-agent
ssh user@host "command"
# 假设部署脚本在 ECS 上的 /usr/local/bin/deploy.sh
ssh ${ECS_USER}@${ECS_HOST} "/usr/local/bin/deploy.sh ${CI_COMMIT_SHA}"
# 或者直接执行一系列命令
ssh ${ECS_USER}@${ECS_HOST} "
cd /path/to/project &&
git pull origin main &&
npm install --production &&
pm2 reload my-app
"docker build -t my-app:${CI_COMMIT_SHA} .docker push registry.cn-hangzhou.aliyuncs.com/your-namespace/my-app:${CI_COMMIT_SHA}docker pull
docker stop/rm/run
ssh ${ECS_USER}@${ECS_HOST} "
docker pull registry.cn-hangzhou.aliyuncs.com/your-namespace/my-app:${CI_COMMIT_SHA} &&
docker stop my-app || true &&
docker rm my-app || true &&
docker run -d --name my-app -p 80:3000 registry.cn-hangzhou.aliyuncs.com/your-namespace/my-app:${CI_COMMIT_SHA}
"条件执行与错误处理:
only
except
deploy_prod
main
when: manual
allow_failure: true
script
set -e
编写
.gitlab-ci.yml
以上就是用 GitLab CI/CD 部署项目到阿里云 ECS 实战教程的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号