jenkins pipeline打包流程

打印 上一主题 下一主题

主题 836|帖子 836|积分 2508

Jenkins Pipeline 是 Jenkins 提供的一种用于持续集成和持续交付(CI/CD)的脚本化流程工具。它允许你通过编写一个 Jenkinsfile 文件来定义整个构建、测试和部署的流程。本文先容打包springcloud项目,react项目为docker镜像
  
  
1.项目结构

  1. ├─Jenkinsfile    jenkinsfile打包脚本文件            
  2. ├─lhm-emp        微服务模块 emp服务
  3. ├─lhm-eureka     微服务模块 eureka服务
  4. ├─lhm-gateway    微服务模块 gateway服务
  5. ├─lhm-order      微服务模块 order服务
  6. └─lhm-web        前端服务
复制代码
项目地址 https://gitee.com/liuhaomin/springcloud
测试哀求
  1. ## eureka
  2. http://localhost:8100
  3. ## order
  4. http://localhost:9000/api/order/info
  5. ## emp
  6. http://localhost:9000/api/emp/info
  7. ## web
  8. http://localhost:3000
复制代码
2.项目打包改造

根pom.xml
  1. <build>
  2.         <finalName>${project.artifactId}</finalName>
  3.         <pluginManagement>
  4.             <plugins>
  5.                 <plugin>
  6.                     <groupId>org.springframework.boot</groupId>
  7.                     <artifactId>spring-boot-maven-plugin</artifactId>
  8.                     <version>${spring-boot.version}</version>
  9.                 </plugin>
  10.                 <plugin>
  11.                     <groupId>com.spotify</groupId>
  12.                     <artifactId>dockerfile-maven-plugin</artifactId>
  13.                     <version>${docker.plugin.version}</version>
  14.                     <configuration>
  15.                         <username>${docker.username}</username>
  16.                         <password>${docker.password}</password>
  17.                         <repository>${docker.registry.url}/${docker.namespace}/${project.artifactId}</repository>
  18.                         <!--<tag>${os_tag}-${project.version}</tag>-->
  19.                         <tag>${os_tag}${project.version}</tag>
  20.                         <useMavenSettingsForAuth>true</useMavenSettingsForAuth>
  21.                         <buildArgs>
  22.                             <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
  23.                         </buildArgs>
  24.                         <skip>${dockerfile.skip}</skip>
  25.                     </configuration>
  26.                 </plugin>
  27.             </plugins>
  28.         </pluginManagement>
  29.     </build>
复制代码
2.1. lhm-emp 模块pom.xml

lhm-gateway,lhm-eureka,lhm-order 类似
  1.   <build>
  2.         <finalName>${project.artifactId}</finalName>
  3.         <plugins>
  4.             <plugin>
  5.                 <groupId>org.springframework.boot</groupId>
  6.                 <artifactId>spring-boot-maven-plugin</artifactId>
  7.                 <configuration>
  8.                     <mainClass>${emp.main.class}</mainClass>
  9.                     <layout>ZIP</layout>
  10.                 </configuration>
  11.                 <executions>
  12.                     <execution>
  13.                         <goals>
  14.                             <goal>repackage</goal>
  15.                         </goals>
  16.                     </execution>
  17.                 </executions>
  18.             </plugin>
  19.             <plugin>
  20.                 <groupId>com.spotify</groupId>
  21.                 <artifactId>dockerfile-maven-plugin</artifactId>
  22.                 <configuration>
  23.                     <username>${docker.username}</username>
  24.                     <password>${docker.password}</password>
  25.                     <repository>${docker.registry.url}/${docker.namespace}/${project.artifactId}</repository>
  26.                     <tag>${os_tag}${lhm.project.version}</tag>
  27.                     <useMavenSettingsForAuth>true</useMavenSettingsForAuth>
  28.                     <buildArgs>
  29.                         <OS_ARCH>${os_arch}</OS_ARCH>
  30.                         <CACHEFROM>${last_version}</CACHEFROM>
  31.                         <TARGETPLATFORM>${os_arch.dockerimage}</TARGETPLATFORM>
  32.                         <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
  33.                         <EXPOSE_PORT>${emp.port}</EXPOSE_PORT>
  34.                         <MAINCLASS>${emp.main.class}</MAINCLASS>
  35.                     </buildArgs>
  36.                     <skip>${dockerfile.skip}</skip>
  37.                 </configuration>
  38.                 <executions>
  39.                     <execution>
  40.                         <id>default</id>
  41.                         <phase>package</phase>
  42.                         <goals>
  43.                             <goal>build</goal>
  44.                             <goal>push</goal>
  45.                         </goals>
  46.                     </execution>
  47.                 </executions>
  48.             </plugin>
  49.         </plugins>
  50.     </build>
