现代释放战略与吉特胡布行动 (中文 (Chinese Simplified))

现代释放战略与吉特胡布行动

Thursday, 04 December 2025

//

4 minute read

核心原则使释放速度快,无痛 , 和您' 会更经常地释放 这对敏捷的开发来说至关重要 =-}快速,}可靠的部署创造了您需要的快速反馈循环 当部署是吓人或慢速时 =.}组分批变更, 增加风险 *. 当部署乏味且自动", 你经常装运小改动\MS K7

本指南涵盖我在生产中使用的释放策略@,,从简单的标签 @-基部署到多-包装单列波出版_.}所有例子都来自真实 吉特胡布行动组织 此仓库中的工作流程@ . @%

发布战略一览

@,_这里#'_Qs 通用策略如何比较@:}%

“ ”战略“ 最佳复杂度”
基于 Tag- 的标签 “ 应用”“, 明确释放”“ 低 启动”、“, 单人Devs @, 成熟团队”
分支=-}基于 “ ” 连续部署“ ” 低调“MS K2” 启动“MSC3” 快速“-” 移动队“MSKO5”
吉特花 受管制的释放, 多版本 High □ 企业企管}, 遵命MS K5Heavy
Trunk-}以 {+} 為基地{MS K1 地點旗 中度 大科技,成熟的初创企业
Monorrepo mudi -% package “ ”图书馆“,”共享代码库 “MS K2”中度“ ”平台团队 ,”OSS项目

工作地点

小型团队:_BARBAR_以標籤@-}基於或分支{-}基于部署}.} 保持簡單的 @- 您可以隨後加入複雜性 *.Trunk-}以特效旗为基础的开发在规模上很受欢迎, 但小團隊超能力=.}

企业企业企业“:”通常要求GitFlow或相似的遵守“,”审计线索@, 和发布管理 多环境 @(Dev,QAZ, DreadingMS K7 prod})}经批核{.Artifact证明

单行开发者@ : @ TagZQ-BARBAR 以理想为主的@ MS K2} 按下标签 @ ,_ 部署发生 @ MPK4_ 没有仪式 @ MAK5# 无头顶 @ I.

平台/+ibrary小组: 需要单列策略, 每个软件包都有独立的版本@. 语义版对于下游消费者来说至关重要 @.

Tag-基于部署

最简单和最可靠的策略 @. 不同标签前缀路径到不同的环境或触发不同动作@.

确定环境目标

on:
  push:
    tags:
      - 'release-*'  # Production
      - 'local-*'    # Dev environment
- name: Build Docker image
  run: |
    TAG_NAME=${GITHUB_REF#refs/tags/}
    if [[ "$TAG_NAME" == local-* ]]; then
      docker build -t myapp:local .
    else
      docker build -t myapp:latest -t myapp:$(date +%s) .
    fi

为什么它工作“:”简单心理模型“,”明确部署“MS K2”,通过时间戳标记轻松回滚 =.

# Deploy to production
git tag release-v2024.12.01 && git push origin release-v2024.12.01

# Deploy to dev
git tag local-feature-test && git push origin local-feature-test

多@ - @ package 版本

使用标签前缀来识别要释放哪个软件包@:

# Different workflows, different tag patterns
# umami-net.yml
on:
  push:
    tags: ['umamiv*.*.*']  # e.g., umamiv1.0.5

# fetchextension.yml
on:
  push:
    tags: ['fetchextension-v*.*.*']  # e.g., fetchextension-v1.2.0

将版本解开并在整个@:中使用

- name: Extract version
  run: echo "VERSION=${GITHUB_REF#refs/tags/umamiv}" >> $GITHUB_OUTPUT

- name: Build & Pack
  run: |
    dotnet build -c Release -p:Version=${{ steps.version.outputs.VERSION }}
    dotnet pack -c Release -p:PackageVersion=${{ steps.version.outputs.VERSION }}

用于自动版本@, @% MinVer 移动 从 Git 标记中计算版本@ :

<PackageReference Include="MinVer" Version="6.0.0" PrivateAssets="all" />
<PropertyGroup>
  <MinVerTagPrefix>umamiv</MinVerTagPrefix>
</PropertyGroup>

基于部署

当代码在特定分支上定位时自动部署@. @ 常见的新建和快速启动中 @-# 移动团队 @ .} @

on:
  push:
    branches: [main]      # → Production
    # branches: [develop] # → Staging

Pros在合并时没有手动步骤@, @% 部署 共@: 意外部署可能的 possible accident discriptions *%1}不那么清晰的历史

