Jenkins创建pipeline任务自动化构建

291 阅读4分钟

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镜像。

  1. Jenkins创建pipeline流水线

  1. 创建一个pipeline流水线任务

  1. 配置pipeline流水线

丢弃旧的构建

  1. 设置参数化构建

  1. pipeline流水线代码的生成

image.png

  1. git仓库代码获取

image.png

image.png

代码如下

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编译过程

  1. maven编译打包

sh 'mvn clean package -Dmaven.test.skip=true'
  1. dockerfile的编写与生成对应的pipeline的脚本代码

image.png

image.png

代码如下

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"]'''
  1. 剩下的pipeline脚本代码同样使用sh:shell script

  1. 最终的代码经过修饰

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}"
    }
}
  1. 以下是Jenkins配置过程中出现的坑或错误

  1. 在maven过程中报错,找不到对应的maven仓库

这是由于Jenkins的容器部署的,未映射maven的仓库到Jenkins容器内,Jenkins容器重新使用新的命令启动,添加标记的内容

  1. 使用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

image.png

如果还是报错未找到docker的话,进行下一步

在pipeline流水线脚本中,使用docker命令步骤前面添加以下的命令

stage('Initialize'){
        def dockerHome = tool 'myDocker'
        env.PATH = "${dockerHome}/bin:${env.PATH}"
    }
  1. 镜像仓库没有jdk17的镜像文件

image.png

方法: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
  1. 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"]