Files
woodpecker-rustfs/mc/macos/mc-macos-woodpecker.yml
2025-10-12 19:10:34 +08:00

604 lines
20 KiB
YAML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 获取系统版本
# - 创建桌面快捷方式
#
# ====================================================