我使用一种混合方法 {-}_Basing on brie push {({但只在标签上发表}:

on:
  push:
    tags: ['scheduler-*']
    branches: [main, local]

jobs:
  build:
    # Always build
  publish:
    if: startsWith(github.ref, 'refs/tags/')  # Only publish on tags

自动- 监视器更新

自我的M- 托管部署 @, 观察塔 自动拉动新图像@: @%

services:
  app:
    image: myapp:latest
    labels:
      - "com.centurylinklabs.watchtower.enable=true"

  watchtower:
    image: containrrr/watchtower
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    command: --interval 300  # Check every 5 minutes

部署部署流动@:_推车标签@→}GitHub Action 建造了#→}“推进到注册处 ” → 观察台拉起“→’ 集装箱重新启动 ” “. ” 总时间=%: ~5 minutes *. {

质量大门

如果您部署 bugs @ . @ 每个工作流程应该包括 Gatels@ MS K1} , 那么快速部署是没用的 。

- name: Run tests
  run: dotnet test --configuration Release

- name: Build
  run: dotnet build --configuration Release

# Tests or build fail → workflow stops → no publish

用于多@ - @ frameworld profession * , 构建所有目标=% MS K2}

- run: dotnet build -c Release --framework net8.0
- run: dotnet build -c Release --framework net9.0

与 OIDC 发布无密码

现代方法 @ - @ no secret to rover *\ ,} 没有密钥可以泄漏@ MS K2

permissions:
  id-token: write
  contents: read

- uses: NuGet/login@v1
  with:
    user: 'myusername'

- run: dotnet nuget push *.nupkg --api-key ${{ steps.login.outputs.NUGET_API_KEY }}

GitHub 将其 OIDC 代号交换为短小@ - @ liven Nuget API 键@ MPK1}配置信任, 以启用此# MS K3 @ org

供应链安保

人工造物证明 证明您的工艺品是建在 CIC,}没有被篡改过 I.}企业越来越需要的

permissions:
  id-token: write
  attestations: write

- uses: docker/build-push-action@v6
  id: push
  with:
    push: true
    tags: myapp:latest

- uses: actions/attest-build-provenance@v2
  with:
    subject-name: index.docker.io/myuser/myapp
    subject-digest: ${{ steps.push.outputs.digest }}
    push-to-registry: true

消费者用 @:+#校验 gh attestation verify oci://index.docker.io/myuser/myapp:latest --owner myuser

由此实现 SLSA 级别 @2用于级别 @3,}使用 可重复使用的工作流程.

预览环境

团队在合并前需要利益攸关方预览更改@. @%

企业制办法 -Breaty-基于预览环境 @:

on:
  pull_request:
    types: [opened, synchronize]

- run: |
    BRANCH=$(echo ${{ github.head_ref }} | sed 's/[^a-zA-Z0-9]/-/g')
    docker build -t myapp:preview-$BRANCH .
    # Deploy to k8s namespace, cloud platform, etc.

启动@/ @solo 方法 -_隧道 您的本地机器@:}

# Cloudflare Tunnel (free)
cloudflared tunnel run --url http://localhost:5000 my-preview
# → https://my-preview.cfargotunnel.com

或使用 无线电护卫 VPN 用于内部团队进入您的 dev machine@.

实用提示

标签清理@:#Git标签永远留在周围 #.#

git tag -d old-test-tag                      # Delete local
git push origin :refs/tags/old-test-tag      # Delete remote

命名公约*:* 保持一致 MSC1

  • release-YYYY.MM.DD 用于生产
  • local-feature-name 用于 dev 的
  • packagev1.2.3 图书馆服务

密秘:存储于 GitHub 秘密组织@, @% 从来没有在代码@ . @ 需要秘密, 通常都是 @ MS K2 @

  • DOCKER_HUB_ACCESS_TOKEN
  • NUGET_API_KEY (或使用 OIDC)
  • NPM_TOKEN

垄断发展:在开发期间使用项目参考@,转换为部署校验的软件包引用}#:

<ProjectReference Include="..\MyLib\MyLib.csproj" />
<!-- <PackageReference Include="MyLib" Version="1.0.0" /> -->

移动到 Kubernetes

相同的原则@, @ 不同工具 @:#

-=YTET -伊甸园字幕组=- 翻译: |----------------|------------| | 观察台 MS K1 * ArgoCD 阿尔戈CD / 流动流量 | |docker-composeMS K2yml 环境 @|}命名空间 @| 集装箱重新启动 移动部署 | “| 手动倒回”“|”“GitOps 滚回”、“|”

摘要摘要

  1. 开始简单“:”标记“-”部署满足了大多数需要。
  2. 需要时添加复杂性:Breaty=-基于,多-_environment@,证明
  3. 自动化质量门@: 测试必须在发布前通过
  4. 启用回滚:時代標籤或 GitOps 歷史
  5. 保障输油管的安全: OIDC 秘密 MS K1 来源证明
  6. 匹配上下文创办企业≠

在此仓库\ - check 中运行的工作流程显示 .github/workflows/ 用于完全执行@. @%

记住“: Rapid,可靠部署是敏捷发展的基础 ”“.投资投入在你的释放管道中 在早期'.#

Finding related posts...
logo

© 2026 Scott Galloway — Unlicense — All content and source code on this site is free to use, copy, modify, and sell.