# 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 "

Built on macOS

" > 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 <> 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 </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 </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 <