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

<!--category-- DevOps, CI/CD, GitHub Actions -->
<datetime class="hidden">2025-12-04T12:00</datetime>

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

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

[TOC]

## 发布战略一览

@,_这里#'_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-基于部署

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

### 确定环境目标

```yaml
on:
  push:
    tags:
      - 'release-*'  # Production
      - 'local-*'    # Dev environment
```

```yaml
- 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”,通过时间戳标记轻松回滚 =.

```bash
# 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 版本

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

```yaml
# 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
```

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

```yaml
- 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 移动](https://github.com/adamralph/minver) 从 Git 标记中计算版本@ :

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

## 基于部署

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

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

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

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

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

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

## 自动- 监视器更新

自我的M- 托管部署 @, [观察塔](https://containrrr.dev/watchtower/) 自动拉动新图像@: @%

```yaml
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} , 那么快速部署是没用的 。

```yaml
- 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}

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

## 与 OIDC 发布无密码

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

```yaml
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

## 供应链安保

[人工造物证明](https://docs.github.com/en/actions/security-for-github-actions/using-artifact-attestations) 证明您的工艺品是建在 CIC,}没有被篡改过 I.}企业越来越需要的

```yaml
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](https://slsa.dev/spec/v1.0/levels)用于级别 @3,}使用 [可重复使用的工作流程](https://docs.github.com/en/actions/sharing-automations/reusing-workflows).

## 预览环境

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

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

```yaml
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 方法** -_隧道 您的本地机器@:}

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

或使用 [无线电护卫](https://www.wireguard.com/) VPN 用于内部团队进入您的 dev machine@.

## 实用提示

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

```bash
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 秘密组织](https://docs.github.com/en/actions/security-for-github-actions/security-guides/using-secrets-in-github-actions)@, @% 从来没有在代码@ . @ 需要秘密, 通常都是 @ MS K2 @

- `DOCKER_HUB_ACCESS_TOKEN`
- `NUGET_API_KEY` (或使用 OIDC)
- `NPM_TOKEN`

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

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

## 移动到 Kubernetes

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

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

## 摘要摘要

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

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

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