随着项目升级,目前存在一些项目是jdk8的一些是jdk17的,让Jenkins 使用主机编译环境成为了问题。故此使用docker环境来编译项目,分离各个版本编译环境。
以下以openjdk 17 为例,编译一个openjdk17 +maven 3.9.x的环境。
首先下载maven包 Maven – Download Apache Maven
下载完成后使用压缩软件打开压缩包(注意打开不是解压)
将apache-maven-3.9.9-bin.tar.gz\apache-maven-3.9.9-bin.tar\apache-maven-3.9.9\conf\
目录下的setting.xml
文件拖出来修改镜像和包的存放地址
修改完毕后将setting.xml
文件替换到压缩包里面
FROM swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/openjdk:17
MAINTAINER xqlee
#FROM openjdk:17
ADD apache-maven-3.9.9-bin.tar.gz /usr/local
#env config
#openjdk:17 default JAVA_HOME -> /usr/java/openjdk-17/
ENV CLASSPATH=.:$JAVA_HOME/lib/jrt-fs.jar
ENV MAVEN_HOME=/usr/local/apache-maven-3.9.9
ENV PATH=$PATH:$MAVEN_HOME/bin
命令简介
FROM
基于那个镜像MAINTAINER
当前描述ADD
添加文件到镜像(tar.gz的压缩文件会自动解压)ENV
设置环境变量
将Dockerfile 和 apache-maven-3.9.9-bin.tar.gz
上传到Linux服务器同一个目录,然后执行下面的命令构建镜像
sudo docker build -t openjdk:17-maven3.9 ./
编译命令:
sudo docker run -it --rm --name javac17 -v ~/.m2:/opt/.m2 -v /your/path/app-source:/opt/project -w /opt/project openjdk:17-maven3.9 mvn clean package -Dmaven.test.skip=true
命令简介
run
- 运行一个容器-it
执行容器命令--rm
容器结束后删除--name
指定容器名称(同一个Jenkins编译多个项目建议这里设置为项目名称防止多个项目并发构建失败)-v
主机目录:容器目录 目录挂载-w
设置工作目录(执行命令的工作目录)这里很重要不然执行maven命令找不到项目的pom.xmlopenjdk:17-maven3.9
容器使用的镜像名称mvn clean package -Dmaven.test.skip=true
编译项目命令提示:把maven的本地仓库挂载出来是为了不用每次都下载包。
以上完成了JDK17版本的编译环境,同样的操作可以在同一个服务器上构建多次,多个版本J8 J17 J22 均可
重要提示:
在Jenkins 或者定时任务中执行上面编译命令时候需要去掉 -it 指令,否则会报错
the input device is not a TTY
linux执行定时任务的时候没有终端设备,TTY一词源于Teletypes,或teletypewriters。其实出现该错误和我们的一个习惯有关,一般来说我们启动容器后要与容器进行交互操作,这是,就要加上"-it"这个参数,而在定时任务中,如果让脚本在后台运行,就没有可交互的终端,这就会引发如题所示错误,解决办法就是去掉“-it”这个参数。
https://www.leftso.com/article/2408211015018952.html