.env_setting: &env_setting name: version env setting script: | echo "CNB_BRANCH: ${CNB_BRANCH}" VERSION="${CNB_BRANCH#v}" MAJOR=$(echo "$VERSION" | cut -d'.' -f1) MINOR=$(echo "$VERSION" | cut -d'.' -f2) PATCH=$(echo "$VERSION" | cut -d'.' -f3) echo "##[set-output version=$VERSION]" echo "##[set-output major=$MAJOR]" echo "##[set-output minor=$MINOR]" echo "##[set-output patch=$PATCH]" git fetch --quiet --tags CURRENT_TAG=${CNB_BRANCH} echo "CURRENT_TAG: ${CURRENT_TAG}" LATEST_TAG=$(git tag | sort -V | tail -n 1) echo "LATEST_TAG: ${LATEST_TAG}" LATEST_MAJOR_TAG=$(git tag | grep "^v${MAJOR}\." | sort -V | tail -n 1) echo "LATEST_MAJOR_TAG: ${LATEST_MAJOR_TAG}" DOCKER_TARGET="${IMAGE_NAME}:${VERSION},${IMAGE_NAME}:${MAJOR}.${MINOR}" if [ "$CURRENT_TAG" = "$LATEST_MAJOR_TAG" ]; then DOCKER_TARGET="${DOCKER_TARGET},${IMAGE_NAME}:${MAJOR}"; fi if [ "$CURRENT_TAG" = "$LATEST_TAG" ]; then DOCKER_TARGET="${DOCKER_TARGET},${IMAGE_NAME}:latest"; fi echo "##[set-output docker_target=$DOCKER_TARGET]" exports: version: VERSION major: MAJOR minor: MINOR patch: PATCH docker_target: DOCKER_TARGET .env_testing: &env_testing name: version env testing script: | echo "VERSION: ${VERSION}" echo "MAJOR: ${MAJOR}" echo "MINOR: ${MINOR}" echo "PATCH: ${PATCH}" echo "DOCKER_TARGET: ${DOCKER_TARGET}" .build_docker: &build_docker # 声明式的构建环境 https://docs.cnb.cool/ # 可以去dockerhub上 https://hub.docker.com/_/maven 找到您需要maven和jdk版本 image: maven:3.9-eclipse-temurin-17-noble volumes: # 声明式的构建缓存 https://docs.cnb.cool/zh/grammar/pipeline.html#volumes - /root/.m2:copy-on-write .build_jobs: &build_jobs - <<: *env_setting - <<: *env_testing - name: mvn package script: | sed -i "s#CNB_REPO_SLUG#${CNB_REPO_SLUG}#g" ".cnb/maven-settings.xml" cat ".cnb/maven-settings.xml" mvn -B clean package -Dmaven.test.skip=true -Dmaven.javadoc.skip=true -s .cnb/maven-settings.xml - name: docker login script: docker login -u ${CNB_TOKEN_USER_NAME} -p "${CNB_TOKEN}" ${CNB_DOCKER_REGISTRY} - name: docker build script: docker buildx build --progress=plain --push -t ${IMAGE_NAME}:${VERSION}-linux-${PLATFORM} . - name: resolve type: cnb:resolve options: key: build-${PLATFORM} .await_amd64: &await_amd64 name: await the amd64 type: cnb:await options: key: build-amd64 .await_arm64: &await_arm64 name: await the arm64 type: cnb:await options: key: build-arm64 .docker_manifest: &docker_manifest name: docker manifest env: VERSION_NAME: ${VERSION} image: cnbcool/manifest settings: username: ${DOCKER_USER} password: ${DOCKER_TOKEN} target: ${DOCKER_TARGET} template: ${IMAGE_NAME}:${VERSION}-OS-ARCH platforms: - linux/amd64 - linux/arm64 .docker_remove_tag: &docker_remove_tag name: docker remove tag type: artifact:remove-tag options: name: ${CNB_REPO_NAME} tags: - ${VERSION}-linux-amd64 - ${VERSION}-linux-arm64 type: docker .trigger_deploy: &trigger_deploy - name: trigger deploy CNB image to server image: cnbcool/webhook imports: - https://cnb.cool/ujcms/secrets/-/blob/main/env.yml settings: urls: - https://api.cnb.cool/ujcms/deploy/-/build/start method: POST content_type: application/json headers: - "Accept=application/json" template: | { "event": "api_trigger_deploy_cnb" } token_type: "Bearer" token_value: "$CNB_TRIGGER_TOKEN" # 分支名 v*.*.*: tag_push: - name: docker build amd64 runner: tags: cnb:arch:amd64 docker: *build_docker services: - docker env: IMAGE_NAME: ${CNB_DOCKER_REGISTRY}/${CNB_REPO_SLUG_LOWERCASE} PLATFORM: amd64 stages: *build_jobs - name: docker build arm64 runner: tags: cnb:arch:arm64:v8 docker: *build_docker services: - docker env: IMAGE_NAME: ${CNB_DOCKER_REGISTRY}/${CNB_REPO_SLUG_LOWERCASE} PLATFORM: arm64 stages: *build_jobs - name: docker manifest and remove tag services: - docker env: IMAGE_NAME: ${CNB_DOCKER_REGISTRY}/${CNB_REPO_SLUG_LOWERCASE} stages: - <<: *await_amd64 - <<: *await_arm64 - <<: *env_setting - <<: *env_testing - <<: *docker_manifest - <<: *docker_remove_tag - <<: *trigger_deploy $: vscode: - docker: build: .ide/Dockerfile volumes: - /root/.m2:copy-on-write services: - vscode - docker