复制代码
2.2. lhm-emp 模块Dockerfile

lhm-gateway,lhm-eureka,lhm-order 类似
  1. ARG TARGETPLATFORM
  2. ARG OS_ARCH
  3. # 指定基础镜像,这是分阶段构建的前期阶段
  4. FROM 192.168.56.10/lhm/openjdk:8-jdk-alpine as builder
  5. # 执行工作目录
  6. WORKDIR target
  7. # 配置参数
  8. ARG JAR_FILE=target/*.jar
  9. # 将编译构建得到的jar文件复制到镜像空间中
  10. COPY ${JAR_FILE} application.jar
  11. RUN unzip application.jar
  12. FROM --platform=$OS_ARCH $TARGETPLATFORM
  13. ARG EXPOSE_PORT
  14. ARG JAR_FILE
  15. ARG MAINCLASS
  16. ARG DEPENDENCY=target
  17. COPY --from=builder ${DEPENDENCY}/META-INF /app/META-INF
  18. COPY --from=builder ${DEPENDENCY}/BOOT-INF/lib /app/lib
  19. COPY --from=builder ${DEPENDENCY}/BOOT-INF/classes /app
  20. EXPOSE ${EXPOSE_PORT}
  21. ARG CACHEFROM
  22. LABEL description=" cache from ${CACHEFROM}"
  23. ENV JAVA_OPTS ""
  24. ENV AGENT_AFTER_JAR ""
  25. ENV MAINCLASS ${MAINCLASS}
  26. CMD java ${JAVA_OPTS} -Dspring.profiles.active=docker -Dservice_name=${MAINCLASS} -verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:/opt/logs/jvm/gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/logs/jvm/dump.hprof -Djava.security.egd=file:/dev/./urandom -Denv=dev -Duser.timezone=GMT+08 ${AGENT_AFTER_JAR}  -cp app:app/lib2/*:app/lib/*  ${MAINCLASS}
复制代码
2.3. lhm-web模块Dockerfile

  1. ARG TARGETPLATFORM
  2. ARG OS_ARCH
  3. FROM --platform=$OS_ARCH $TARGETPLATFORM
  4. ENV HTML_PATH=/usr/share/nginx/html
  5. WORKDIR $HTML_PATH
  6. COPY ./build $HTML_PATH
  7. EXPOSE 80
  8. CMD ["nginx", "-g", "daemon off;"]
复制代码
3. Jenkins docker pipeline编写

3.1.GIT_CREDENTIALS_ID: git 认证参数

your-credentials-id



3.2.pipeline编写

  1. pipeline {
  2.     agent any
  3.         options {
  4.       // 最长保留90天,最多保留3个构建
  5.           buildDiscarder logRotator(artifactDaysToKeepStr: '', artifactNumToKeepStr: '', daysToKeepStr: '90', numToKeepStr: '3')
  6.         }
  7.         environment{
  8.            GIT_CREDENTIALS_ID="fd76875f-1862-43d4-adf4-6462e3b3c7f4"
  9.            SERVER_GIT_URL="https://gitee.com/liuhaomin/springcloud.git"
  10.            WEB_GIT_URL="https://gitee.com/liuhaomin/springcloud.git"
  11.            HARBOR_URL="192.168.56.10"
  12.            HARBOR_USERNAME="admin"
  13.            HARBOR_PASSWORD="Harbor12345"
  14.            // 192.168.56.10/lhm/lhm-web
  15.            HARBOR_NAMESPACE="lhm"
  16.            JAVACOMPILEIMAGE="192.168.56.10/lhm/openjdk:8-jdk-alpine"
  17.        JAVA_OS_ARCH_DOCKERIMAGE="192.168.56.10/lhm/adoptopenjdk/openjdk8-openj9:alpine-slim"
  18.            NGINX_OS_ARCH_DOCKERIMAGE="192.168.56.10/lhm/nginx:1.26.1-alpine"
  19.        OS_ARCH="linux/amd64"
  20.        OS_TAG="x86"
  21.         }
  22.     parameters {
  23.         gitParameter(name: 'SERVER_BRANCH_NAME',type: 'branch', branchFilter: "origin/(.*)",defaultValue: 'master',selectedValue: "DEFAULT",useRepository: '${env.SERVER_GIT_URL}',description: '后端服务选择分支版本')
  24.         gitParameter(name: 'WEB_BRANCH_NAME',type: 'branch', branchFilter: "origin/(.*)",defaultValue: 'master',selectedValue: "DEFAULT",useRepository: '${env.WEB_GIT_URL}',description: 'WEB服务选择分支版本')
  25.                 string(defaultValue: '1.0.1', description: '版本号', name: 'VERSION', trim: true)
  26.             booleanParam(defaultValue: false, description: '是否跳过构建', name: 'SKIP_BUILD')
  27.         extendedChoice(description: '选择需要打包的服务模块(多选)', multiSelectDelimiter: ',', name: 'SERVICES', quoteValue: false, saveJSONParameterToFile: false,type: 'PT_CHECKBOX', value: 'lhm-eureka,lhm-gateway,lhm-emp,lhm-order,web-lhm-web',defaultValue: '',visibleItemCount: 5)
  28.     }
  29.     stages {
  30.                 stage('SERVER拉取代码') {
  31.                         when {
  32.                                 expression {
  33.                                         if (Boolean.valueOf("${SKIP_BUILD}")){
  34.                                                 echo "跳过SERVER拉取代码,直接打包镜像文件"
  35.                                                 return !Boolean.valueOf("${SKIP_BUILD}")
  36.                                         }
  37.                                         def services = "${SERVICES}"
  38.                                         def index = services.indexOf('web-')
  39.                         if (index > 0) {
  40.                             services = services.substring(0, index - 1)
  41.                         }
  42.                     if( services.size() > 0 && index != 0) {
  43.                                             echo "包含服务,SERVER拉取代码"
  44.                                                 return true
  45.                                         }
  46.                                         echo "没有包含SERVER 跳过SERVER拉取代码"
  47.                                         return false
  48.                                 }
  49.                         }
  50.                         steps {
  51.                             script {
  52.                                         deleteDir()
  53.                                         sh "ls"
  54.                                         echo "SERVER检出代码..."
  55.                                         def scmVars = checkout([
  56.                                                 $class:"GitSCM",
  57.                                                 branches:[[name:"${SERVER_BRANCH_NAME}"]],
  58.                                                 doGenerateSubmoduleConfigurations: false,
  59.                                                 gitTool: "Default",
  60.                                                 submoduleCfg: [],
  61.                                                 userRemoteConfigs:[[credentialsId:"${env.GIT_CREDENTIALS_ID}",url:"${env.SERVER_GIT_URL}"]]
  62.                                            ]
  63.                                    )
  64.                                    sh "echo '${scmVars}'"
  65.                                    sh "ls"
  66.                            }
  67.                         }
  68.                 }
  69.                 stage('SERVER构建打包') {
  70.                         agent {
  71.                 docker{
  72.                                         image 'maven:3.8-adoptopenjdk-8-openj9'
  73.                                         reuseNode true
  74.                                         args  '-v /root/.docker/config.json:/root/.docker/config.json -v /home/jenkins/repository:/root/.m2 -v /var/run/docker.sock:/var/run/docker.sock'
  75.                                 }
  76.                         }
  77.                         when {
  78.                                 expression {
  79.                                         if (Boolean.valueOf("${SKIP_BUILD}")){
  80.                                                 echo "跳过SERVER构建打包,直接打包镜像文件"
  81.                                                 return !Boolean.valueOf("${SKIP_BUILD}")
  82.                                         }
  83.                                         def services = "${SERVICES}"
  84.                                         def index = services.indexOf('web-')
  85.                         if (index > 0) {
  86.                             services = services.substring(0, index - 1)
  87.                         }
  88.                     if( services.size() > 0 && index != 0) {
  89.                                             echo "包含服务,SERVER构建打包"
  90.                                                 return true
  91.                                         }
  92.                                         echo "没有包含SERVER 跳过SERVER构建打包"
  93.                                         return false
  94.                                 }
  95.                         }
  96.                         steps {
  97.                                 script {
  98.                                         def moduleListStr = "${SERVICES}"
  99.                                         echo "$moduleListStr"
  100.                                         def index = moduleListStr.indexOf('web-')
  101.                                         if (index > 0) {
  102.                                                 moduleListStr = moduleListStr.substring(0, index - 1)
  103.                                         }
  104.                                         def moduleList = moduleListStr.split(',')
  105.                                         def count = moduleList.size()
  106.                                         if (count <= 0) {
  107.                                                 echo "请选择构建模块..."
  108.                                                 sh 'exit 1'
  109.                                         }
  110.                                         def JAVACOMPILEIMAGE="${env.JAVACOMPILEIMAGE}"
  111.                                         def JAVA_OS_ARCH_DOCKERIMAGE="${env.JAVA_OS_ARCH_DOCKERIMAGE}"
  112.                                         def OS_ARCH="${env.OS_ARCH}"
  113.                     def OS_TAG="${env.OS_TAG}"
  114.                                         if("${OS_TAG}"=="x86"){
  115.                         OS_TAG=""
  116.                     }
  117.                                         def moduleStr = moduleList.join(",:")
  118.                                         echo "打包构建Version: ${VERSION}"
  119.                                         sh "mvn -T 1C -pl :${moduleStr} -am clean package -Dmaven.test.skip=true -Ddockerfile.skip=false -Dlhm.project.version=${VERSION} -Dos_arch=${OS_ARCH} -Dos_tag=${OS_TAG} -Dos_arch.dockerimage=${JAVA_OS_ARCH_DOCKERIMAGE} -Djava.compileimage=${JAVACOMPILEIMAGE}"
  120.                                         for (int i = 0; i < count; ++i) {
  121.                                                 def serviceName = "${moduleList[i]}"
  122.                                                 sh "docker tag ${env.HARBOR_URL}/${env.HARBOR_NAMESPACE}/${serviceName}:${OS_TAG}${VERSION} ${env.HARBOR_NAMESPACE}/${serviceName}:${OS_TAG}${VERSION}"
  123.                                         }
  124.                 }
  125.             }
  126.         }
  127.                 stage('WEB拉取代码') {
  128.                         when {
  129.                                 expression {
  130.                                         if (Boolean.valueOf("${SKIP_BUILD}")){
  131.                                                 echo "跳过WEB拉取代码,直接打包镜像文件"
  132.                                                 return !Boolean.valueOf("${SKIP_BUILD}")
  133.                                         }
  134.                                         def services = "${SERVICES}"
  135.                                         def index = services.indexOf('web-lhm-web')
  136.                     if (index != -1 ) {
  137.                                             echo "包含web-lhm-web 打包WEB镜像"
  138.                                                 return true
  139.                                         }
  140.                                         echo "没有包含web-lhm-web 跳过WEB拉取代码"
  141.                                         return false
  142.                                 }
  143.                         }
  144.                         steps {
  145.                             script {
  146.                                         deleteDir()
  147.                                         sh "ls"
  148.                                         echo "WEB检出代码..."
  149.                                         def scmVars = checkout([
  150.                                                 $class:"GitSCM",
  151.                                                 branches:[[name:"${WEB_BRANCH_NAME}"]],
  152.                                                 doGenerateSubmoduleConfigurations: false,
  153.                                                 gitTool: "Default",
  154.                                                 submoduleCfg: [],
  155.                                                 userRemoteConfigs:[[credentialsId:"${env.GIT_CREDENTIALS_ID}",url:"${env.WEB_GIT_URL}"]]
  156.                                            ]
  157.                                         )
  158.                                         sh "echo '${scmVars}'"
  159.                                         sh "ls"
  160.                            }
  161.                         }
  162.                 }
  163.                 stage('WEB构建打包') {
  164.                         agent {
  165.                 docker{
  166.                                         image 'node:16-alpine'
  167.                                         reuseNode true
  168.                                         args  ''
  169.                                 }
  170.                         }
  171.                         when {
  172.                                 expression {
  173.                                         if (Boolean.valueOf("${SKIP_BUILD}")){
  174.                                                 echo "跳过WEB构建打包,直接打包镜像文件"
  175.                                                 return !Boolean.valueOf("${SKIP_BUILD}")
  176.                                         }
  177.                                         def services = "${SERVICES}"
  178.                                         def index = services.lastIndexOf('web-lhm-web')
  179.                     if (index != -1 ) {
  180.                                             echo "包含web-lhm-web 打包WEB镜像"
  181.                                                 return true
  182.                                         }
  183.                                         echo "没有包含web-lhm-web 跳过WEB构建打包"
  184.                                         return false
  185.                                 }
  186.                         }
  187.                         steps {
  188.                             script {
  189.                                         echo "依赖安装..."
  190.                                         sh "cd lhm-web && yarn config set registry https://registry.npmmirror.com/ && yarn install --network-concurrency 4 && yarn build"
  191.                                         echo "打包构建Version: ${VERSION}"
  192.                                         def NGINX_OS_ARCH_DOCKERIMAGE="${env.NGINX_OS_ARCH_DOCKERIMAGE}"
  193.                                         def OS_ARCH="${env.OS_ARCH}"
  194.                     def OS_TAG="${env.OS_TAG}"
  195.                                         if("${OS_TAG}"=="x86"){
  196.                         OS_TAG=""
  197.                     }
  198. //                     try {
  199. //                         // 默认先打包增量,不成功再直接打包
  200. //                         sh "docker pull ${env.HARBOR_URL}/${env.HARBOR_NAMESPACE}/lhm-web:${OS_TAG}${LAST_VERSION}"
  201. //                         echo "基于[${env.HARBOR_URL}/${env.HARBOR_NAMESPACE}/lhm-web:${OS_TAG}${LAST_VERSION}]缓存构建"
  202. //                         sh "cd lhm-web && docker build --cache-from ${env.HARBOR_URL}/${env.HARBOR_NAMESPACE}/lhm-web:${OS_TAG}${LAST_VERSION} --build-arg TARGETPLATFORM=${NGINX_OS_ARCH_DOCKERIMAGE} --build-arg OS_ARCH=${OS_ARCH} -t ${env.HARBOR_URL}/${env.HARBOR_NAMESPACE}/lhm-web:${OS_TAG}${VERSION_NO} . && docker images"
  203. //                     } catch (err) {
  204. //                         def error = "${e.toString()}"
  205. //                         echo "不走缓存构建,没有找到[${env.HARBOR_URL}/${env.HARBOR_NAMESPACE}/lhm-web:${OS_TAG}${LAST_VERSION}]镜像"
  206. //                         if(error.contains("not found")){
  207. //                                                 sh "cd lhm-web && docker build --build-arg TARGETPLATFORM=${NGINX_OS_ARCH_DOCKERIMAGE} --build-arg OS_ARCH=${OS_ARCH} -t ${env.HARBOR_URL}/${env.HARBOR_NAMESPACE}/lhm-web:${OS_TAG}${VERSION} .&& docker images"
  208. //                         } else {
  209. //                             throw err
  210. //                         }
  211. //                     }
  212.                     sh "cd lhm-web && docker build --build-arg TARGETPLATFORM=\'${NGINX_OS_ARCH_DOCKERIMAGE}\' --build-arg OS_ARCH=${OS_ARCH} -t ${env.HARBOR_URL}/${env.HARBOR_NAMESPACE}/lhm-web:${OS_TAG}${VERSION} .&& docker images"
  213.                                         sh "docker tag ${env.HARBOR_URL}/${env.HARBOR_NAMESPACE}/lhm-web:${OS_TAG}${VERSION} ${env.HARBOR_NAMESPACE}/lhm-web:${OS_TAG}${VERSION}"
  214.                                         // 登录harbor docker 仓库中心
  215.                                         echo "----<<<< 登录harbor docker 仓库中心 >>>>-----"
  216.                                         sh "docker login ${env.HARBOR_URL}  -u ${env.HARBOR_USERNAME} -p ${env.HARBOR_PASSWORD}"
  217.                                         // 推送镜像到harhor docker 仓库中心
  218.                                         echo "----<<<< 推送镜像到harhor docker 仓库中心 >>>>-----"
  219.                                         sh "docker push ${env.HARBOR_URL}/${env.HARBOR_NAMESPACE}/lhm-web:${OS_TAG}${VERSION}"
  220.                                 }
  221.             }
  222.         }
  223.                 stage('镜像打包') {
  224.                         steps {
  225.                             script {
  226.                     def OS_TAG="${env.OS_TAG}"
  227.                                         if("${OS_TAG}"=="x86"){
  228.                         OS_TAG=""
  229.                     }
  230.                                         echo "${SERVICES}"
  231.                                     def serviceListStr = "${SERVICES}"
  232.                                         if (serviceListStr.isEmpty()) {
  233.                         echo "请选择构建模块..."
  234.                                                 sh 'exit 1'
  235.                     }
  236.                                         def batchImages = []
  237.                                         serviceListStr = serviceListStr.replace("web-","")
  238.                                         def serviceList = serviceListStr.split(',')
  239.                     def count = serviceList.size()
  240.                     def fullFolderstr = "${WORKSPACE}/full/${VERSION}/"
  241.                     sh "mkdir -p ${fullFolderstr} && cd ${fullFolderstr}"
  242.                     echo "use version: ${VERSION}"
  243.                     echo "OS_TAG: ${OS_TAG}"
  244.                     sh "cd ${fullFolderstr} && touch images-load.sh && touch images-list.txt && echo '#!/bin/sh' > images-load.sh && echo 'echo "==== starting to load images ===="' >> images-load.sh && echo 'echo "====  服务导入镜像 ===="' >> images-load.sh"
  245.                     sh "cd ${fullFolderstr} && echo ' ' > images-list.txt"
  246.                                         sh "docker login ${env.HARBOR_URL}  -u ${env.HARBOR_USERNAME} -p ${env.HARBOR_PASSWORD}"
  247.                                         for (int i = 0; i < count; ++i) {
  248.                         def serviceName = "${serviceList[i]}"
  249.                                                 sh "docker pull ${env.HARBOR_URL}/${env.HARBOR_NAMESPACE}/${serviceName}:${OS_TAG}${VERSION}"
  250.                         sh "docker tag ${env.HARBOR_URL}/${env.HARBOR_NAMESPACE}/${serviceName}:${OS_TAG}${VERSION} ${env.HARBOR_NAMESPACE}/${serviceName}:${OS_TAG}${VERSION}"
  251.                         batchImages.add("lhm/${serviceName}:${OS_TAG}${VERSION}")
  252.                         sh "cd ${fullFolderstr} && echo '- ${env.HARBOR_NAMESPACE}/${serviceName}:${OS_TAG}${VERSION}' >> images-list.txt"
  253.                     }
  254.                     def batchImagesStr = batchImages.join(" ")
  255.                     def grepVersion = "${VERSION}".replaceAll(".", ".")
  256.                                         sh "cd ${fullFolderstr} && echo 'docker load -i app.tar.gz' >> images-load.sh"
  257.                     sh "cd ${fullFolderstr} && echo 'echo "==== 查看服务镜像 ===="' >> images-load.sh && echo 'docker images | grep -E ${grepVersion}' >> images-load.sh && echo 'echo "==== end to load images ===="' >> images-load.sh"
  258.                                         sh "docker images | grep -E ${grepVersion}"
  259.                                         // 打包全量
  260.                                         sh "docker save ${batchImagesStr}|gzip > ${fullFolderstr}/app.tar.gz"
  261.                     //sh "cd ${WORKSPACE}/full && ls && rm -rf ${OS_TAG}${VERSION}.zip && zip -r ${OS_TAG}${VERSION}.zip ${VERSION}/* && cp ${WORKSPACE}/full/${OS_TAG}${VERSION}.zip ${WORKSPACE}"
  262.                     sh "cd ${WORKSPACE}/full && ls && rm -rf ${OS_TAG}${VERSION}.zip && tar -czvf ${OS_TAG}${VERSION}.tar.gz ${VERSION}/* && cp ${WORKSPACE}/full/${OS_TAG}${VERSION}.tar.gz ${WORKSPACE}"
  263.                                         // -f :显示时进行过滤  “dangling=true”: 表示过滤并显示悬挂状态的镜像,即没有被标签引用或者被其他层依赖的镜像  -q :只显示image id
  264.                                         //sh "docker images -q -f dangling=true | xargs docker rmi -f"
  265.                                         // 清理打包的镜像
  266.                                         sh "docker images --format '{{.Repository}}:{{.Tag}}' | grep 'lhm/' | xargs docker rmi -f"
  267.                     archiveArtifacts artifacts: '*.tar.gz', onlyIfSuccessful: true
  268.                     echo "==== starting to export images ===="
  269.                     echo "请下载Last Successful Artifacts构建成品!!!"
  270.                                 }
  271.             }
  272.         }
  273.     }
  274. }
复制代码

3.3.执行打包使命




3.4. 导入镜像

下载后执行
  1. tar -xzvf 1.0.0.tar.gz
  2. cd 1.0.0
  3. bash images-load.sh
复制代码
4. 打包差别架构的基础image

保举一部分
4.1. java

  1. # x86_64
  2. adoptopenjdk/openjdk8-openj9:alpine-slim
  3. # aarch64
  4. arm64v8/adoptopenjdk:8-jre-openj9
复制代码
4.2. nginx

  1. # x86_64
  2. nginx:1.26.1-alpine
  3. # aarch64
  4. nginx:1.26.1-alpine
复制代码
5. 注意

5.1. 拉取http堆栈 connect: connection refused"

  1. [ERROR] Failed to execute goal com.spotify:dockerfile-maven-plugin:1.4.13:build (default) on project lhm-eureka: Could not pull cache-from image: Request error: POST unix://localhost:80/images/create?fromImage=192.168.56.10%2Flhm%2Flhm-eureka&tag=x86_641.0.0: 500, body: {"message":"Get https://192.168.56.10/v2/: dial tcp 192.168.56.10:443: connect: connection refused"} -> [Help 1]
复制代码

办理办法:
设置docker的堆栈地址
  1. vi /etc/docker/daemon.json
  2. 新增 registry-mirrors:["http://192.168.56.10"],
  3. "insecure-registries" : ["192.168.56.10:5000", "0.0.0.0/0"]
复制代码
insecure-registries是Docker中的一个配置选项,涉及容器镜像的安全拉取。


  • 定义与用途‌:
    指允许Docker从不安全(即未使用HTTPS协议的)注册中心拉取镜像的列表。默认情况下,Docker为了安全思量,只允许从使用HTTPS的注册中心拉取镜像。
  • 配置方式‌:
    在Docker配置文件(如/etc/docker/daemon.json)中,通过添加"insecure-registries"字段并指定一个或多个注册中心地址来配置。例如,"insecure-registries" : ["my-registry.local:5000"]允许从不安全的my-registry.local:5000拉取镜像。
5.2. Jenkinsfile Pipeline 打包镜像缓慢办理办法



  • 将所有使用的docker镜像推送至本身的私有堆栈(防止拉取其他镜像缓慢)
DockerFile 文件
  1. FROM openjdk:8-jdk-alpine as builder
  2. # 执行工作目录
  3. WORKDIR target
复制代码

上述文件比下面的文件缓慢接近20多倍
  1. FROM 192.168.56.10/lhm/openjdk:8-jdk-alpine
  2. # 执行工作目录
  3. WORKDIR target
复制代码

5.3. unauthorized to access repository

  1. [ERROR] Failed to execute goal com.spotify:dockerfile-maven-plugin:1.4.13:build (default) on project lhm-eureka: Could not build image: unauthorized: unauthorized to access repository: lhm/openjdk, action: pull: unauthorized to access repository: lhm/openjdk, action: pull -> [Help 1]
复制代码
办理办法
  1. docker login 192.168.56.10 admin Harbor12345
  2. 或者
  3. 新增 -v /root/.docker/config.json:/root/.docker/config.json
  4. docker{
  5.   image '192.168.56.10/lhm/maven:3.8-adoptopenjdk-8-openj9'
  6.   reuseNode true
  7.   args  '-v /root/.docker/config.json:/root/.docker/config.json -v /home/jenkins/repository:/root/.m2 -v /var/run/docker.sock:/var/run/docker.sock'
  8. }
复制代码
6. 打包增量

打包增量具体解释

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

杀鸡焉用牛刀

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表