• Jenkins流水线极速打包


    在使用Jenkins流水线进行打包时,发现直接使用Dockerfile去构建一个java或者go程序会非常慢,go好一点也要一分钟,java则需要3分钟以上。go极速打包设置见:这里

    dockerfile如下:

    FROM gradle:6-jdk8 AS build
    COPY --chown=gradle:gradle . /home/gradle/src
    WORKDIR /home/gradle/src
    RUN gradle build --no-daemon
    
    FROM openjdk:8-jre-slim
    EXPOSE 10087
    RUN mkdir /app
    COPY --from=build /home/gradle/src/build/libs/*.jar /app/test.jar
    ENTRYPOINT ["java", "-jar","/app/test.jar"]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在上述步骤中,第一步是构建一个gradle环境,然后再构建一个java环境。在java环境中使用gradle环境中的打包。在使用镜像gradle进行打包时,发现特别慢。这很大一部分原因是由于我们每次都是临时构建一个gradle环境,其中的依赖下载都是重复工作,当程序有一个很小的改动时,它同样会从0下载一次,就造成了很长的构建耗时。

    怎么样提升速度呢?

    在上述构建中,最慢的步骤是gradle的build,如果选择选用服务器安装gradle进行打包,再将打好的jar包直接构建成docker镜像,一定会快很多。
    那就开始做吧,原先在Jenkinsfile中,只需要build镜像一步就够了。现在需要先clone代码,然后gradle打包,最后将打好的包打入镜像。

    费了九牛二虎之力,终于,我做到了。

    node  {
        def appimage
        def registry = ''
        def registryCredential = 'aliyun-docker-image-repository'
        def path
        env.JAVA_HOME="${tool 'java8'}"
    
        stage("Checkout"){
            checkout([$class: 'GitSCM', 
                branches: [[name: '*/'+env.BRANCH_NAME]], 
                extensions: [[$class: 'SubmoduleOption', disableSubmodules: false, parentCredentials: false, recursiveSubmodules: true, reference: '', trackingSubmodules: false]], 
                userRemoteConfigs: [[credentialsId: '', url: '']]])
        }
      	// 拉代码 
        stage('Source') {
              git branch: 'master', credentialsId: '', url: ''
        }
      	// 打包
        stage('Gradle') {
                sh "sudo chmod -R 777 ${env.WORKSPACE}"
                sh "${tool 'gradle-6.5.1'}/bin/gradle clean build"
        }
    		// 构建镜像
        stage('Build') {
            appimage = docker.build registry + ":" + env.BRANCH_NAME + "-$BUILD_NUMBER"
        }
       
        stage('Publish') {
            
        }
    
        stage('Deploy') {
            
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    在这次尝试中,我遇到了几个问题:

    1. 找不到java环境
    2. 找不到gradle环境
    3. 权限不够

    这些问题是使用Jenkinsfile常见的问题,其中,java环境和gradle环境需要在jenkins中安装好(见Jenkins系统配置),然后在Jenkinsfile中进行声明:

    env.JAVA_HOME="${tool 'java8'}"
    或者像这样直接使用
    sh "${tool 'gradle-6.5.1'}/bin/gradle clean build"
    
    • 1
    • 2
    • 3

    需要注意的是,以上的“java8”和“gradle-6.5.1”都是在Jenkins中进行安装时,起的名字,指向的是具体的插件,而不是这里填什么Jenkins下载什么。

    另外权限不够的问题,我在上面的Jenkinsfile中也有解决,如:sh “sudo chmod -R 777 ${env.WORKSPACE}”

    这里将整个工作目录的权限都放开了,让脚本可以顺畅执行。具体的权限可以自行摸索,777是偷懒的做法。

  • 相关阅读:
    java Spring Boot 将日志写入文件中记录
    基于x86 平台移植opencv4.7.0
    Linux 5.19内核终于接纳了Zstd压缩固件更新
    Android shell 常用 debug 命令
    React 使用echarts绘制个性滚动柱状图
    Apache Dubbo 云原生可观测性的探索与实践
    【C语言】详解 malloc 、calloc函数的区别
    Day3--流媒体缓存、消息缓存(重要)、直接任务通知
    深入理解Java虚拟机读书笔记--5垃圾收集器
    5、WebApi 在腾讯云服务器中部署初试
  • 原文地址:https://blog.csdn.net/w_monster/article/details/126751571