Jenkins流水线脚本与cat > file <<EOF结合使用案例

本文介绍了一种使用Jenkins进行自动化部署的方法。通过定义多阶段的Jenkins Pipeline,包括代码检出、构建打包及部署等步骤,实现了不同环境的选择性部署。此外,还介绍了如何利用Ansible进行文件服务器上的目录创建及文件传输。

pipeline {
    agent any
    tools { 
        maven "maven-3.8.1"
    }
    parameters {
        choice(
            choices: 'test\nsit\nglzn\nshenyang\nprod',
            description: 'choose deploy environment',
            name: 'profile_active'
            )
        choice(
            choices: '*/master\n*/develop',
            description: 'choose project branch',
            name: 'proj_branch'
            )            
        string (name: 'version', defaultValue: '1.0.0', description: 'build version')
        choice(
            choices: '192.168.181.83\n192.168.186.6\n192.168.180.218\n192.168.181.52',
            description: 'choose file server',
            name: 'file_server_ip'
            )
    }    
    environment {
        image_path = "/data/glzn"
        image_tag = "${profile_active}${version}-"
        file_path = "/data/app/files/iot-core/${image_tag}" 
        image_repo = "192.168.180.204:19080/iot" 
        os_type = "x86" 
        proj_repo = "http://192.168.180.148/rdc/rule-engine.git"
        credentials_id = "366f3dc5-074e-4338-8a96-32db1990b9fbx"
    }
    
    stages {
        stage('Check out') {
            steps {
                checkout([$class: 'GitSCM', branches: [[name: "${proj_branch}"]],
                extensions: [],
                userRemoteConfigs: [[credentialsId: "${credentials_id}", url: "${proj_repo}"]]])
            }
        }
        
        stage('Deploy Proj') {
            steps {
                sh '''
                    app_name=rule-engine-app
                    mvn clean package -P ${profile_active} -Dmaven.test.skip=true
                    mv -f application/target/$app_name.jar ${image_path}/$app_name/app.jar
                    
                    cd ${image_path}/$app_name
                    cat > Dockerfile <<-EOF
                    FROM 192.168.200.17/software/jre11:openjdk11
                    LABEL maintainer Ron
                    VOLUME /tmp
                    RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
                    COPY app.jar /
                    ENV JAVA_OPTS="-Dname=rule-engine-app -Duser.timezone=GMT+08 -Dfile.encoding=UTF8 -Dfastjson.parser.safeMode=true"
                    ENTRYPOINT exec java $JAVA_OPTS ${JVM:=-Xms512m -Xmx2048m} -jar /app.jar
EOF
                    date=`date +'%Y%m%d'`
                    image_name=${image_repo}/$app_name/${os_type}:${image_tag}$date
                    docker build -t $image_name . && docker images
                    docker push $image_name
                    docker save -o $app_name.tar $image_name
                    tar -zcvf $app_name.tar.gz $app_name.tar
                    rm -rf $app_name.tar && docker rmi $image_name

                    ansible $file_server_ip -m shell -a "mkdir -p ${file_path}$date"
                    ansible $file_server_ip -m copy -a "src=$app_name.tar.gz dest=${file_path}$date/$app_name.tar.gz"                             
                    ansible $file_server_ip -m shell -a "echo $image_name > ${file_path}$date/$app_name.txt"
                    '''
            }
        }
        
    }
}
 

