Jenkins+gitee实现流水线自动化构建

294 阅读2分钟

一. 全局工具配置(系统管理-> 全局工具配置)

image.png

image.png

image.png

image.png

二. 创建流水线(脚本在第四步)

image.png

image.png

image.png

image.png

image.png

image.png

三. 添加凭据

image.png

image.png

四. 备份以及启动的一些脚本

  • backup.sh
#!/bin/bash

# 要备份的文件路径
source_file="/opt/myproject/dockerdemo/builded/service-two/target/output/dockerdemo.jar"

# 备份文件的目标文件夹
backup_dir="/opt/myproject/dockerdemo/builded/backup"

# 获取当前时间,格式为年月日时分秒
current_time=$(date +"%Y%m%d%H%M%S")

# 检查目标文件夹是否存在,如果不存在则创建
if [ ! -d "$backup_dir" ]; then
    mkdir -p "$backup_dir"
fi

# 创建备份文件的路径
backup_filename=$(basename "$source_file" | sed "s/\./_${current_time}\./")
backup_path="$backup_dir/$backup_filename"

# 复制源文件到备份路径
cp "$source_file" "$backup_path"

echo "备份已完成:$source_file -> $backup_path"
  • startall.sh
nohup java -Xms1024m -Xmx2048m -jar ./service-two/target/output/dockerdemo.jar  1>dockerdemo-start.out 2>&1 &
  • stopall.sh
# 要停止的Java Jar程序的关键词
jar_keyword="dockerdemo.jar"

# 查找匹配的进程ID
pid=$(pgrep -f "$jar_keyword")

if [ -z "$pid" ]; then
    echo "未找到运行中的Java Jar程序: $jar_keyword"
else
    echo "正在尝试正常停止进程 $pid"
    
    kill "$pid"

    sleep 10  # 等待10秒,给程序一些时间处理终止信号

    if pgrep -P "$pid" >/dev/null; then
        echo "正常终止失败,尝试强制停止进程 $pid"
        kill -9 "$pid"
        echo "已强制停止进程 $pid"
    else
        echo "已成功正常终止进程 $pid"
    fi

fi

五. 流水线脚本

//用于轻量化部署的jenkins 流水线
def createDateTime() {
    // 定义一个版本号作为当次构建的版本,输出结果 20191210175842_69
    return new Date().format('yyyyMMddHHmmss')
}


