kind: pipeline type: docker name: pr-ci # PR 流水线:仅在 PR 触发 trigger: event: - pull_request # 如需限制目标分支,可加 target: # target: # - main workspace: base: /drone path: . volumes: - name: maven-cache path: /localcache/maven/repository - name: npm-cache path: /localcache/npm-cache clone: depth: 0 image: drone/git:latest pull: false steps: - name: test_dir image: alpine pull: false # volumes: # - name: maven-cache # path: /localcache/maven/repository commands: - echo "✅ PR pipeline completed at $(date)" - touch /localcache/maven/repository/aaa.txt - ls -lah /localcache/maven/repository - name: java-build-test image: registry.cn-beijing.aliyuncs.com/yinzy/maven:3.9-eclipse-temurin-8 pull: false # volumes: # - name: maven-cache # path: /localcache/maven/repository environment: MAVEN_OPTS: -Dmaven.repo.local=/localcache/maven/repository commands: - touch /localcache/maven/repository/bbb.txt - ls -lah /localcache/maven/repository - mkdir -p ~/.m2 - cat ~/.m2/settings.xml - mvn -B clean test package -Dmaven.repo.local=/localcache/maven/repository - ls -lah target/*.jar || (echo "JAR file not found!" && exit 1) - name: frontend-build image: registry.cn-beijing.aliyuncs.com/yinzy/node:20.11-alpine3.19 pull: false volumes: - name: npm-cache path: /localcache/npm-cache commands: - cd vue-ui - npm config set cache /localcache/npm-cache/.npm - npm ci -prefer-offline --registry=https://registry.npmmirror.com - npm run build - ls -lah dist # 如需其他检查步骤,可在这里继续追加 - name: summary image: alpine pull: false commands: - echo "✅ PR pipeline completed at $(date)" when: status: [ success, failure ] depends_on: - java-build-test - frontend-build --- kind: pipeline type: docker name: release-tag # Tag 流水线:仅在 tag 触发(不要加 branch 限制) trigger: event: - tag branch: - "**" workspace: base: /drone path: . volumes: - name: maven-cache path: /localcache/maven/repository - name: docker_sock path: /var/run/docker.sock - name: jar-cache path: /localcache/apps - name: npm-cache path: /localcache/npm-cache clone: depth: 0 image: drone/git:latest pull: false steps: - name: frontend-build image: registry.cn-beijing.aliyuncs.com/yinzy/node:20.11-alpine3.19 pull: false volumes: - name: npm-cache path: /localcache/npm-cache - name: jar-cache # 复用已有 /localcache,用于暂存 dist.zip path: /localcache/apps commands: - cd vue-ui - npm config set cache /localcache/npm-cache/.npm - npm ci -prefer-offline --registry=https://registry.npmmirror.com - npm run build - cd dist && tar -czf ../dist.tgz . && cd .. - mkdir -p /localcache/apps/${DRONE_REPO_NAME} - cp dist.tgz /localcache/apps/${DRONE_REPO_NAME}/dist-${DRONE_TAG}.tgz -f - ls -lah /localcache/apps/${DRONE_REPO_NAME}/dist-${DRONE_TAG}.tgz - name: java-build image: registry.cn-beijing.aliyuncs.com/yinzy/maven:jk3.9-8 pull: false volumes: - name: maven-cache path: /localcache/maven/repository - name: jar-cache path: /localcache/apps environment: MAVEN_OPTS: -Dmaven.repo.local=/localcache/maven/repository commands: - mvn -B -DskipTests=true clean package - ls -lah target/*.jar || (echo "JAR file not found!" && exit 1) - | mkdir -p /localcache/apps/${DRONE_REPO_NAME} JAR_FILE=$(ls target/*.jar 2>/dev/null | head -1) if [ -n "$JAR_FILE" ]; then cp "$JAR_FILE" /localcache/apps/${DRONE_REPO_NAME}/ -f echo "✅ JAR file backed up to /localcache/apps/${DRONE_REPO_NAME}/$(basename $JAR_FILE)" ls -lh /localcache/apps/${DRONE_REPO_NAME}/ else echo "⚠️ No JAR file found to backup" fi - name: frontend_docker_build image: docker:latest pull: false volumes: - name: docker_sock path: /var/run/docker.sock commands: - cp /localcache/apps/${DRONE_REPO_NAME}/dist-${DRONE_TAG}.tgz dist.tgz - ls -lh dist.tgz - docker info - docker build -t ${DRONE_REPO_NAME}-frontend:latest -f docker/Dockerfile-frontend . - docker tag ${DRONE_REPO_NAME}-frontend:latest ${DRONE_REPO_NAME}-frontend:${DRONE_COMMIT_SHA:0:8} - docker images ${DRONE_REPO_NAME}-frontend depends_on: - frontend-build - name: docker_build image: docker:latest pull: false volumes: - name: docker_sock path: /var/run/docker.sock commands: - docker info || (echo "❌ Docker daemon not available" && exit 1) - | if [ ! -f target/drone-test-1.0.jar ]; then echo "❌ JAR file not found! Make sure java-build step completed successfully." ls -la target/ || echo "target directory does not exist" exit 1 fi echo "📦 Building Docker image: ${DRONE_REPO_NAME}:latest" ls -lh target/drone-test-1.0.jar docker build -t ${DRONE_REPO_NAME}:latest -f docker/Dockerfile . docker tag ${DRONE_REPO_NAME}:latest ${DRONE_REPO_NAME}:${DRONE_COMMIT_SHA:0:8} docker images ${DRONE_REPO_NAME} depends_on: - java-build - name: gitea_release image: registry.cn-beijing.aliyuncs.com/yinzy/drone-plugins:gitea-release-latest pull: false volumes: - name: jar-cache path: /localcache/apps settings: api_key: from_secret: gitea_token base_url: from_secret: gitea_base_url files: - /localcache/apps/${DRONE_REPO_NAME}/*.jar - /localcache/apps/${DRONE_REPO_NAME}/dist-${DRONE_TAG}.tgz title: Release ${DRONE_TAG} note: | Release ${DRONE_TAG} Commit: ${DRONE_COMMIT_SHA:0:8} Build: ${DRONE_BUILD_NUMBER} file_exists: overwrite depends_on: - docker_build - frontend_docker_build - name: push_acr image: docker:latest pull: false volumes: - name: docker_sock path: /var/run/docker.sock environment: ACR_USER: from_secret: aliyun_acr_username # 阿里云访问凭证用户名 ACR_PASS: from_secret: aliyun_acr_password # 阿里云访问凭证密码 ACR_REGISTRY: registry.cn-beijing.aliyuncs.com ACR_NAMESPACE: yinzy ACR_REPO: cicd commands: - echo "$ACR_PASS" | docker login $ACR_REGISTRY -u "$ACR_USER" --password-stdin # 后端 - docker tag ${DRONE_REPO_NAME}:latest $ACR_REGISTRY/$ACR_NAMESPACE/$ACR_REPO:back-${DRONE_TAG} - docker push $ACR_REGISTRY/$ACR_NAMESPACE/$ACR_REPO:back-${DRONE_TAG} # 前端 - docker tag ${DRONE_REPO_NAME}-frontend:latest $ACR_REGISTRY/$ACR_NAMESPACE/$ACR_REPO:front-${DRONE_TAG} - docker push $ACR_REGISTRY/$ACR_NAMESPACE/$ACR_REPO:front-${DRONE_TAG} depends_on: - docker_build - frontend_docker_build - name: summary image: alpine pull: false commands: - echo "✅ Tag pipeline completed at $(date)" when: status: [ success, failure ] depends_on: - gitea_release