{{< details >}}
- Tier: 基础版, 专业版, 旗舰版
- Offering: JihuLab.com, 私有化部署
{{< /details >}}
如果您目前正在使用 CircleCI,可以将您的 CI/CD 流水线迁移到 极狐GitLab CI/CD,开始利用其所有强大的功能。
我们收集了一些您在开始迁移之前可能会发现有用的资源。
快速入门指南 是了解极狐GitLab CI/CD 工作原理的一个好概述。您可能还会对 Auto DevOps 感兴趣,它可以用于构建、测试和部署您的应用程序,几乎不需要配置。
对于高级 CI/CD 团队,自定义项目模板 可以实现流水线配置的重用。
如果您有在此未解答的问题,极狐GitLab 社区论坛 可以是一个很好的资源。
config.yml
vs .gitlab-ci.yml
CircleCI 的 config.yml
配置文件定义了脚本、作业和工作流(在极狐GitLab 中称为 “阶段”)。在极狐GitLab 中,类似的方法是使用存储库根目录中的 .gitlab-ci.yml
文件。
作业
在 CircleCI 中,作业是一组用于执行特定任务的步骤。在极狐GitLab 中,作业 也是配置文件中的基本元素。在极狐GitLab CI/CD 中不需要 checkout
关键字,因为存储库会自动获取。
CircleCI 作业定义示例:
jobs:
job1:
steps:
- checkout
- run: "execute-script-for-job1"
极狐GitLab CI/CD 中相同作业定义的示例:
job1:
script: "execute-script-for-job1"
Docker 镜像定义
CircleCI 在作业级别定义镜像,极狐GitLab CI/CD 也支持。此外,极狐GitLab CI/CD 支持全局设置镜像,以供未定义 image
的所有作业使用。
CircleCI 镜像定义示例:
jobs:
job1:
docker:
- image: ruby:2.6
极狐GitLab CI/CD 中相同镜像定义的示例:
job1:
image: ruby:2.6
工作流
CircleCI 使用 workflows
来确定作业的运行顺序,这也用于确定并发、顺序、计划或手动运行。在极狐GitLab CI/CD 中,等效功能称为 stages。同一阶段的作业并行运行,并且仅在之前的阶段完成后运行。默认情况下,当作业失败时会跳过下一阶段的执行,但即使作业失败后也可以允许继续。
请参阅 流水线架构概述,以获取有关您可以使用的不同类型流水线的指导。流水线可以根据您的需求进行定制,例如用于大型复杂项目或具有独立定义组件的单体存储库。
并行和顺序作业执行
以下示例显示了作业如何并行或顺序运行:
-
job1
和job2
并行运行(在极狐GitLab CI/CD 的build
阶段)。 -
job3
仅在job1
和job2
成功完成后运行(在test
阶段)。 -
job4
仅在job3
成功完成后运行(在deploy
阶段)。
CircleCI 使用 workflows
的示例:
version: 2
jobs:
job1:
steps:
- checkout
- run: make build dependencies
job2:
steps:
- run: make build artifacts
job3:
steps:
- run: make test
job4:
steps:
- run: make deploy
workflows:
version: 2
jobs:
- job1
- job2
- job3:
requires:
- job1
- job2
- job4:
requires:
- job3
极狐GitLab CI/CD 中作为 stages
的相同工作流示例:
stages:
- build
- test
- deploy
job1:
stage: build
script: make build dependencies
job2:
stage: build
script: make build artifacts
job3:
stage: test
script: make test
job4:
stage: deploy
script: make deploy
environment: production
定时运行
极狐GitLab CI/CD 提供了一个易于使用的 UI 来计划流水线。此外,规则 可用于确定作业是否应包含或排除在计划的流水线中。
CircleCI 定时工作流示例:
commit-workflow:
jobs:
- build
scheduled-workflow:
triggers:
- schedule:
cron: "0 1 * * *"
filters:
branches:
only: try-schedule-workflow
jobs:
- build
使用极狐GitLab CI/CD 中的rules
的相同定时流水线示例:
job1:
script:
- make build
rules:
- if: $CI_PIPELINE_SOURCE == "schedule" && $CI_COMMIT_REF_NAME == "try-schedule-workflow"
保存流水线配置后,您可以在 极狐GitLab UI 中配置 cron 时间表,并且也可以在 UI 中启用或禁用计划。
手动运行
CircleCI 手动工作流示例:
release-branch-workflow:
jobs:
- build
- testing:
requires:
- build
- deploy:
type: approval
requires:
- testing
使用极狐GitLab CI/CD 中的when: manual
的相同工作流示例:
deploy_prod:
stage: deploy
script:
- echo "Deploy to production server"
when: manual
environment: production
按分支过滤作业
规则 是一种机制,用于确定作业是否针对特定分支运行。
CircleCI 按分支过滤作业示例:
jobs:
deploy:
branches:
only:
- main
- /rc-.*/
使用极狐GitLab CI/CD 中 rules
的相同工作流示例:
deploy:
stage: deploy
script:
- echo "Deploy job"
rules:
- if: $CI_COMMIT_BRANCH == "main" || $CI_COMMIT_BRANCH =~ /^rc-/
environment: production
缓存
极狐GitLab 提供了一种缓存机制,通过重用先前下载的依赖项来加快作业的构建时间。了解 缓存与产物的区别 对于充分利用这些功能非常重要。
CircleCI 使用缓存的作业示例:
jobs:
job1:
steps:
- restore_cache:
key: source-v1-< .Revision >
- checkout
- run: npm install
- save_cache:
key: source-v1-< .Revision >
paths:
- "node_modules"
使用极狐GitLab CI/CD 中 cache
的相同流水线示例:
test_async:
image: node:latest
cache: # Cache modules in between jobs
key: $CI_COMMIT_REF_SLUG
paths:
- .npm/
before_script:
- npm ci --cache .npm --prefer-offline
script:
- node ./specs/start.js ./specs/async.spec.js
上下文和变量
CircleCI 提供 Contexts 来安全地跨项目流水线传递环境变量。在极狐GitLab 中,可以创建一个群组来将相关项目组合在一起。在群组级别,CI/CD 变量 可以存储在单个项目之外,并安全地传递到跨多个项目的流水线中。
构建环境
CircleCI 提供 executors
作为运行特定作业的底层技术。在极狐GitLab 中,这是由 runners 完成的。
支持以下环境:
私有化部署 runner:
- Linux
- Windows
- macOS
JihuLab.com 实例 runner:
机器和特定构建环境
标签 可用于在不同平台上运行作业,告诉极狐GitLab 哪些 runner 应该运行这些作业。
CircleCI 在特定环境中运行作业的示例:
jobs:
ubuntuJob:
machine:
image: ubuntu-1604:201903-01
steps:
- checkout
- run: echo "Hello, $USER!"
osxJob:
macos:
xcode: 11.3.0
steps:
- checkout
- run: echo "Hello, $USER!"
使用极狐GitLab CI/CD 中 tags
的相同作业示例:
windows job:
stage: build
tags:
- windows
script:
- echo Hello, %USERNAME%!
osx job:
stage: build
tags:
- osx
script:
- echo "Hello, $USER!"