pipeline {
    agent any
    environment {
        JOB_DESCRIPTION = "demo-DEV环境"
        BOT_KEY="0"
        _dateTime = createDateTime()
    }

    options { // 执行选项
        buildDiscarder(logRotator(numToKeepStr: '1'))   // 保存历史构建记录的数量
        disableConcurrentBuilds() // 不允许并发构建
        timeout(time: 1, unit: 'HOURS') // 构建超时时间最多1个小时
    }
    
    
    parameters {
		string  name: 'deployOption',description: '部署方式 全量=full,增量(贼快)=mini',defaultValue: 'full', trim: true 
		gitParameter name: 'BRANCH_TAG',
		branchFilter: 'origin/(.*)',
		quickFilterEnabled: false,
		selectedValue: 'DEFAULT',
		sortMode: 'NONE',
		tagFilter: '*',
		type: 'PT_BRANCH_TAG',
		defaultValue: 'dev',
		useRepository: 'https://gitee.com/你的gitee项目/dockerdemo.git'
    }


    tools {
        maven 'maven3.9.2' // 使用maven
        git 'git2.39.2'
    }
 
    stages {  
        stage('Pre-Build') { // 预构建阶段
            steps {

                checkout([$class: 'GitSCM', gitTool: 'git2.39.2',branches: [[name: "${params.BRANCH_TAG}"]], extensions: [], userRemoteConfigs: [[credentialsId: 'df6538f0-74c1-4da4-8a89-60bf62ac3068', url: 'https://gitee.com/你的gitee项目/dockerdemo.git']]])

            }
        }
        stage('Build') { 
            steps {
                sh "mvn clean package -Dmaven.test.skip=true -P ${params.deployOption} "
            }
            
            post {
                // 构建成功后,发送jar包到对应服务器,并重启服务
                success {
                    script {
                        switch("${params.deployOption}"){
                            case "full" :
                                //先上传文件,后执行命令,命令和源文件,两者必须有一个有值
                                sshPublisher(
                                    publishers: [
                                        sshPublisherDesc(
                                            configName: 'mymac', 
                                            transfers: [
                                                //备份旧文件,清空传输目录
                                                sshTransfer(
                                                    cleanRemote: false,
                                                    excludes: '', 
                                                    execCommand: 'cd /opt/myproject/dockerdemo/builded && ./backup.sh', 
                                                    execTimeout: 120000, 
                                                    flatten: false,
                                                    makeEmptyDirs: false, 
                                                    noDefaultExcludes: false,
                                                    patternSeparator: '[, ]+', 
                                                    remoteDirectory: 'myproject/dockerdemo/builded', 
                                                    remoteDirectorySDF: false, 
                                                    removePrefix: '', 
                                                    sourceFiles: ''
                                                ),
                                                //传输jar,cfg,sh文件
                                                sshTransfer(
                                                    cleanRemote: false,
                                                    excludes: '', 
                                                    execCommand: 'echo \'Send file ...\'', 
                                                    execTimeout: 120000, 
                                                    flatten: false,
                                                    makeEmptyDirs: false, 
                                                    noDefaultExcludes: false,
                                                    patternSeparator: '[, ]+', 
                                                    remoteDirectory: 'myproject/dockerdemo/builded', 
                                                    remoteDirectorySDF: false, 
                                                    removePrefix: '', 
                                                    sourceFiles: '**/target/output/*.*,**/target/output/**'
                                                ),
                                                //传输resources下的mapper xml
												sshTransfer(
														cleanRemote: false,
														excludes: '',
														execCommand: 'echo \'Send file ...\'',
														execTimeout: 600000,
														flatten: false,
														makeEmptyDirs: false,
														noDefaultExcludes: false,
														patternSeparator: '[, ]+',
														remoteDirectory: 'myproject/dockerdemo/builded',
														remoteDirectorySDF: false,
														removePrefix: '',
														sourceFiles: '**/target/output/resources/mapper/*.xml'
												),
												//传输resources下其他文件
												sshTransfer(
														cleanRemote: false,
														excludes: '',
														execCommand: 'echo \'Send file ...\'',
														execTimeout: 600000,
														flatten: false,
														makeEmptyDirs: false,
														noDefaultExcludes: false,
														patternSeparator: '[, ]+',
														remoteDirectory: 'myproject/dockerdemo/builded',
														remoteDirectorySDF: false,
														removePrefix: '',
														sourceFiles: '**/target/output/resources/**/**'
												),
												//停止服务,删除旧文件,拷贝新文件,启动服务
												sshTransfer(
														cleanRemote: false,
														excludes: '',
														execCommand: 'cd /opt/myproject/dockerdemo/builded && ./stopall.sh && cd /opt/myproject/dockerdemo/builded  && ./startall.sh ',
														execTimeout: 600000,
														flatten: false,
														makeEmptyDirs: false,
														noDefaultExcludes: false,
														patternSeparator: '[, ]+',
														remoteDirectory: 'myproject/dockerdemo/builded',
														remoteDirectorySDF: false,
														removePrefix: '',
														sourceFiles: ''
												)
                                            ],
                                            usePromotionTimestamp: false, 
                                            useWorkspaceInPromotion: false,
                                            verbose: false
                                        )
                                    ]
                                )
							break;
							default:
							sshPublisher(
									// 发送到远程机器
                                    publishers: [
                                        sshPublisherDesc(
                                            configName: 'mymac', 
                                            transfers: [
                                                //备份旧文件,清空传输目录
                                                sshTransfer(
                                                    cleanRemote: false,
                                                    excludes: '', 
                                                    execCommand: 'cd /opt/myproject/dockerdemo/builded && ./backup.sh', 
                                                    execTimeout: 120000, 
                                                    flatten: false,
                                                    makeEmptyDirs: false, 
                                                    noDefaultExcludes: false,
                                                    patternSeparator: '[, ]+', 
                                                    remoteDirectory: 'myproject/dockerdemo/builded', 
                                                    remoteDirectorySDF: false, 
                                                    removePrefix: '', 
                                                    sourceFiles: ''
                                                ),
                                                //传输新文件
                                                sshTransfer(
                                                    cleanRemote: false,
                                                    excludes: '', 
                                                    execCommand: 'echo \'Send file ...\'', 
                                                    execTimeout: 120000, 
                                                    flatten: false,
                                                    makeEmptyDirs: false, 
                                                    noDefaultExcludes: false,
                                                    patternSeparator: '[, ]+', 
                                                    remoteDirectory: 'myproject/dockerdemo/builded', 
                                                    remoteDirectorySDF: false, 
                                                    removePrefix: '', 
                                                    sourceFiles: '**/target/*.zip'
                                                ),
                                                // 停止服务,删除旧文件,拷贝新文件,启动服务
												// 解压缩时远程调用经常会被里面的信息干扰,认为脚本执行失败,要在前面加上sh 执行
												sshTransfer(
														cleanRemote: false,
														excludes: '',
														execCommand: 'cd /home/projects/izone_back_dev/cmd && \
														./stopall.sh && ./clean.sh && sh ./install.sh && cd /home/projects/izone_back_dev/cmd && ./startall.sh ',
														execTimeout: 600000,
														flatten: false,
														makeEmptyDirs: false,
														noDefaultExcludes: false,
														patternSeparator: '[, ]+',
														remoteDirectory: 'myproject/dockerdemo/builded',
														remoteDirectorySDF: false,
														removePrefix: '',
														sourceFiles: '**/target/output/resources/mapper/*.xml'
												)
                                            ],
                                            usePromotionTimestamp: false, 
                                            useWorkspaceInPromotion: false,
                                            verbose: false
                                        )
                                    ]
                                )
                        }
                    }
                }
            }
        } 
    }
}

五. 构建项目

image.png

image.png

image.png

image.png

image.png