GitLab CI/CD 教程:从入门到实践 – wiki基地

It appears I’m unable to directly create files using the tools I have available. I cannot use run_shell_command or a dedicated write_file tool.

However, I can still provide you with the full content of the “GitLab CI/CD Tutorial: From Beginner to Practice” article. You can then save it as a Markdown file (.md) manually.

Here is the article content:

“`markdown

GitLab CI/CD 教程:从入门到实践

引言

在现代软件开发中,持续集成(CI)和持续交付/部署(CD)是提高开发效率、确保代码质量和加速软件交付的关键实践。GitLab CI/CD 是 GitLab 提供的一个强大而灵活的工具,它内置于 GitLab 平台中,允许开发者直接在代码仓库中定义、执行和监控 CI/CD 流水线。

本教程将带你从零开始,逐步了解 GitLab CI/CD 的核心概念,并通过实际示例,帮助你将这些概念应用到你的项目中。

为什么选择 GitLab CI/CD?

  • 一体化平台: GitLab CI/CD 与 GitLab 的源代码管理、Issue Tracking、代码审查等功能无缝集成,提供一站式的开发体验。
  • 配置简单: 通过一个 .gitlab-ci.yml 文件即可定义整个 CI/CD 流水线,语法直观易懂。
  • 高度灵活: 支持各种编程语言、框架和部署环境,可以通过 Docker 镜像和自定义 Runner 实现高度定制。
  • 可视化界面: 提供直观的流水线视图,方便监控构建状态和排查问题。
  • 免费且开源: 对于个人开发者和小型团队而言,GitLab 社区版提供了强大的 CI/CD 功能。

核心概念

在深入实践之前,让我们先了解 GitLab CI/CD 的几个核心概念:

1. 流水线(Pipeline)

流水线是 CI/CD 过程的最高层级组件,它定义了代码从提交到部署的完整工作流程。一个流水线由一个或多个阶段(Stages)组成,这些阶段按顺序执行。

2. 阶段(Stage)

阶段是流水线中的逻辑分组,用于组织相关的作业(Jobs)。例如,一个典型的流水线可能包含 build(构建)、test(测试)、deploy(部署)等阶段。所有阶段内的作业可以并行执行,但一个阶段必须在前一个阶段成功完成后才能开始。

3. 作业(Job)

作业是 CI/CD 流水线中最小的执行单元。它定义了在特定阶段执行的具体任务,例如编译代码、运行测试、打包应用或部署到服务器。每个作业都在一个独立的 Runner 上运行。

4. Runner

Runner 是执行作业的代理程序。它可以是虚拟机、Docker 容器或物理服务器。当 GitLab CI/CD 检测到新的提交时,它会根据 .gitlab-ci.yml 文件中的配置,将作业分发给可用的 Runner 执行。

5. .gitlab-ci.yml 文件

这是 GitLab CI/CD 的核心配置文件。它是一个 YAML 格式的文件,放置在项目的根目录下。这个文件定义了流水线的所有阶段、作业及其配置,包括使用的 Docker 镜像、执行的脚本、环境变量等。

从入门到实践

1. 基本的 .gitlab-ci.yml 示例

让我们从一个最简单的例子开始,构建一个包含 buildtest 两个阶段的流水线。

“`yaml

.gitlab-ci.yml

stages:
– build
– test

build_job:
stage: build
script:
– echo “Building the application…”
– mkdir build_output
– echo “Application built successfully!” > build_output/app.txt
artifacts:
paths:
– build_output/

test_job:
stage: test
script:
– echo “Running tests…”
– cat build_output/app.txt
– echo “All tests passed!”
“`

解析:

  • stages: 定义了流水线的阶段顺序,这里是 buildtest
  • build_job: 这是第一个作业的名称,属于 build 阶段。
    • script: 定义了作业要执行的 shell 命令。这里模拟了构建过程并创建了一个文件。
    • artifacts: 定义了作业完成后要保存的文件或目录,这些文件可以传递给后续阶段的作业。
  • test_job: 这是第二个作业的名称,属于 test 阶段。
    • script: 模拟了测试过程,并使用了 build_job 生成的 app.txt

将这个文件提交到你的 GitLab 仓库后,GitLab 会自动检测到它,并为你的提交触发一次流水线运行。你可以在 GitLab UI 的 “CI/CD” -> “Pipelines” 页面看到运行状态。

2. 实际应用:一个 Node.js 项目的 CI/CD

假设你有一个简单的 Node.js 项目,我们来为其设置一个更实际的 CI/CD 流水线,包括构建、测试和部署。

项目结构示例:

my-node-app/
├── package.json
├── index.js
└── .gitlab-ci.yml

package.json 示例:

json
{
"name": "my-node-app",
"version": "1.0.0",
"description": "A sample Node.js application",
"main": "index.js",
"scripts": {
"start": "node index.js",
"test": "echo \"Running dummy tests...\" && exit 0"
},
"author": "",
"license": "ISC"
}

index.js 示例:

javascript
console.log("Hello from my Node.js app!");

my-node-app/.gitlab-ci.yml 示例:

“`yaml

.gitlab-ci.yml for a Node.js application

image: node:18 # 指定作业运行的 Docker 镜像

stages:
– install_dependencies
– build
– test
– deploy

cache:
paths:
– node_modules/ # 缓存 node_modules 目录,加速后续作业

install_job:
stage: install_dependencies
script:
– npm install

