Jenkins容器运行的命令
docker run -d -p 9200:8080 -p 9201:50000 -v /data1/jenkins_mount:/var/jenkins_home -v /usr/local/src/java/jdk1.8.0_331:/usr/local/src/jdk/jdk1.8 -v/usr/local/src/java/jdk-17.0.9:/usr/local/src/jdk/jdk17 -v /usr/local/src/maven/maven-3.9.5:/opt/maven/maven-3.9.5 -v /ssd_data1/maven-repository:/ssd_data1/maven-repository -v /usr/bin/git:/usr/local/git -v /var/run/docker.sock:/var/run/docker.sock -e TZ='Asia/Shanghai' --name jenkins jenkins/jenkins:2.427
## -d 指定以后台模式运行容器。
## -p 9200:8080 将宿主机的9200端口映射到容器的8080端口,这样可以通过访问宿主机的9200来访问Jenkins服务。
## -p 9201:50000 将宿主机的9201端口映射到容器的50000端口,这用于Jenkins代理节点的连接。
## -v /data1/jenkins_mount:/var/jenkins_home 将宿主机的 /data1/jenkins_mount目录挂载到容器的 /var/jenkins_home目录,这样可以持久化保存Jenkins的数据。
## -v /usr/local/src/java/jdk1.8.0_331:/usr/local/src/java/jdk1.8 将宿主机的JDK 1.8安装目录挂载到容器的 /usr/local/src/java/jdk1.8目录,这样Jenkins可以使用宿主机的JDK。
## -v /usr/local/src/java/jdk-17.0.9:/usr/local/src/jdk/jdk17 将宿主机的JDK 17安装目录挂载到容器的 /usr/local/src/jdk/jdk17目录,这样Jenkins可以使用宿主机的JDK。
## -v /usr/local/src/maven/maven-3.9.5:/opt/maven/maven-3.9.5 将宿主机的Maven安装目录挂载到容器的 /opt/maven/maven-3.9.5目录,这样Jenkins可以使用宿主机的Maven。
## -v /ssd_data1/maven-repository:/ssd_data1/maven-repository 将宿主机的Maven仓库目录挂载到容器的 /ssd_data1/maven-repository目录,这样Jenkins可以访问宿主机的Maven仓库。
## -v /usr/bin/git:/usr/local/git 将宿主机的Git目录挂载到容器的 /usr/local/git目录,这样Jenkins可以使用宿主机的Git。
## -v /var/run/docker.sock:/var/run/docker.sock 将宿主机的Docker守护进程Socket文件挂载到容器的 /var/run/docker.sock,这样Jenkins可以与宿主机上的Docker进行交互。
## -e TZ='Asia/Shanghai' 设置容器的时区为亚洲上海时区。
## --name jenkins 为容器指定一个名称为"jenkins"。
## jenkins/jenkins:2.427 在Docker Hub上拉取并运行使用Jenkins 2.427版本的Jenkins镜像。
-
Jenkins创建pipeline流水线
-
创建一个pipeline流水线任务
-
配置pipeline流水线
丢弃旧的构建
-
设置参数化构建
-
pipeline流水线代码的生成
-
git仓库代码获取
代码如下
checkout scmGit(branches: [[name: '${branch}']], extensions: [], userRemoteConfigs: [[credentialsId: '7800cad7-ea12-42f0-8b21-d122ca38daef', url: 'http://xxx.xxx.xxx.xxx/xxxx/daedalus_be.git']])
注:第一次构建的时候因为还未拉到git,所以需要先拉到master的分支,再次构建选择对应的分支再次把代码拉到本地,需要对应的pom文件才能进行下一步的maven编译过程
-
maven编译打包
sh 'mvn clean package -Dmaven.test.skip=true'
-
dockerfile的编写与生成对应的pipeline的脚本代码
代码如下
writeFile file: 'Dockerfile', text: '''
FROM xxx.xxx.xxx.xxx/xxxx/openjdk:17-jdk #harbor镜像仓库内的镜像
VOLUME /data1
ADD target/*.jar DaedalusBE.jar
EXPOSE 8081
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/DaedalusBE.jar"]'''
-
剩下的pipeline脚本代码同样使用sh:shell script
-
最终的代码经过修饰
import java.text.SimpleDateFormat # 引入时间变量
node {
def mvnHome
def timeStamp = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date())
def imageName = "xxx.xxx.xxx.xxx/xxxx/daedalus_be:dev-${timeStamp}"
stage('代码获取') {
checkout scmGit(branches: [[name: '${branch}']], extensions: [], userRemoteConfigs: [[credentialsId: '7800cad7-ea12-42f0-8b21-d122ca38daef', url: 'http://xxx.xxx.xxx.xxx/xxxx/daedalus_be.git']])
}
stage('项目构建') {
sh 'mvn clean package -Dmaven.test.skip=true'
}
stage('Initialize'){
def dockerHome = tool 'myDocker'
env.PATH = "${dockerHome}/bin:${env.PATH}"
}
stage('镜像构建') {
// 将Dockerfile内容写入文件
writeFile file: 'Dockerfile', text: '''
FROM xxx.xxx.xxx.xxx/xxxx/openjdk:17-jdk
VOLUME /data1
ADD target/*.jar DaedalusBE.jar
EXPOSE 8081
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/DaedalusBE.jar"]
'''
// 使用Docker构建镜像
sh "docker build -t ${imageName} ."
}
stage('镜像上传') {
// 上传镜像到Registry
sh "docker login -u admin -p 123456 xxx.xxx.xxx.xxx:xxxx"
sh "docker push ${imageName}"
}
stage('项目部署') {
// 删除之前的容器以避免冲突
sh "docker rm -f daedalus_be || true"
// 启动新的容器
sh "docker run -d --name daedalus_be -p 8081:8081 -e TZ='Asia/Shanghai' ${imageName}"
// 替换以下内容为实际的项目部署命令,使用imageName变量来指定镜像
// sh "kubectl apply -f deployment.yaml --image=${imageName}"
}
}
-
以下是Jenkins配置过程中出现的坑或错误
-
在maven过程中报错,找不到对应的maven仓库
这是由于Jenkins的容器部署的,未映射maven的仓库到Jenkins容器内,Jenkins容器重新使用新的命令启动,添加标记的内容
-
使用docker命令构建,未找到docker
这是Jenkins使用docker命令,权限被拒接了,正常方案是将jenkins用户,加到docker用户组,但是我发现当前用户有使用docker的权限,直接偷懒的方法,777权限
[sq-machine-001@sqmachine001 ~] $ groups
sq-machine-001 adm cdrom sudo dip plugdev lpadmin sambashare docker
# 偷懒的方法
[sq-machine-001@sqmachine001 ~] $ cd /var/run
[sq-machine-001@sqmachine001 /var/run] $ sudo chmod 777 docker.sock
如果还是报错未找到docker的话,进行下一步
在pipeline流水线脚本中,使用docker命令步骤前面添加以下的命令
stage('Initialize'){
def dockerHome = tool 'myDocker'
env.PATH = "${dockerHome}/bin:${env.PATH}"
}
-
镜像仓库没有jdk17的镜像文件
方法:docker下载jdk17的镜像,并放到harbor仓库下面
# 在终端或命令行工具中运行以下命令,下载 openjdk:17-jdk镜像:
docker pull openjdk:17-jdk
# 确认镜像下载成功后,使用以下命令将该镜像重新标记为目标仓库地址:
docker tag openjdk:17-jdk xxx.xxx.xxx.xxx/openjdk:17-jdk
# 这将为镜像添加一个新的标签,并将其指向目标仓库地址。
# 最后,使用以下命令将标记后的镜像推送到您的私有镜像仓库:
docker push xxx.xxx.xxx.xxx/openjdk:17-jdk
-
dockerfile使用COPY的参数构建镜像,导致容器部署不起来,报错未找到对应的jar包
发现镜像文件内,对应的jar包被打包在一个tar包里面了,原因大概是引用了一个类,具体原因未知,修改COPY为ADD后就可以了
# 修改前的dockerfile
writeFile file:'Dockerfile'text:
FROM xxx.xxx.xxx.xxx/xxxx/openjdk:17-jdk
VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE] DaedalusBE.jar
EXPOSE 8081
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/DaedalusBE.jan"]
# 修改后的dockerfile
writeFile file: 'Dockerfile', text: '''
FROM xxx.xxx.xxx.xxx/xxxx/openjdk:17-jdk
VOLUME /data1
ADD target/*.jar DaedalusBE.jar
EXPOSE 8081
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/DaedalusBE.jar"]
新建Jenkins任务,构建并试运行:
1.准备工作,新建tomcat8:base镜像作为后台应用运行的基础镜像:(本镜像为war包,暂时没有用到)
FROM centos6-base
LABEL maintainer="drowsc@gmail.com"
# 调整容器内时区为上海时区
RUN echo "Asia/Shanghai" > /etc/timezone
# 安装JDK环境,设置其环境变量
ADD jdk1.8.0_162 /usr/local/java
ENV JAVA_HOME /usr/local/java
ENV JAVA_BIN $JAVA_HOME/bin
ENV JRE_HOME $JAVA_HOME/jre
ENV PATH $PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
# 添加tomcat到容器内
ADD apache-tomcat-8.5.28 /usr/local/tomcat8
# 开放tomcat的web服务默认访问端口8080
EXPOSE 8080
# 容器启动时执行启动tomcat服务
ENTRYPOINT ["/usr/local/tomcat8/bin/catalina.sh","run"]