This is a viewer only at the moment see the article on how this works.
To update the preview hit Ctrl-Alt-R (or ⌘-Alt-R on Mac) or Enter to refresh. The Save icon lets you save the markdown file to disk
This is a preview from the server running through my markdig pipeline
现代释放战略与吉特胡布行动
Thursday, 04 December 2025
核心原则使释放速度快,无痛 , 和您' 会更经常地释放 这对敏捷的开发来说至关重要 =-}快速,}可靠的部署创造了您需要的快速反馈循环 当部署是吓人或慢速时 =.}组分批变更, 增加风险 *. 当部署乏味且自动", 你经常装运小改动\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_TOKENNUGET_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 滚回”、“|”
摘要摘要
- 开始简单“:”标记“-”部署满足了大多数需要。
- 需要时添加复杂性:Breaty=-基于,多-_environment@,证明
- 自动化质量门@: 测试必须在发布前通过
- 启用回滚:時代標籤或 GitOps 歷史
- 保障输油管的安全: OIDC 秘密 MS K1 来源证明
- 匹配上下文创办企业≠
在此仓库\ - check 中运行的工作流程显示 .github/workflows/ 用于完全执行@. @%
记住“: Rapid,可靠部署是敏捷发展的基础 ”“.投资投入在你的释放管道中 在早期'.#