部署
- Tier: Free, Premium, Ultimate
- Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
当您将代码版本部署到环境时,就创建了一个部署。 每个环境通常只有一个活跃的部署。
GitLab:
- 为每个环境提供完整的部署历史记录。
- 跟踪您的部署,让您始终知道服务器上部署了什么。
如果您的项目关联了像 Kubernetes 这样的部署服务,您可以使用它来协助部署。
创建部署后,您可以将其发布给用户。
配置手动部署
您可以创建一个需要手动启动部署的作业。 例如:
deploy_prod:
stage: deploy
script:
- echo "Deploy to production server"
environment:
name: production
url: https://example.com
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
when: manualwhen: manual 操作:
- 在 GitLab UI 中显示作业的 运行 ( ) 按钮,文本为 可手动部署到 <环境>。
- 表示
deploy_prod作业必须手动触发。
您可以在流水线、环境、部署和作业视图中找到 运行 ( )。
按部署跟踪新包含的合并请求
GitLab 可以按部署跟踪新包含的合并请求。 当部署成功时,系统会计算最新部署与之前部署之间的提交差异。 您可以使用 部署 API 获取跟踪信息, 或在 合并请求页面 的合并后流水线中查看。
要启用跟踪,请配置您的环境,使其满足以下任一条件:
以下是在 .gitlab-ci.yml 中使用 environment 关键字 的一些示例配置:
# 可跟踪的
environment: production
environment: production/aws
environment: development
# 不可跟踪的
environment: review/$CI_COMMIT_REF_SLUG
environment: testing/aws配置更改仅适用于新的部署。现有的部署记录不会链接或取消链接合并请求。
本地检出部署
每次部署都会在 Git 仓库中保存一个引用,因此
了解当前环境的状态只需执行一次 git fetch。
在您的 Git 配置中,向 [remote "<your-remote>"] 块添加一个额外的
fetch 行:
fetch = +refs/environments/*:refs/remotes/origin/environments/*归档旧部署
当您的项目中发生新部署时,
GitLab 会创建 一个指向部署的特殊 Git 引用。
由于这些 Git 引用是从远程 GitLab 仓库填充的,
您可能会发现随着项目中部署数量的增加,
某些 Git 操作(如 git-fetch 和 git-pull)会变慢。
为了保持 Git 操作的效率,GitLab 只保留最近的部署引用(最多 50,000 个),
并删除其余的旧部署引用。
归档的部署仍然可以通过 UI 或 API 使用,用于审计目的。
此外,即使在归档后,您仍然可以通过指定提交 SHA
(例如 git checkout <deployment-sha>)从仓库中获取已部署的提交。
GitLab 保留所有提交作为 keep-around 引用,
以便已部署的提交不会被垃圾回收,即使它们没有被部署引用引用。
部署回滚
当您在特定提交上回滚部署时, 会创建一个新部署。这个部署有自己的唯一作业 ID。 它指向您要回滚到的提交。
为了成功回滚,部署过程必须在作业的 script 中定义。
只运行 部署作业。
如果之前的作业生成了在部署时必须重新生成的工件,
您必须从流水线页面手动运行必要的作业。
例如,如果您使用 Terraform 并且将 plan 和 apply 命令分离到多个作业中,
您必须手动运行作业来部署或回滚。
重试或回滚部署
如果部署出现问题,您可以重试或回滚。
要重试或回滚部署:
- 在左侧边栏,选择 搜索或跳转至 并找到您的项目。
- 选择 运维 > 环境。
- 选择环境。
- 在部署名称右侧:
- 要重试部署,选择 重新部署到环境。
- 要回滚到部署,在之前成功的部署旁边,选择 回滚环境。
如果您在项目中 阻止了过时的部署作业, 回滚按钮可能被隐藏或禁用。 在这种情况下,请参阅 回滚部署的作业重试。
相关主题
故障排除
当您处理部署时,可能会遇到以下问题。
找不到部署引用
GitLab 删除旧的部署引用 以保持 Git 仓库的性能。
如果您需要在 GitLab 自托管版中恢复归档的 Git 引用,请让管理员 在 Rails 控制台中执行以下命令:
Project.find_by_full_path(<your-project-full-path>).deployments.where(archived: true).each(&:create_ref)出于性能考虑,GitLab 未来可能会取消此支持。 您可以在 GitLab 问题跟踪器 中 打开一个问题来讨论此功能的行为。