pipeline {
  agent { label 'linux-jdk21' }
  options {
    skipDefaultCheckout(true)
    disableConcurrentBuilds()
    timeout(time: 10, unit: 'MINUTES')
    buildDiscarder(logRotator(numToKeepStr: '10'))
  }
  parameters {
    booleanParam(name: 'FAIL_TEST', defaultValue: false,
                 description: '只用于实验：让断言失败')
  }
  stages {
    stage('Prepare') {
      steps {
        deleteDir()
        writeFile file: 'Price.java', text: '''
public class Price {
    public static long total(long unit, int count) {
        if (unit < 0 || count < 0) throw new IllegalArgumentException();
        return Math.multiplyExact(unit, count);
    }
    public static void main(String[] args) {
        if (args.length > 0 && args[0].equals("test")) {
            long expected = Boolean.parseBoolean(System.getenv("FAIL_TEST")) ? 1 : 600;
            if (total(200, 3) != expected) throw new AssertionError("total mismatch");
            System.out.println("total test passed");
        } else {
            System.out.println("total=" + total(200, 3));
        }
    }
}
'''
        sh 'id; pwd; java -version; javac -version'
      }
    }
    stage('Compile and test') {
      steps {
        sh '''#!/bin/sh
set -eu
mkdir -p classes
javac --release 21 -d classes Price.java
java -cp classes Price test
'''
      }
    }
    stage('Package') {
      steps {
        sh '''#!/bin/sh
set -eu
mkdir -p dist
jar --create --file dist/price.jar --main-class Price -C classes .
java -jar dist/price.jar
cd dist
sha256sum price.jar > price.jar.sha256
'''
        archiveArtifacts artifacts: 'dist/*', fingerprint: true
      }
    }
  }
  post {
    failure { echo '本次构建失败，不能提升为发布制品。' }
    cleanup { deleteDir() }
  }
}
