diff --git a/.drone.yml b/.drone.yml index 897a9a8..4bbb857 100644 --- a/.drone.yml +++ b/.drone.yml @@ -2,30 +2,52 @@ kind: pipeline type: docker name: multi-lang-ci +# 推荐工作区配置 - 修改为当前项目的正确路径 +workspace: + base: /drone + path: . + +# 定义缓存卷,用于存储 Maven 依赖 +volumes: + - name: cache + temp: {} + - name: npm-cache + path: /localcache/npmcache + # 添加 Maven 缓存卷(虽然通过 runner 挂载,但显式声明更清晰) + - name: maven-cache + path: /localcache/maven/repository + # 定义 Docker socket 卷 + - name: docker_sock + path: /var/run/docker.sock + +# 触发器配置:针对 master 分支的 PR trigger: event: - pull_request branch: - - main # <<< 确保分支名称与您的主分支一致 + - main +# 默认克隆步骤 (使用您本地已有的 drone/git:latest) clone: depth: 0 image: drone/git:latest - pull: false + pull: false # 禁用镜像拉取 steps: # 自动检测是否存在 Java (pom.xml) - name: java-build - image: maven:3.9-eclipse-temurin + 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=.m2/repository + MAVEN_OPTS: -Dmaven.repo.local=/localcache/maven/repository commands: - # 在当前工作目录而非 ~ 下创建 .m2 目录,避免权限问题 - - mkdir -p .m2/repository - # 动态生成 settings.xml + - mkdir -p ~/.m2 + # 动态生成 settings.xml(仅用于 CI) - | - cat > settings.xml << 'EOF' + cat > ~/.m2/settings.xml << 'EOF' EOF - # 使用自定义 settings.xml - - mvn -s settings.xml clean verify + - mvn -s ~/.m2/settings.xml -DskipTests=true clean package + # 验证 JAR 文件是否生成 + - ls -lah target/*.jar || (echo "JAR file not found!" && exit 1) + # 备份 JAR 文件到 /localcache/${DRONE_REPO_NAME} + - | + mkdir -p /localcache/${DRONE_REPO_NAME} + JAR_FILE=$(ls target/*.jar 2>/dev/null | head -1) + if [ -n "$JAR_FILE" ]; then + cp "$JAR_FILE" /localcache/${DRONE_REPO_NAME}/ -f + echo "✅ JAR file backed up to /localcache/${DRONE_REPO_NAME}/$(basename $JAR_FILE)" + ls -lh /localcache/${DRONE_REPO_NAME}/ + else + echo "⚠️ No JAR file found to backup" + fi when: path: include: - - pom.xml # 仅当存在 pom.xml 文件时运行 + - pom.xml + event: [ push, pull_request, tag ] + + - name: docker_build + image: docker:latest + pull: false + volumes: + - name: docker_sock + path: /var/run/docker.sock + commands: + # 验证 Docker daemon 是否可用 + - docker info || (echo "❌ Docker daemon not available" && exit 1) + # 验证 JAR 文件存在 + - | + 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" + echo "📁 JAR file info:" + ls -lh target/drone-test-1.0.jar + docker build -t ${DRONE_REPO_NAME}:latest -f Dockerfile . + docker tag ${DRONE_REPO_NAME}:latest ${DRONE_REPO_NAME}:${DRONE_COMMIT_SHA:0:8} + echo "✅ Built Docker image: ${DRONE_REPO_NAME}:latest" + docker images ${DRONE_REPO_NAME} + depends_on: + - java-build + when: + path: + include: + - pom.xml + event: [ push, pull_request, tag ] # 自动检测是否存在 Python (requirements.txt) - name: python-test image: python:3.12.0-slim pull: false commands: - # 临时设置 pip 源 + # 临时设置 pip 源(仅本次会话) - pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple/ - pip config set install.trusted-host pypi.tuna.tsinghua.edu.cn - - pip install -r requirements.txt - - python -m pytest test_example.py -v + - if [ -f requirements.txt ]; then pip install -r requirements.txt; fi + - if [ -f test_example.py ]; then python -m pytest test_example.py -v; fi when: - path: - include: - - requirements.txt # 仅当存在 requirements.txt 文件时运行 - + branch: + exclude: [ "*" ] + # 最终报告(无论成功失败都运行) - name: summary image: alpine diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..4810781 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,11 @@ +# 使用最小的 Java 8 JRE 镜像 +FROM openjdk:8-jre-alpine + +# 设置工作目录 +WORKDIR /app + +# 复制生成的 JAR 文件到容器中(使用通配符匹配) +COPY target/*.jar app.jar + +# 运行应用 +ENTRYPOINT ["java", "-jar", "app.jar"] diff --git a/pom.xml b/pom.xml index 3668646..f2ec93c 100644 --- a/pom.xml +++ b/pom.xml @@ -7,16 +7,72 @@ com.example drone-test 1.0 + jar + - 17 - 17 + 8 + 8 + UTF-8 - - - org.junit.jupiter - junit-jupiter - 5.12.2 - test - - + + + + org.junit.jupiter + junit-jupiter + 5.12.2 + test + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + 8 + 8 + UTF-8 + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.2.0 + + + + com.example.App + + + + + + + + org.apache.maven.plugins + maven-shade-plugin + 3.2.4 + + + package + + shade + + + + + com.example.App + + + + + + + + \ No newline at end of file