<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>GitLab</title>
    <link>https://llinux.cn/cicd/gitlab/</link>
    <description>阿征的运维笔记</description>
    <language>zh</language>
    <atom:link href="https://llinux.cn/cicd/gitlab/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
      <title>GitLab CI/CD</title>
      <link>https://llinux.cn/cicd/gitlab/gitlab-cicd/</link>
      
      <guid>https://llinux.cn/cicd/gitlab/gitlab-cicd/</guid>
      <description>&lt;h2 id=&#34;gitlab-vs-jenkins&#34;&gt;GitLab vs Jenkins&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#gitlab-vs-jenkins&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;在 Jenkins 中，需要配置各种插件、管理节点（Nodes），并在 Jenkins UI 或 Jenkinsfile 中定义流水线。GitLab CI 将这些概念做了极大的简化，并且更倾向于云原生的思维。&lt;/p&gt;&#xA;&lt;p&gt;下面这两者的核心概念映射表：&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th style=&#34;text-align: left&#34;&gt;Jenkins 概念 🏗️&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: left&#34;&gt;GitLab CI 概念 🦊&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: left&#34;&gt;核心差异与说明&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;Jenkins Master&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;GitLab Server&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;GitLab 代码仓库自带 CI/CD 的调度能力，你不需要像 Jenkins 那样去额外搭建和维护一个独立的控制中心。&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;Agent / Node / Slave&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;GitLab Runner&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Runner 是实际干活（执行代码构建、测试）的机器。它可以是你局域网里的一台物理机，也可以是云上的动态容器。&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;Jenkinsfile (Groovy)&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;&lt;code&gt;.gitlab-ci.yml&lt;/code&gt; (YAML)&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;流水线配置文件。GitLab 要求它放在代码仓库的根目录，并使用更具可读性的 YAML 语法，而不是像 Jenkins 那样使用 Groovy 脚本。&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;Plugins (插件生态)&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;Docker Images (容器镜像)&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;这是最大的思维转变。&lt;/strong&gt; Jenkins 极度依赖插件（如 Maven 插件、NodeJS 插件），而 GitLab CI 提倡“一切皆容器”。你需要什么环境，就在代码里直接指定对应的 Docker 镜像。&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;Stage &amp;amp; Step&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;Stage &amp;amp; Job &amp;amp; Script&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;层级关系非常相似。一条 Pipeline 包含多个 Stage（阶段），Stage 包含多个平行运行的 Job（任务），Job 中包含具体执行的 Script（脚本命令）。&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;&lt;strong&gt;💡 核心思维转变：从“装插件”到“拉镜像”&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>安全策略</title>
      <link>https://llinux.cn/cicd/gitlab/%E5%AE%89%E5%85%A8%E7%AD%96%E7%95%A5/</link>
      
      <guid>https://llinux.cn/cicd/gitlab/%E5%AE%89%E5%85%A8%E7%AD%96%E7%95%A5/</guid>
      <description>&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;核心逻辑&lt;/strong&gt;：在代码合并到主干之前，如何通过机制来收敛风险。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;具体内容&lt;/strong&gt;：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;分支策略（Branching Strategy）的本质。&lt;/li&gt;&#xA;&lt;li&gt;分支保护（Protected Branches）：为什么不能让所有人直接 push 到 main。&lt;/li&gt;&#xA;&lt;li&gt;Merge Request (MR) 的核心工作流与代码审查（Code Review）。&lt;/li&gt;&#xA;&lt;li&gt;&lt;em&gt;实践：发起一次完整的 MR 流程。&lt;/em&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    
    <item>
      <title>安全策略</title>
      <link>https://llinux.cn/cicd/gitlab/%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86/</link>
      
      <guid>https://llinux.cn/cicd/gitlab/%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86/</guid>
      <description>&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;核心逻辑&lt;/strong&gt;：在代码合并到主干之前，如何通过机制来收敛风险。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;具体内容&lt;/strong&gt;：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;分支策略（Branching Strategy）的本质。&lt;/li&gt;&#xA;&lt;li&gt;分支保护（Protected Branches）：为什么不能让所有人直接 push 到 main。&lt;/li&gt;&#xA;&lt;li&gt;Merge Request (MR) 的核心工作流与代码审查（Code Review）。&lt;/li&gt;&#xA;&lt;li&gt;&lt;em&gt;实践：发起一次完整的 MR 流程。&lt;/em&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    
    <item>
      <title>用户与权限管理</title>
      <link>https://llinux.cn/cicd/gitlab/%E7%94%A8%E6%88%B7%E4%B8%8E%E6%9D%83%E9%99%90%E7%AE%A1%E7%90%86/</link>
      
      <guid>https://llinux.cn/cicd/gitlab/%E7%94%A8%E6%88%B7%E4%B8%8E%E6%9D%83%E9%99%90%E7%AE%A1%E7%90%86/</guid>
      <description>&lt;p&gt;从第一性原理出发，GitLab 的权限管理本质上是在解决一个经典的安全问题：&lt;strong&gt;在复杂的现实团队协作中，如何以最低的管理成本，实现细粒度的基于角色的访问控制（RBAC），并控制操作的“爆炸半径”。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;如果把 GitLab 想象成一个文件系统：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Group（群组）&lt;/strong&gt; 就是&lt;strong&gt;文件夹&lt;/strong&gt;。它是用来做逻辑隔离和策略下发的边界。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Project（项目）&lt;/strong&gt; 就是&lt;strong&gt;文件&lt;/strong&gt;（实际存放代码和流水线的地方）。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;User（用户）&lt;/strong&gt; 就是&lt;strong&gt;实体&lt;/strong&gt;。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;GitLab 设计了一条铁律：&lt;strong&gt;权限向下继承，且（在开源版中）不可在子层级被削弱。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;这意味着，如果你在一个 Group（父文件夹）中赋予了某人较高的权限，他将自动拥有该 Group 下所有 Project（子文件）的同等权限。你只能在具体的 Project 中&lt;strong&gt;叠加&lt;/strong&gt;他的权限，而不能剥夺他从 Group 继承来的权限。&lt;/p&gt;&#xA;&lt;h2 id=&#34;角色&#34;&gt;角色&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e8%a7%92%e8%89%b2&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;五种核心角色（Role）的本质区别如下：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;Guest（访客）&lt;/strong&gt;：只能看 Issue 和 Wiki，&lt;strong&gt;看不到代码&lt;/strong&gt;（私有项目下）。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Reporter（报告者）&lt;/strong&gt;：可以拉取（Pull）代码，但&lt;strong&gt;不能推送（Push）&lt;/strong&gt;。适合 QA 查阅代码或非开发人员查看代码。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Developer（开发者）&lt;/strong&gt;：主力干活的。可以提交代码，创建分支，发起 Merge Request。但&lt;strong&gt;不能直接推送到受保护的分支（如 &lt;code&gt;main&lt;/code&gt;）&lt;/strong&gt;。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Maintainer（维护者）&lt;/strong&gt;：项目的管家。可以合并代码、修改项目设置、配置 CI/CD 变量。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Owner（所有者）&lt;/strong&gt;：最高权限，通常只有在 Group 级别才有这个角色，可以管理账单、删除群组等。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;综合实践&#34;&gt;综合实践&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e7%bb%bc%e5%90%88%e5%ae%9e%e8%b7%b5&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;实验目标：模拟一个真实公司的部门架构，验证成员如何通过加入不同的“组织层级”来自动获取“代码库”的访问权。&lt;/p&gt;&#xA;&lt;h3 id=&#34;1-创建群组&#34;&gt;1. 创建群组&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#1-%e5%88%9b%e5%bb%ba%e7%be%a4%e7%bb%84&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;使用管理员账号（通常是 &lt;code&gt;root&lt;/code&gt;）登录 GitLab。&lt;/li&gt;&#xA;&lt;li&gt;点击左侧导航栏&lt;strong&gt;groups&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Create group&lt;/strong&gt;。&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Group name 填入：&lt;code&gt;infrastructure-team&lt;/code&gt;（基础设施团队）&lt;/li&gt;&#xA;&lt;li&gt;Visibility level 选择：&lt;code&gt;Private&lt;/code&gt;（私有）&lt;/li&gt;&#xA;&lt;li&gt;点击 &lt;strong&gt;Create group&lt;/strong&gt;。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;2-创建项目&#34;&gt;2. 创建项目&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#2-%e5%88%9b%e5%bb%ba%e9%a1%b9%e7%9b%ae&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;进入刚刚创建的 &lt;code&gt;infrastructure-team&lt;/code&gt; 群组，点击 &lt;strong&gt;New project&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Create blank project&lt;/strong&gt;。&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Project name 填入：&lt;code&gt;k8s-manifests&lt;/code&gt;（K8s 部署清单）&lt;/li&gt;&#xA;&lt;li&gt;取消勾选 &amp;ldquo;Initialize repository with a README&amp;rdquo;（先建个空库即可）。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;回到首页，再建一个&lt;strong&gt;独立&lt;/strong&gt;的项目（不放在任何 Group 下，直接属于 root 用户个人）：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Project name 填入：&lt;code&gt;hugo-blog-theme&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Visibility level 选择：&lt;code&gt;Private&lt;/code&gt;。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h4 id=&#34;第二步创建虚拟实体users&#34;&gt;第二步：创建虚拟“实体”（Users）&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e7%ac%ac%e4%ba%8c%e6%ad%a5%e5%88%9b%e5%bb%ba%e8%99%9a%e6%8b%9f%e5%ae%9e%e4%bd%93users&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h4&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;进入 &lt;strong&gt;Admin Area&lt;/strong&gt;（左下角扳手图标，或者顶部搜索栏搜索 Admin）。&lt;/li&gt;&#xA;&lt;li&gt;进入 &lt;strong&gt;Users&lt;/strong&gt; -&amp;gt; &lt;strong&gt;New user&lt;/strong&gt;。&lt;/li&gt;&#xA;&lt;li&gt;创建用户 A（代表核心骨干）：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Name: &lt;code&gt;Alice_DevOps&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Username: &lt;code&gt;alice&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Email: &lt;code&gt;alice@example.com&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;（创建后点击 Edit 给她设置一个密码，方便一会登录）&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;同样的方法，创建用户 B（代表外包实习生）：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Name: &lt;code&gt;Bob_Intern&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Username: &lt;code&gt;bob&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Email: &lt;code&gt;bob@example.com&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;（同样设置一个密码）&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h4 id=&#34;第三步分配权限核心实验&#34;&gt;第三步：分配权限（核心实验）&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e7%ac%ac%e4%b8%89%e6%ad%a5%e5%88%86%e9%85%8d%e6%9d%83%e9%99%90%e6%a0%b8%e5%bf%83%e5%ae%9e%e9%aa%8c&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h4&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;给 Alice 分配高层级权限&lt;/strong&gt;：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;进入刚才的 &lt;code&gt;infrastructure-team&lt;/code&gt; &lt;strong&gt;群组&lt;/strong&gt;页面。&lt;/li&gt;&#xA;&lt;li&gt;点击左侧的 &lt;strong&gt;Manage&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Members&lt;/strong&gt;。&lt;/li&gt;&#xA;&lt;li&gt;点击 &lt;strong&gt;Invite members&lt;/strong&gt;，搜索并选中 &lt;code&gt;Alice_DevOps&lt;/code&gt;。&lt;/li&gt;&#xA;&lt;li&gt;Role 选择 &lt;strong&gt;Maintainer&lt;/strong&gt;，点击邀请。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;给 Bob 分配底层级权限&lt;/strong&gt;：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;进入 &lt;code&gt;k8s-manifests&lt;/code&gt; &lt;strong&gt;项目&lt;/strong&gt;页面（注意，不是群组页面）。&lt;/li&gt;&#xA;&lt;li&gt;点击左侧的 &lt;strong&gt;Manage&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Members&lt;/strong&gt;。&lt;/li&gt;&#xA;&lt;li&gt;邀请 &lt;code&gt;Bob_Intern&lt;/code&gt;，Role 选择 &lt;strong&gt;Reporter&lt;/strong&gt;。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h4 id=&#34;第四步切换视角见证奇迹&#34;&gt;第四步：切换视角，见证奇迹&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e7%ac%ac%e5%9b%9b%e6%ad%a5%e5%88%87%e6%8d%a2%e8%a7%86%e8%a7%92%e8%a7%81%e8%af%81%e5%a5%87%e8%bf%b9&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h4&gt;&#xA;&lt;p&gt;现在，我们要分别扮演 Alice 和 Bob 来验证结果。&lt;/p&gt;</description>
    </item>
    
  </channel>
</rss>
