# Woodpecker CI 配置文件 - AutoDock Vina Tools # 用于自动化构建和推送 Docker 镜像到 DockerHub # 触发条件 when: event: [push, manual, pull_request] branch: [main, develop, release/*] # 全局环境变量 environment: DOCKERHUB_USERNAME: ${DOCKERHUB_USERNAME} DOCKERHUB_TOKEN: ${DOCKERHUB_TOKEN} VINA_VERSION: ${VINA_VERSION:-1.2.7} # 管道步骤 steps: # 1. 环境信息检查 - name: env-info image: /bin/zsh commands: - | set -e echo "=== 环境信息 ===" echo "PWD: $(pwd)" echo "Agent: ${CI_AGENT_NAME:-unknown}" echo "Backend: ${CI_SYSTEM_BACKEND} Platform: ${CI_SYSTEM_PLATFORM}" echo "Event: ${CI_BUILD_EVENT}" echo "Branch: ${CI_COMMIT_BRANCH}" echo "Commit: ${CI_COMMIT_SHA}" echo "Vina Version: ${VINA_VERSION}" echo "DockerHub User: ${DOCKERHUB_USERNAME:-未设置}" echo "=== 系统信息 ===" uname -a which docker || echo "Docker 未安装" which git || echo "Git 未安装" echo "=== 项目结构 ===" ls -la echo "=== Docker 文件检查 ===" ls -la docker/ || echo "docker 目录不存在" # 2. 工具版本检查 - name: tools-versions image: /bin/zsh commands: - | set -e echo "=== 工具版本检查 ===" echo "[Docker]" docker --version || echo "Docker 不可用" docker buildx version || echo "Docker Buildx 不可用" echo "[Git]" git --version || echo "Git 不可用" echo "[Woodpecker]" woodpecker-cli --version || echo "Woodpecker CLI 不可用" echo "[插件检查]" which plugin-docker-buildx || echo "plugin-docker-buildx 不可用" which plugin-git || echo "plugin-git 不可用" # 3. 代码质量检查 - name: code-quality image: /bin/zsh commands: - | set -e echo "=== 代码质量检查 ===" echo "检查 Dockerfile 语法..." if [ -f "docker/Dockerfile" ]; then echo "Dockerfile 存在" # 简单的语法检查 grep -n "FROM\|RUN\|COPY\|ENV" docker/Dockerfile | head -10 else echo "错误: Dockerfile 不存在" exit 1 fi echo "检查 docker-compose.yml..." if [ -f "docker/docker-compose.yml" ]; then echo "docker-compose.yml 存在" else echo "错误: docker-compose.yml 不存在" exit 1 fi echo "检查项目文件..." ls -la docker/ echo "代码质量检查完成" # 4. Docker 镜像构建 - name: docker-build image: /bin/zsh environment: DOCKER_BUILDKIT: 1 BUILDX_NO_DEFAULT_ATTESTATIONS: 1 commands: - | set -e echo "=== Docker 镜像构建 ===" # 设置镜像标签 if [ "${CI_BUILD_EVENT}" = "tag" ]; then IMAGE_TAG="${CI_COMMIT_TAG}" elif [ "${CI_BUILD_EVENT}" = "pull_request" ]; then IMAGE_TAG="pr-${CI_COMMIT_PULL_REQUEST}" else IMAGE_TAG="${CI_COMMIT_BRANCH:-latest}" fi # 清理标签中的特殊字符 IMAGE_TAG=$(echo "$IMAGE_TAG" | sed 's/[^a-zA-Z0-9._-]/-/g') IMAGE_NAME="vinatools" FULL_IMAGE_NAME="${DOCKERHUB_USERNAME}/${IMAGE_NAME}:${IMAGE_TAG}" LATEST_IMAGE_NAME="${DOCKERHUB_USERNAME}/${IMAGE_NAME}:latest" echo "构建镜像: ${FULL_IMAGE_NAME}" echo "Vina 版本: ${VINA_VERSION}" # 创建 buildx builder docker buildx create --name vinatools-builder --use || true docker buildx inspect --bootstrap # 构建镜像 docker buildx build \ --platform linux/amd64,linux/arm64 \ --build-arg VINA_VERSION="${VINA_VERSION}" \ --file docker/Dockerfile \ --tag "${FULL_IMAGE_NAME}" \ --tag "${LATEST_IMAGE_NAME}" \ --push \ . echo "镜像构建完成: ${FULL_IMAGE_NAME}" echo "镜像构建完成: ${LATEST_IMAGE_NAME}" # 5. 镜像验证 - name: image-verify image: /bin/zsh commands: - | set -e echo "=== 镜像验证 ===" # 设置镜像标签(与构建步骤一致) if [ "${CI_BUILD_EVENT}" = "tag" ]; then IMAGE_TAG="${CI_COMMIT_TAG}" elif [ "${CI_BUILD_EVENT}" = "pull_request" ]; then IMAGE_TAG="pr-${CI_COMMIT_PULL_REQUEST}" else IMAGE_TAG="${CI_COMMIT_BRANCH:-latest}" fi IMAGE_TAG=$(echo "$IMAGE_TAG" | sed 's/[^a-zA-Z0-9._-]/-/g') IMAGE_NAME="vinatools" FULL_IMAGE_NAME="${DOCKERHUB_USERNAME}/${IMAGE_NAME}:${IMAGE_TAG}" echo "验证镜像: ${FULL_IMAGE_NAME}" # 拉取并检查镜像 docker pull "${FULL_IMAGE_NAME}" || echo "镜像拉取失败,可能还在推送中" # 检查镜像信息 docker image inspect "${FULL_IMAGE_NAME}" || echo "镜像检查失败" echo "镜像验证完成" # 6. 清理构建缓存 - name: cleanup image: /bin/zsh commands: - | set -e echo "=== 清理构建缓存 ===" # 清理 buildx builder docker buildx rm vinatools-builder || echo "Builder 清理失败" # 清理本地镜像 docker image prune -f || echo "镜像清理失败" # 清理构建缓存 docker builder prune -f || echo "构建缓存清理失败" echo "清理完成" # 7. 通知(可选) - name: notify image: /bin/zsh when: status: [success, failure] commands: - | set -e echo "=== 构建通知 ===" if [ "${CI_BUILD_STATUS}" = "success" ]; then echo "✅ 构建成功!" echo "镜像已推送到 DockerHub: ${DOCKERHUB_USERNAME}/vinatools" else echo "❌ 构建失败!" echo "请检查构建日志" fi echo "构建状态: ${CI_BUILD_STATUS}" echo "构建时间: $(date)" echo "提交信息: ${CI_COMMIT_MESSAGE}"