Skip to content

示例

前端

groovy
pipeline {
  agent any
  options {
    durabilityHint('PERFORMANCE_OPTIMIZED')
  }

  environment {
    ENV_FILE = ''
  }

  stages {
    stage('打印环境变量') {
      steps {
        sh 'printenv'
      }
    }
    stage('拉取代码') {
      steps {
        script {
          echo "开始拉取代码..."
          echo "仓库地址: ${env.GIT_URL}"
          echo "分支: ${env.GIT_BRANCH}"
        }
        checkout([
          $class: 'GitSCM',
          branches: [[name: env.GIT_BRANCH]],
          userRemoteConfigs: [[
            url: env.GIT_URL,
            credentialsId: 'git-devops'
          ]]
        ])
        sh 'pwd && ls -al'
      }
    }

    stage('设置环境') {
      steps {
        script {
          echo "current branches: ${env.GIT_BRANCH}"
          def envFile = ''
          switch(env.GIT_BRANCH) {
            case 'origin/ci-dev':
            case 'ci-dev':
              envFile = '.ci/.env.dev'
              break
            case 'origin/ci-test':
            case 'ci-test':
              envFile = '.ci/.env.test'
              break
            case 'origin/ci-online':
            case 'ci-online':
              envFile = '.ci/.env.online'
              break
            default:
              error "不支持的分支:${env.GIT_BRANCH}"
          }
          echo "当前构建分支:${env.GIT_BRANCH}"
          echo "加载环境变量文件:${envFile}"
          // 加载环境变量
          def envMap = readProperties file: envFile
          envMap.each { key, value ->
            env."${key}" = value
          }
          sh 'printenv'
        }
      }
    }

    stage('Node 14 构建') {
      agent {
        kubernetes {
          label 'node-14-pod'
          defaultContainer 'node-14'
          yaml """
apiVersion: v1
kind: Pod
spec:
  hostNetwork: true
  nodeSelector:
    dns-access: 'true'
  containers:
  - name: node-14
    image: node:14
    env:
      - name: JENKINS_TUNNEL
        value: ${JENKINS_TUNNEL}
      - name: JENKINS_URL
        value: ${JENKINS_URL}
    command: ['cat']
    tty: true
    volumeMounts:
    - name: npm-cache
      mountPath: /tmp/npm/
  volumes:
  - name: npm-cache
    persistentVolumeClaim:
      claimName: npm-cache-pvc
"""
        }
      }
      steps {
        container('node-14') {
          sh 'npm config set sass_binary_site=https://npmmirror.com/mirrors/node-sass/'
          sh 'npm config set strict-ssl false'
          sh "npm config set cache /tmp/npm"
          sh "npm ci --registry=https://registry.npmmirror.com && ${BUILD_COMMAND}"
          sh 'pwd && ls -l'
          sh 'tar czf dist.tar.gz -C dist .'

          script {
            archiveArtifacts artifacts: 'dist.tar.gz', fingerprint: true
          }
        }
      }
    }

    stage('上传复制发布') {
      steps {
        copyArtifacts(
          projectName: env.JOB_NAME,
          selector: [
            $class: 'SpecificBuildSelector',
            buildNumber: "${BUILD_NUMBER}"
          ],
          filter: "dist.tar.gz",
          fingerprintArtifacts: true
        )
        sshagent (credentials: [env.SSH_KEY_ID]) {
          sh """
            scp  dist.tar.gz ${SSH_USER}@${SSH_HOST}:${SSH_COPY_PATH}
            ssh  ${SSH_USER}@${SSH_HOST} ${DEPLOY}
          """
        }
      }
    }
  }
}

后端

