在使用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"]
在上述步骤中,第一步是构建一个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') {
}
}
在这次尝试中,我遇到了几个问题:
- 找不到java环境
- 找不到gradle环境
- 权限不够
这些问题是使用Jenkinsfile常见的问题,其中,java环境和gradle环境需要在jenkins中安装好(见Jenkins系统配置),然后在Jenkinsfile中进行声明:
env.JAVA_HOME="${tool 'java8'}"
或者像这样直接使用
sh "${tool 'gradle-6.5.1'}/bin/gradle clean build"
需要注意的是,以上的“java8”和“gradle-6.5.1”都是在Jenkins中进行安装时,起的名字,指向的是具体的插件,而不是这里填什么Jenkins下载什么。
另外权限不够的问题,我在上面的Jenkinsfile中也有解决,如:sh “sudo chmod -R 777 ${env.WORKSPACE}”
这里将整个工作目录的权限都放开了,让脚本可以顺畅执行。具体的权限可以自行摸索,777是偷懒的做法。