stage('Create Dockerfile and Build Image') { steps { script { // Step 1: 动态生成 Dockerfile def jarFile = findFiles(includes: '**/*.jar')[0]?.name ?: '' def baseName = jarFile.tokenize('/').last() sh """ cd ${MODULE_PATH}/target cat > public.txt << 'EOF' MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCRLPf/x5SyDZrWcuH4S5fpuRk3c/zSLinWHbeTCpxjJcWVLYSopkE38rlQFXz2oqqMbwQGaHt6QlIfdHdcR1nGq19slpE6yw1aoIhN1p0Ezxg3TPSwaYqfYIag5MLaZprxpw/KcxDbIoPuznjlXjxNu/nj+OIBdMQLg6rzKMyb2QIDAQAB EOF cat > Dockerfile << 'EOF' FROM registry.cn-qingdao.aliyuncs.com/labor/jdk1:latest RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \\ echo "Asia/Shanghai" > /etc/timezone ENV LC_ALL zh_CN.UTF-8 ADD ${baseName}.*.jar /tmp/ ADD ./public.txt /tmp/ WORKDIR /tmp/ ENTRYPOINT java -Dconfig.public.location=/tmp/public.txt -Xmx2g -Xms1g -Xss1m \\ -Dlog4j2.formatMsgNoLookups=true \\ -Ddubbo.network.interface.preferred=enp0s18 \\ -jar ${baseName} --apollo.meta=http://192.168.51.235:9180 EOF """ // Step 2: 构建镜像标签 def timestamp = new Date().format('yyyyMMddHHmm', TimeZone.getTimeZone('Asia/Shanghai')) def imageTag = "${env.IMAGE_PRE_NAME}/${env.MODULE_NAME}:${timestamp}" def fullImageNameWithTimestamp = "${env.DOCKER_IMAGE_REGISTRY}/${imageTag}" // Step 3: 构建并推送镜像 echo "Building Docker image: ${fullImageNameWithTimestamp}" sh "docker build -t ${fullImageNameWithTimestamp} ${MODULE_PATH}" // 登录并推送(假设已有凭证 ID) //withCredentials([usernamePassword( //credentialsId: 'docker-cred', // 替换为你真实的 Docker 凭证 ID //usernameVariable: 'REG_USER', //passwordVariable: 'REG_PASS' //)]) { //sh """ //docker login --username \${REG_USER} --password \${REG_PASS} ${env.DOCKER_IMAGE_REGISTRY} // docker push ${fullImageNameWithTimestamp} // docker rmi ${fullImageNameWithTimestamp} //""" //} // 保存镜像名供后续使用 env.BUILT_IMAGE = fullImageNameWithTimestamp echo "✅ 成功构建并推送镜像: ${fullImageNameWithTimestamp}" } } } 有问题吗
最新发布
12-11
Jenkins 流水线以代码方式定义软件开发过程中的构建、测试和部署流程,以下是构建、测试和生成报告的相关实现方法及知识: ### 构建 在 Jenkins 流水线中,构建通常依赖于项目的具体技术栈和构建工具。以常见的 Maven 项目为例,以下是一个简单的流水线脚本示例: ```groovy pipeline { agent any stages { stage('Build') { steps { // 执行 Maven 构建命令 sh 'mvn clean package' } } } } ``` 这段代码定义了一个 Jenkins 流水线,在 `Build` 阶段使用 `sh` 步骤执行 `mvn clean package` 命令来完成项目的构建,清除旧的构建产物并打包新的代码。 ### 测试 对于测试,同的项目会有同的测试框架。同样以 Maven 项目使用 JUnit 进行单元测试为例: ```groovy pipeline { agent any stages { stage('Test') { steps { // 执行 Maven 测试命令 sh 'mvn test' } post { always { // 收集测试结果 junit 'target/surefire-reports/*.xml' } } } } } ``` 在 `Test` 阶段,使用 `sh` 步骤执行 `mvn test` 命令来运行测试。`post` 部分的 `always` 块表示无论测试结果如何,都会执行 `junit` 步骤来收集测试报告,`target/surefire-reports/*.xml` 是 JUnit 测试报告的路径。 ### 生成报告 生成报告可以结合同的工具和插件。除了上述 JUnit 测试报告收集,还可以使用 Cobertura 进行代码覆盖率报告的生成。假设项目使用 Cobertura 进行代码覆盖率测试: ```groovy pipeline { agent any stages { stage('Coverage') { steps { // 执行 Maven 测试并生成覆盖率报告 sh 'mvn cobertura:cobertura' } post { always { // 发布 Cobertura 覆盖率报告 cobertura coberturaReportFile: 'target/site/cobertura/coverage.xml' } } } } } ``` 在 `Coverage` 阶段,使用 `sh` 步骤执行 `mvn cobertura:cobertura` 命令生成代码覆盖率报告。`post` 部分的 `always` 块使用 `cobertura` 步骤发布覆盖率报告,`target/site/cobertura/coverage.xml` 是 Cobertura 覆盖率报告的路径。 ### 相关工具和插件 - **JUnit 插件**:用于收集和展示 JUnit 测试报告,方便查看测试结果。 - **Cobertura 插件**:支持代码覆盖率报告的生成和展示,帮助开发者了解代码的测试覆盖情况。 - **HTML Publisher 插件**:如果项目生成的是 HTML 格式的报告,可以使用该插件将 HTML 报告展示在 Jenkins 中。 通过以上方法和工具,可以在 Jenkins 流水线中实现构建、测试和生成报告的功能,确保项目的质量和稳定性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI知识研学圈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值