groovy
pipeline {
  agent any
  options {
    durabilityHint('PERFORMANCE_OPTIMIZED')
  }

  environment {
    ENV_FILE = ''
  }

  stages {
    stage('打印环境变量') {
      steps {
        sh 'printenv'
      }
    }
    stage('拉取代码') {
      steps {
        script {
          echo "开始拉取代码..."
          echo "仓库地址: ${env.GIT_URL}"
          echo "分支: ${env.GIT_BRANCH}"
        }
        checkout([
          $class: 'GitSCM',
          branches: [[name: env.GIT_BRANCH]],
          userRemoteConfigs: [[
            url: env.GIT_URL,
            credentialsId: 'git-devops'
          ]]
        ])
        sh 'pwd && ls -al'
      }
    }

    stage('设置环境') {
      steps {
        script {
          echo "current branches: ${env.GIT_BRANCH}"
          def envFile = ''
          switch(env.GIT_BRANCH) {
            case 'origin/ci-dev':
            case 'ci-dev':
              envFile = '.ci/.env.dev'
              break
            case 'origin/ci-test':
            case 'ci-test':
              envFile = '.ci/.env.test'
              break
            case 'origin/ci-online':
            case 'ci-online':
              envFile = '.ci/.env.online'
              break
            default:
              error "不支持的分支:${env.GIT_BRANCH}"
          }
          echo "当前构建分支:${env.GIT_BRANCH}"
          echo "加载环境变量文件:${envFile}"
          // 加载环境变量
          def envMap = readProperties file: envFile
          envMap.each { key, value ->
            env."${key}" = value
          }
          sh 'printenv'
        }
      }
    }

    stage('Maven 构建') {
      agent {
        kubernetes {
          label 'maven-pod'
          defaultContainer 'maven'
          yaml """
apiVersion: v1
kind: Pod
spec:
  hostNetwork: true
  nodeSelector:
    dns-access: 'true'
  containers:
  - name: maven
    image: maven:3.9.6-eclipse-temurin-8
    env:
      - name: JENKINS_TUNNEL
        value: ${JENKINS_TUNNEL}
      - name: JENKINS_URL
        value: ${JENKINS_URL}
    command: ['cat']
    tty: true
    volumeMounts:
    - name: maven-settings
      mountPath: /root/.m2/settings.xml
      subPath: settings.xml
    - name: maven-cache
      mountPath: /tmp/maven/
  volumes:
  - name: maven-settings
    configMap:
      name: maven-settings-config
  - name: maven-cache
    persistentVolumeClaim:
      claimName: maven-cache-pvc
"""
        }
      }
      steps {
        container('maven') {
          sh "mvn clean package -T 8C -s ${MAVEN_SETTINGS}"
          sh 'pwd'
          script {
            archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true
          }
        }
      }
    }

    stage('上传与重启服务') {
      parallel {
        stage('API 服务部署') {
          steps {
            copyArtifacts(
              projectName: env.JOB_NAME,
              selector: [
                $class: 'SpecificBuildSelector',
                buildNumber: "${BUILD_NUMBER}"
              ],
              filter: "**/${JAR_NAME_API}",
              fingerprintArtifacts: true
            )
            sshagent (credentials: [env.SSH_KEY_ID]) {
              sh """
                scp ${JAR_PATH_API}/${JAR_NAME_API} ${SSH_USER}@${SSH_HOST}:${SSH_COPY_PATH_API}
                ssh ${SSH_USER}@${SSH_HOST} ${RESTART_API}
              """
            }
          }
        }
        stage('SCHEDULE 服务部署') {
          steps {
            copyArtifacts(
              projectName: env.JOB_NAME,
              selector: [
                $class: 'SpecificBuildSelector',
                buildNumber: "${BUILD_NUMBER}"
              ],
              filter: "**/${JAR_NAME_SCHEDULE}",
              fingerprintArtifacts: true
            )
            sshagent (credentials: [env.SSH_KEY_ID]) {
              sh """
                scp ${JAR_PATH_SCHEDULE}/${JAR_NAME_SCHEDULE} ${SSH_USER}@${SSH_HOST}:${SSH_COPY_PATH_SCHEDULE}
                ssh ${SSH_USER}@${SSH_HOST} ${RESTART_SCHEDULE}
              """
            }
          }
        }
      }
    }
  }
}