add update

This commit is contained in:
2025-10-12 19:10:34 +08:00
parent b9c900b9b1
commit 32f1e5bb33
6 changed files with 2308 additions and 1 deletions

View File

@@ -0,0 +1,604 @@
# Woodpecker CI - MinIO Client (mc) 完整示例 - macOS 环境
#
# 此配置展示了在 macOS 环境中使用 mc 操作 RustFS/S3 对象存储的所有常见场景
# 包括:安装、上传、下载、生成临时链接、清理等
#
# 适用于macOS local/exec agent如 Mac mini
labels:
host: Mac-mini.local
platform: darwin/arm64
# 如果是 Intel Mac使用 darwin/amd64
when:
event: [push, manual, tag, pull_request]
steps:
# ====================================================
# 步骤 1: 安装 MinIO Client (mc)
# ====================================================
- name: install-mc
image: /bin/zsh
commands:
- |
echo "📦 Installing MinIO Client (mc)..."
# 检查是否已安装
if command -v mc &> /dev/null; then
echo "✅ mc already installed: $(mc --version)"
else
# 根据架构下载
ARCH=$(uname -m)
if [[ "$ARCH" == "arm64" ]]; then
MC_URL="https://dl.min.io/client/mc/release/darwin-arm64/mc"
else
MC_URL="https://dl.min.io/client/mc/release/darwin-amd64/mc"
fi
echo "📥 Downloading mc for ${ARCH}..."
curl -sSL ${MC_URL} -o /usr/local/bin/mc
chmod +x /usr/local/bin/mc
# 验证安装
mc --version
echo "✅ mc installed successfully"
fi
# ====================================================
# 步骤 2: 构建项目(模拟)
# ====================================================
- name: build-project
image: /bin/zsh
commands:
- |
echo "🔨 Building project on macOS..."
# 创建构建产物
mkdir -p dist/assets release
# 模拟构建文件
echo "Application binary built on macOS at $(date)" > dist/app.jar
echo "body { color: #333; font-family: -apple-system; }" > dist/assets/style.css
echo "console.log('macOS build');" > dist/assets/app.js
echo "<html><body><h1>Built on macOS</h1></body></html>" > dist/index.html
echo "Build log on macOS at $(date)" > dist/build.log
# 模拟发布版本
echo "Release v1.0.0 built on macOS at $(date)" > release/app-v1.0.0.jar
echo "✅ Build completed"
ls -lh dist/ release/
# ====================================================
# 步骤 3: 上传文件到 S3基础示例
# ====================================================
- name: upload-basic
image: /bin/zsh
environment:
AWS_ACCESS_KEY_ID:
from_secret: AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY:
from_secret: AWS_SECRET_ACCESS_KEY
S3_BUCKET:
from_secret: S3_BUCKET
S3_ENDPOINT:
from_secret: S3_ENDPOINT
commands:
- |
set -e
echo "📤 Uploading files to S3..."
# 配置 mc alias
mc alias set rustfs ${S3_ENDPOINT} ${AWS_ACCESS_KEY_ID} ${AWS_SECRET_ACCESS_KEY}
# 创建按日期分类的路径
BUILD_DATE=$(date +%Y%m%d)
BUILD_PATH="${S3_BUCKET}/builds/macos/${BUILD_DATE}/build-${CI_PIPELINE_NUMBER}"
# 上传单个文件
echo "📦 Uploading app.jar..."
mc cp dist/app.jar rustfs/${BUILD_PATH}/app.jar
# 验证上传
if mc stat rustfs/${BUILD_PATH}/app.jar &>/dev/null; then
ETAG=$(mc stat rustfs/${BUILD_PATH}/app.jar | grep ETag | awk '{print $2}')
echo "✅ Upload successful! ETag: ${ETAG}"
else
echo "❌ Upload failed!"
exit 1
fi
# ====================================================
# 步骤 4: 上传整个目录(递归上传)
# ====================================================
- name: upload-directory
image: /bin/zsh
environment:
AWS_ACCESS_KEY_ID:
from_secret: AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY:
from_secret: AWS_SECRET_ACCESS_KEY
S3_BUCKET:
from_secret: S3_BUCKET
S3_ENDPOINT:
from_secret: S3_ENDPOINT
commands:
- |
set -e
echo "📤 Uploading entire directory..."
mc alias set rustfs ${S3_ENDPOINT} ${AWS_ACCESS_KEY_ID} ${AWS_SECRET_ACCESS_KEY}
BUILD_DATE=$(date +%Y%m%d)
BUILD_PATH="${S3_BUCKET}/builds/macos/${BUILD_DATE}/build-${CI_PIPELINE_NUMBER}"
# 递归上传整个 dist 目录
echo "📦 Uploading dist/ directory..."
mc cp --recursive dist/ rustfs/${BUILD_PATH}/dist/
# 列出上传的文件
echo "✅ Uploaded files:"
mc ls --recursive rustfs/${BUILD_PATH}/dist/
# ====================================================
# 步骤 5: 生成临时下载链接(多种时长示例)
# ====================================================
- name: generate-download-links
image: /bin/zsh
environment:
AWS_ACCESS_KEY_ID:
from_secret: AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY:
from_secret: AWS_SECRET_ACCESS_KEY
S3_BUCKET:
from_secret: S3_BUCKET
S3_ENDPOINT:
from_secret: S3_ENDPOINT
commands:
- |
set -e
echo "🔗 Generating temporary download links..."
mc alias set rustfs ${S3_ENDPOINT} ${AWS_ACCESS_KEY_ID} ${AWS_SECRET_ACCESS_KEY}
BUILD_DATE=$(date +%Y%m%d)
BUILD_PATH="${S3_BUCKET}/builds/macos/${BUILD_DATE}/build-${CI_PIPELINE_NUMBER}"
echo ""
echo "============================================="
echo "📥 临时下载链接macOS 构建)"
echo "============================================="
echo ""
# 1. 短期链接30分钟- 用于快速分享
echo "🔵 短期链接30分钟有效期"
mc share download --expire 30m rustfs/${BUILD_PATH}/app.jar
echo ""
# 2. 中期链接24小时- 用于日常分享
echo "🟢 中期链接24小时有效期"
mc share download --expire 24h rustfs/${BUILD_PATH}/app.jar
echo ""
# 3. 长期链接7天- 用于归档访问
echo "🟡 长期链接7天有效期"
mc share download --expire 7d rustfs/${BUILD_PATH}/app.jar
echo ""
# 4. 自定义时长示例
echo "🔷 其他时长示例:"
echo ""
echo "1小时有效"
mc share download --expire 1h rustfs/${BUILD_PATH}/app.jar
echo ""
echo "6小时有效"
mc share download --expire 6h rustfs/${BUILD_PATH}/app.jar
echo ""
echo "3天有效"
mc share download --expire 3d rustfs/${BUILD_PATH}/app.jar
echo ""
# 5. 为所有文件批量生成链接
echo "🔵 批量生成所有文件的下载链接24小时"
mc ls rustfs/${BUILD_PATH}/dist/ | awk '{print $NF}' | while read file; do
if [[ -n "$file" ]]; then
echo "📦 $file:"
mc share download --expire 24h rustfs/${BUILD_PATH}/dist/$file 2>/dev/null | grep Share || true
echo ""
fi
done
echo "============================================="
# ====================================================
# 步骤 6: 保存下载链接到文件并自动打开
# ====================================================
- name: save-download-links
image: /bin/zsh
environment:
AWS_ACCESS_KEY_ID:
from_secret: AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY:
from_secret: AWS_SECRET_ACCESS_KEY
S3_BUCKET:
from_secret: S3_BUCKET
S3_ENDPOINT:
from_secret: S3_ENDPOINT
commands:
- |
set -e
echo "💾 Saving download links to file..."
mc alias set rustfs ${S3_ENDPOINT} ${AWS_ACCESS_KEY_ID} ${AWS_SECRET_ACCESS_KEY}
BUILD_DATE=$(date +%Y%m%d)
BUILD_PATH="${S3_BUCKET}/builds/macos/${BUILD_DATE}/build-${CI_PIPELINE_NUMBER}"
# 创建下载链接文件
cat > download-links.txt <<EOF
# macOS Build ${CI_PIPELINE_NUMBER} - Download Links
Generated at: $(date)
Build Path: ${BUILD_PATH}
Platform: macOS $(sw_vers -productVersion)
======================================
📥 Download Links (24h validity)
======================================
EOF
# 为主要文件生成链接
echo "## Main Application:" >> download-links.txt
mc share download --expire 24h rustfs/${BUILD_PATH}/app.jar >> download-links.txt 2>&1 || true
echo "" >> download-links.txt
echo "## Build Log:" >> download-links.txt
mc share download --expire 24h rustfs/${BUILD_PATH}/dist/build.log >> download-links.txt 2>&1 || true
echo "" >> download-links.txt
# 显示内容
cat download-links.txt
# 上传链接文件到 S3
mc cp download-links.txt rustfs/${BUILD_PATH}/DOWNLOAD-LINKS.txt
echo "✅ Download links saved to S3"
# macOS 特有:可以用 open 命令打开文件
# open download-links.txt
# ====================================================
# 步骤 7: 列举和查询文件
# ====================================================
- name: list-files
image: /bin/zsh
environment:
AWS_ACCESS_KEY_ID:
from_secret: AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY:
from_secret: AWS_SECRET_ACCESS_KEY
S3_BUCKET:
from_secret: S3_BUCKET
S3_ENDPOINT:
from_secret: S3_ENDPOINT
commands:
- |
set -e
echo "📋 Listing files in S3..."
mc alias set rustfs ${S3_ENDPOINT} ${AWS_ACCESS_KEY_ID} ${AWS_SECRET_ACCESS_KEY}
BUILD_DATE=$(date +%Y%m%d)
# 列出今天的所有 macOS 构建
echo "📦 Today's macOS builds:"
mc ls rustfs/${S3_BUCKET}/builds/macos/${BUILD_DATE}/
echo ""
# 递归列出当前构建的所有文件
echo "📦 Current build files:"
mc ls --recursive rustfs/${S3_BUCKET}/builds/macos/${BUILD_DATE}/build-${CI_PIPELINE_NUMBER}/
echo ""
# 获取文件详细信息
echo "📊 File details:"
mc stat rustfs/${S3_BUCKET}/builds/macos/${BUILD_DATE}/build-${CI_PIPELINE_NUMBER}/app.jar
# ====================================================
# 步骤 8: 下载文件(验证)
# ====================================================
- name: download-verify
image: /bin/zsh
environment:
AWS_ACCESS_KEY_ID:
from_secret: AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY:
from_secret: AWS_SECRET_ACCESS_KEY
S3_BUCKET:
from_secret: S3_BUCKET
S3_ENDPOINT:
from_secret: S3_ENDPOINT
commands:
- |
set -e
echo "📥 Downloading and verifying files..."
mc alias set rustfs ${S3_ENDPOINT} ${AWS_ACCESS_KEY_ID} ${AWS_SECRET_ACCESS_KEY}
BUILD_DATE=$(date +%Y%m%d)
BUILD_PATH="${S3_BUCKET}/builds/macos/${BUILD_DATE}/build-${CI_PIPELINE_NUMBER}"
# 下载文件
mkdir -p download-test
mc cp rustfs/${BUILD_PATH}/app.jar download-test/
# 验证文件
if [[ -f download-test/app.jar ]]; then
echo "✅ File downloaded successfully"
ls -lh download-test/
cat download-test/app.jar
else
echo "❌ Download failed"
exit 1
fi
# ====================================================
# 步骤 9: 清理旧构建30天前
# ====================================================
- name: cleanup-old-builds
image: /bin/zsh
when:
branch: main
event: push
environment:
AWS_ACCESS_KEY_ID:
from_secret: AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY:
from_secret: AWS_SECRET_ACCESS_KEY
S3_BUCKET:
from_secret: S3_BUCKET
S3_ENDPOINT:
from_secret: S3_ENDPOINT
commands:
- |
set -e
echo "🧹 Cleaning up old macOS builds..."
mc alias set rustfs ${S3_ENDPOINT} ${AWS_ACCESS_KEY_ID} ${AWS_SECRET_ACCESS_KEY}
# 删除 30 天前的 macOS 构建
echo "🗑️ Removing macOS builds older than 30 days..."
mc rm --recursive --force --older-than 30d rustfs/${S3_BUCKET}/builds/macos/ || true
# 显示剩余的构建
echo "✅ Cleanup completed. Remaining macOS builds:"
mc ls --recursive --summarize rustfs/${S3_BUCKET}/builds/macos/ || echo "No builds found"
# ====================================================
# 步骤 10: 发布版本(仅 tag 触发)
# ====================================================
- name: publish-release
image: /bin/zsh
when:
event: tag
environment:
AWS_ACCESS_KEY_ID:
from_secret: AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY:
from_secret: AWS_SECRET_ACCESS_KEY
S3_BUCKET:
from_secret: S3_BUCKET
S3_ENDPOINT:
from_secret: S3_ENDPOINT
commands:
- |
set -e
echo "🚀 Publishing macOS release..."
mc alias set rustfs ${S3_ENDPOINT} ${AWS_ACCESS_KEY_ID} ${AWS_SECRET_ACCESS_KEY}
TAG_NAME=${CI_COMMIT_TAG}
RELEASE_PATH="${S3_BUCKET}/releases/macos/${TAG_NAME}"
# 上传发布版本
mc cp release/app-${TAG_NAME}.jar rustfs/${RELEASE_PATH}/app-macos-${TAG_NAME}.jar
# 验证上传
if mc stat rustfs/${RELEASE_PATH}/app-macos-${TAG_NAME}.jar &>/dev/null; then
ETAG=$(mc stat rustfs/${RELEASE_PATH}/app-macos-${TAG_NAME}.jar | grep ETag | awk '{print $2}')
echo "✅ macOS Release published successfully!"
echo "📌 Tag: ${TAG_NAME}"
echo "📦 ETag: ${ETAG}"
echo "🔗 Path: ${RELEASE_PATH}/app-macos-${TAG_NAME}.jar"
echo "🍎 Platform: macOS $(sw_vers -productVersion)"
# 生成多种时长的下载链接
echo ""
echo "📥 Download links:"
echo ""
echo "1小时有效临时分享"
mc share download --expire 1h rustfs/${RELEASE_PATH}/app-macos-${TAG_NAME}.jar
echo ""
echo "7天有效正式发布"
mc share download --expire 7d rustfs/${RELEASE_PATH}/app-macos-${TAG_NAME}.jar
# 可选:设置为公开访问(永久链接)
# mc anonymous set download rustfs/${RELEASE_PATH}/
# echo ""
# echo "🌐 Public URL: ${S3_ENDPOINT}/${RELEASE_PATH}/app-macos-${TAG_NAME}.jar"
else
echo "❌ Release failed!"
exit 1
fi
# ====================================================
# 步骤 11: 生成构建报告macOS 风格)
# ====================================================
- name: build-report
image: /bin/zsh
environment:
AWS_ACCESS_KEY_ID:
from_secret: AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY:
from_secret: AWS_SECRET_ACCESS_KEY
S3_BUCKET:
from_secret: S3_BUCKET
S3_ENDPOINT:
from_secret: S3_ENDPOINT
commands:
- |
set -e
echo "📊 Generating macOS build report..."
mc alias set rustfs ${S3_ENDPOINT} ${AWS_ACCESS_KEY_ID} ${AWS_SECRET_ACCESS_KEY}
BUILD_DATE=$(date +%Y%m%d)
BUILD_PATH="${S3_BUCKET}/builds/macos/${BUILD_DATE}/build-${CI_PIPELINE_NUMBER}"
# 获取系统信息
MACOS_VERSION=$(sw_vers -productVersion)
ARCH=$(uname -m)
# 生成 Markdown 报告
cat > BUILD-REPORT.md <<EOF
# 🍎 macOS Build Report
**Build Number**: ${CI_PIPELINE_NUMBER}
**Date**: $(date)
**Branch**: ${CI_COMMIT_BRANCH}
**Commit**: ${CI_COMMIT_SHA}
**macOS Version**: ${MACOS_VERSION}
**Architecture**: ${ARCH}
## 📦 Artifacts
EOF
# 列出所有文件并生成下载链接
mc ls --recursive rustfs/${BUILD_PATH}/ | awk '{print $NF}' | while read file; do
if [[ -n "$file" ]]; then
SIZE=$(mc stat rustfs/${BUILD_PATH}/$file 2>/dev/null | grep Size | awk '{print $2}' || echo "N/A")
# 生成多个时长的链接
LINK_1H=$(mc share download --expire 1h rustfs/${BUILD_PATH}/$file 2>/dev/null | grep Share | awk '{print $2}' || echo "N/A")
LINK_24H=$(mc share download --expire 24h rustfs/${BUILD_PATH}/$file 2>/dev/null | grep Share | awk '{print $2}' || echo "N/A")
LINK_7D=$(mc share download --expire 7d rustfs/${BUILD_PATH}/$file 2>/dev/null | grep Share | awk '{print $2}' || echo "N/A")
echo "### $file" >> BUILD-REPORT.md
echo "" >> BUILD-REPORT.md
echo "- **Size**: ${SIZE}" >> BUILD-REPORT.md
echo "- **Download Links**:" >> BUILD-REPORT.md
echo " - [1小时有效]($LINK_1H)" >> BUILD-REPORT.md
echo " - [24小时有效]($LINK_24H)" >> BUILD-REPORT.md
echo " - [7天有效]($LINK_7D)" >> BUILD-REPORT.md
echo "" >> BUILD-REPORT.md
fi
done
# 添加系统信息
cat >> BUILD-REPORT.md <<EOF
## 🖥️ Build Environment
- **Hostname**: $(hostname)
- **macOS Version**: ${MACOS_VERSION}
- **Architecture**: ${ARCH}
- **Xcode Version**: $(xcodebuild -version 2>/dev/null | head -n1 || echo "N/A")
EOF
# 显示报告
cat BUILD-REPORT.md
# 上传报告到 S3
mc cp BUILD-REPORT.md rustfs/${BUILD_PATH}/
echo "✅ Build report uploaded"
# macOS 特有:可以用 open 命令在浏览器中预览
# open BUILD-REPORT.md
# ====================================================
# 步骤 12: 使用 Finder 快速操作macOS 特有)
# ====================================================
- name: macos-integration
image: /bin/zsh
when:
event: manual
environment:
AWS_ACCESS_KEY_ID:
from_secret: AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY:
from_secret: AWS_SECRET_ACCESS_KEY
S3_BUCKET:
from_secret: S3_BUCKET
S3_ENDPOINT:
from_secret: S3_ENDPOINT
commands:
- |
set -e
echo "🍎 macOS Integration features..."
mc alias set rustfs ${S3_ENDPOINT} ${AWS_ACCESS_KEY_ID} ${AWS_SECRET_ACCESS_KEY}
BUILD_DATE=$(date +%Y%m%d)
BUILD_PATH="${S3_BUCKET}/builds/macos/${BUILD_DATE}/build-${CI_PIPELINE_NUMBER}"
# 创建桌面快捷方式脚本(可选)
cat > ~/Desktop/download-build.sh <<EOF
#!/bin/zsh
# Quick download script for macOS
mc alias set rustfs ${S3_ENDPOINT} ${AWS_ACCESS_KEY_ID} ${AWS_SECRET_ACCESS_KEY}
mc cp --recursive rustfs/${BUILD_PATH}/ ~/Downloads/build-${CI_PIPELINE_NUMBER}/
open ~/Downloads/build-${CI_PIPELINE_NUMBER}/
EOF
chmod +x ~/Desktop/download-build.sh
echo "✅ Created desktop shortcut: ~/Desktop/download-build.sh"
echo "💡 Double-click to download build to ~/Downloads/"
# 发送通知macOS
osascript -e 'display notification "Build uploaded to S3" with title "Woodpecker CI"'
# ====================================================
# 说明
# ====================================================
#
# macOS 环境特别说明:
#
# 1. 在 Woodpecker UI 中配置以下 secrets
# - AWS_ACCESS_KEY_ID
# - AWS_SECRET_ACCESS_KEY
# - S3_BUCKET
# - S3_ENDPOINT
#
# 2. 确保您的 Woodpecker agent 配置为 local/exec 模式
#
# 3. labels 需要匹配您的 Mac 主机名和架构:
# - host: 您的 Mac 主机名(如 Mac-mini.local
# - platform: darwin/arm64 (Apple Silicon) 或 darwin/amd64 (Intel)
#
# 4. 将此文件保存为 .woodpecker.yml
#
# 5. 推送代码触发构建,或手动触发
#
# 临时链接时长说明:
# - 5m = 5 分钟(极短期)
# - 30m = 30 分钟(短期分享)
# - 1h = 1 小时
# - 6h = 6 小时
# - 24h = 24 小时1天
# - 3d = 3 天
# - 7d = 7 天(默认和最大值)
#
# 清理策略说明:
# - --older-than 7d 删除 7 天前的文件
# - --older-than 30d 删除 30 天前的文件
# - --older-than 90d 删除 90 天前的文件
#
# macOS 特有功能:
# - 使用 osascript 发送系统通知
# - 使用 open 命令打开文件
# - 使用 sw_vers 获取系统版本
# - 创建桌面快捷方式
#
# ====================================================