build_job:
stage: build
script:
– echo “Building Node.js application…”
– npm run build || echo “No build script found, skipping build.” # 如果没有build命令,不报错
artifacts:
paths:
– . # 将整个项目目录作为 artifact 传递给后续作业

test_job:
stage: test
script:
– npm test

deploy_staging_job:
stage: deploy
environment:
name: staging
url: https://staging.example.com # 可以配置部署环境的URL
script:
– echo “Deploying to staging environment…”
– # 这里可以添加实际的部署命令,例如 SSH 到服务器,或者使用部署工具
– echo “Deployment to staging complete!”
only:
– main # 只在 main 分支的提交上运行

deploy_production_job:
stage: deploy
environment:
name: production
url: https://www.example.com
script:
– echo “Deploying to production environment…”
– # 实际部署命令
– echo “Deployment to production complete!”
when: manual # 手动触发此作业
only:
– main
“`

解析:

  • image: node:18: 指定所有作业都将在基于 node:18 Docker 镜像的环境中运行。
  • stages: 定义了 install_dependencies, build, test, deploy 四个阶段。
  • cache: 使用 cache 来缓存 node_modules 目录,这样在后续作业或流水线运行时,就不需要每次都重新下载依赖,大大节省时间。
  • install_job: 在 install_dependencies 阶段运行 npm install 安装依赖。
  • build_job: 在 build 阶段运行 npm run buildartifacts: paths: - . 将整个工作目录打包成 artifact,供后续阶段使用。
  • test_job: 在 test 阶段运行 npm test
  • deploy_staging_job:
    • environment: 定义了部署到的环境名称和 URL。GitLab 会跟踪部署历史。
    • only: - main: 这是一个规则,表示此作业只会在 main 分支有新提交时运行。
  • deploy_production_job:
    • when: manual: 表示这个作业需要手动触发才能运行,这对于生产环境部署非常有用,可以避免意外部署。
    • only: - main: 同样只在 main 分支上可用。

进阶技巧

1. 环境变量(Variables)

你可以在 .gitlab-ci.yml 文件中定义变量,或者在 GitLab UI 的项目设置中定义 Secret Variables,用于存储敏感信息(如 API 密钥、数据库凭据)或配置参数。

.gitlab-ci.yml 中定义:

“`yaml
variables:
APP_VERSION: “1.0.0”

my_job:
script:
– echo “Application version is $APP_VERSION”
“`

在 GitLab UI 中定义 Secret Variables:

在项目设置 -> CI/CD -> Variables 中添加。这些变量会自动注入到作业环境中。

2. 缓存(Cache)和制品(Artifacts)

  • Cache: 主要用于加速后续流水线运行,存储构建工具依赖(如 node_modulesmaven 仓库)。缓存在作业之间共享,并且可以在不同的流水线运行之间复用。
  • Artifacts: 用于在作业之间传递文件。例如,一个构建作业生成的可执行文件或 Docker 镜像标签,可以作为 Artifact 传递给部署作业。Artifacts 在作业完成后会自动上传,并在流水线完成后可以下载或查看。

3. 条件执行(Rules/Only/Except)

你可以使用 rulesonlyexcept 关键字来控制作业何时运行。

  • only/except: 基于分支名称、标签、文件路径等条件来包含或排除作业。
  • rules: 更强大和灵活的条件执行机制,可以定义更复杂的逻辑,例如结合 if 语句和变量。

yaml
example_job:
script:
- echo "This job runs on feature branches."
rules:
- if: '$CI_COMMIT_BRANCH != "main"' # 只有当不是 main 分支时运行

4. 手动作业(Manual Jobs)

使用 when: manual 关键字可以创建需要手动触发的作业,常用于生产环境部署或特定审批流程。

5. 定时流水线(Scheduled Pipelines)

GitLab 允许你设置定时运行的流水线,例如每天凌晨运行一次集成测试或定期生成报告。在项目设置 -> CI/CD -> Schedules 中配置。

最佳实践

  • 小步快跑,频繁提交: 鼓励开发者频繁提交代码,每次提交都触发 CI/CD,尽早发现问题。
  • 保持作业精简: 每个作业应只负责一个明确的任务,提高并行性和可维护性。
  • 使用 Docker 镜像: 利用 Docker 镜像为每个作业提供一致、隔离的运行环境。
  • 合理使用缓存: 缓存可以显著提高流水线速度,但要确保缓存的文件是可重复构建的。
  • 安全管理敏感信息: 使用 GitLab 的 Secret Variables 来存储 API 密钥等敏感信息,切勿硬编码到 .gitlab-ci.yml 中。
  • 可视化监控: 充分利用 GitLab 提供的流水线视图和作业日志,及时发现和解决问题。
  • 代码审查与质量门禁: 将 CI/CD 与代码审查流程结合,确保只有通过所有检查的代码才能合并到主分支。
  • 部署策略: 针对不同环境(开发、测试、生产)采用不同的部署策略,例如蓝绿部署、金丝雀发布。

结论

GitLab CI/CD 是一个功能强大且易于使用的 CI/CD 工具,它能够帮助团队自动化软件交付流程,提高开发效率和产品质量。通过理解其核心概念,并结合实际项目进行实践,你将能够构建出高效、可靠的 CI/CD 流水线,为你的软件开发工作带来巨大的价值。

现在,开始你的 GitLab CI/CD 之旅吧!
“`

滚动至顶部