diff --git a/.gitea/workflows/docker-build.yml b/.gitea/workflows/docker-build.yml new file mode 100644 index 0000000..8bfc3ad --- /dev/null +++ b/.gitea/workflows/docker-build.yml @@ -0,0 +1,74 @@ +# GitHub Actions 工作流 - 构建和推送 Docker 镜像 +name: Build and Push Docker Image + +on: + push: + branches: [ main, develop ] + tags: [ 'v*' ] + pull_request: + branches: [ main ] + workflow_dispatch: + inputs: + image_tag: + description: "Tag to push (leave empty to use 'latest')" + required: false + default: "" + +jobs: + docker: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + # 解析镜像标签 + - name: Resolve TAG + id: meta + env: + INPUT_TAG: ${{ github.event.inputs.image_tag || '' }} + run: | + set -euo pipefail + if [ -n "$INPUT_TAG" ]; then + TAG="$INPUT_TAG" + elif [ "${{ github.event_name }}" = "push" ] && [[ "${{ github.ref }}" =~ ^refs/tags/v ]]; then + TAG="${GITHUB_REF#refs/tags/}" + elif [ "${{ github.event_name }}" = "push" ] && [ "${{ github.ref }}" = "refs/heads/main" ]; then + TAG="latest" + elif [ "${{ github.event_name }}" = "push" ]; then + TAG="${GITHUB_REF#refs/heads/}" + else + TAG="dev" + fi + + # 规范化标签 + TAG="$(printf '%s' "$TAG" | tr '[:upper:]' '[:lower:]' | sed -E 's#[^a-z0-9._-]#-#g; s#/+#-#g; s#^[.-]+##; s#[.-]+$##')" + TAG="${TAG:0:128}" + echo "tag=$TAG" >> "$GITHUB_OUTPUT" + echo "Resolved TAG: $TAG" + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to DockerHub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Build and Push Docker Image + uses: docker/build-push-action@v5 + with: + context: . + file: ./docker/Dockerfile + platforms: linux/amd64,linux/arm64 + push: true + tags: | + ${{ secrets.DOCKERHUB_USERNAME }}/vinatools:${{ steps.meta.outputs.tag }} + ${{ secrets.DOCKERHUB_USERNAME }}/vinatools:latest + build-args: | + VINA_VERSION=${{ vars.VINA_VERSION || '1.2.7' }} + cache-from: type=gha + cache-to: type=gha,mode=max + + - name: Image Digest + run: echo ${{ steps.docker_build.outputs.digest }} diff --git a/.woodpecker.simple.yml b/.woodpecker.simple.yml new file mode 100644 index 0000000..346f0e3 --- /dev/null +++ b/.woodpecker.simple.yml @@ -0,0 +1,47 @@ +# 简化版 Woodpecker CI 配置 +# 适用于快速测试和简单部署 + +when: + event: [push, manual] + branch: [main, develop] + +environment: + DOCKERHUB_USERNAME: ${DOCKERHUB_USERNAME} + DOCKERHUB_TOKEN: ${DOCKERHUB_TOKEN} + +steps: + # 构建和推送 + - name: build-and-push + image: /bin/zsh + commands: + - | + set -e + echo "=== 构建 vinatools 镜像 ===" + + # 设置镜像标签 + if [ "${CI_BUILD_EVENT}" = "tag" ]; then + TAG="${CI_COMMIT_TAG}" + else + TAG="${CI_COMMIT_BRANCH:-latest}" + fi + + # 清理标签 + TAG=$(echo "$TAG" | sed 's/[^a-zA-Z0-9._-]/-/g') + IMAGE="${DOCKERHUB_USERNAME}/vinatools:${TAG}" + + echo "构建镜像: ${IMAGE}" + + # 登录 DockerHub + echo "${DOCKERHUB_TOKEN}" | docker login --username "${DOCKERHUB_USERNAME}" --password-stdin + + # 构建并推送 + docker buildx create --name builder --use || true + docker buildx build \ + --platform linux/amd64,linux/arm64 \ + --file docker/Dockerfile \ + --tag "${IMAGE}" \ + --tag "${DOCKERHUB_USERNAME}/vinatools:latest" \ + --push \ + . + + echo "✅ 构建完成: ${IMAGE}" diff --git a/.woodpecker.yml b/.woodpecker.yml new file mode 100644 index 0000000..b79c1e3 --- /dev/null +++ b/.woodpecker.yml @@ -0,0 +1,204 @@ +# 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}"