jenkinsfile

Jenkinsfile怎么写 学习和运用 Jenkinsfile 是熟练使用 Jenkins 进行持续集成和持续交付(CI/CD)流程的关键一步。 阅读详情

pipeline {
  agent { label 'ci22' }

  environment {
      SNOAR_HOST_URL = 'https://sonarqube.syriusrobotics.cn/'
      ECR_URI = '633349536424.dkr.ecr.cn-north-1.amazonaws.com.cn'
      INTERFACE_DOCUMENT_URL = 'https://docs.flexgalaxy.ai/en/flagship/alpha/sdk/md_flagship_api.html'
      MONGO_PORT = getRandomPort()
  }

  options {
    parallelsAlwaysFailFast()
  }

  stages {
    stage('Checkout') {
      steps {
        checkout([$class               : 'RepoScm',
                  repoUrl              : 'ssh://jenkins@gerrit.syriusrobotics.cn:29418/git-repo',
                  manifestRepositoryUrl: 'ssh://jenkins@gerrit.syriusrobotics.cn:29418/manifests',
                  manifestBranch       : 'master',
                  manifestFile         : 'flexgalxy/templar/order_service.xml',
                  currentBranch        : false,
                  forceSync            : true])
      }
    }
    stage('Build And Test') {
      steps {
        withCredentials([usernamePassword(
            credentialsId: 'maven-credencials', //这个credential的id可用于访问maven release仓库的artifacts,目前只有jenkins.syriusrobotics.cn可用
            usernameVariable: 'username',  // 此处声明usename的变量名
            passwordVariable: 'password'
        )]) {
          sh '''#!/bin/bash
          set -xe

          docker run -e MONGO_INITDB_ROOT_USERNAME=root -e MONGO_INITDB_ROOT_PASSWORD=my-secret-pw -p $MONGO_PORT:27017 --name order_service_ci_mongo_$MONGO_PORT -d mongo

          docker run --rm --net=host -P \
          -v $PWD/src:/src -v /home/ubuntu/jenkins-data/maven/.m2:/root/.m2 \
          -v /home/ubuntu/jenkins-data/gradle/.gradle:/root/.gradle \
          --env buildNumber=$BUILD_NUMBER \
          --env MONGO_PORT=$MONGO_PORT \
          -w /src/order_service_parent/ openjdk:14.0.2 \
          sh -c "./gradlew clean build -i --stacktrace -PbuildNumber=$buildNumber -PmavenUsername=$username -PmavenPassword=$password"

          echo 'order_service jars in $PWD/src/order_service/build/libs:'
          ls -al $PWD/src/order_service/build/libs

          echo 'adaptor_api jars in $PWD/src/adaptor/adaptor_api/build/libs:'
          ls -al $PWD/src/adaptor/adaptor_api/build/libs

        '''
        }
        junit testResults: 'src/**/build/test-results/test/TEST-*.xml',allowEmptyResults: true
        junit testResults: 'src/**/**/build/test-results/test/TEST-*.xml',allowEmptyResults: true
      }
    }

    //stage('Generate Coverage Report') {
    //     steps {
    //         publishCoverage (adapters: [jacocoAdapter(path: 'src/order_service/build/jacoco/test/jacocoTestReport.xml'),
    //                                     jacocoAdapter(path: 'src/adaptor/adaptor_api/build/jacoco/test/jacocoTestReport.xml')])
    //     }
    //}

    //stage('SonarQube') {
    //     steps {
    //          sh '''#!/bin/bash
    //          docker run --rm --net=host -P \
    //          -v $PWD/src:/src \
    //          -v /home/ubuntu/jenkins-data/maven/.m2:/root/.m2 \
    //          -v /home/ubuntu/jenkins-data/gradle/.gradle:/root/.gradle \
    //          --env buildNumber=$BUILD_NUMBER \
    //          --env sonarqubeHostUrl=$SNOAR_HOST_URL \
    //          -w /src/order_service/ openjdk:14.0.2 \
    //          sh -c './gradlew sonarqube --stacktrace -i -PbuildNumber=$buildNumber -PsonarqubeHostUrl=$sonarqubeHostUrl'


    //          docker run --rm --net=host -P \
    //          -v $PWD/src:/src \
    //          -v /home/ubuntu/jenkins-data/maven/.m2:/root/.m2 \
    //          -v /home/ubuntu/jenkins-data/gradle/.gradle:/root/.gradle \
    //          --env buildNumber=$BUILD_NUMBER \
    //          --env sonarqubeHostUrl=$SNOAR_HOST_URL \
    //          -w /src/adaptor/adaptor_api/ openjdk:14.0.2 \
    //          sh -c './gradlew sonarqube --stacktrace -i -PbuildNumber=$buildNumber -PsonarqubeHostUrl=$sonarqubeHostUrl'
    //         '''
    //     }
    //}

    stage('Push manifestFile to S3') {
         steps {
            script {
              sh 'repo manifest -r > manifest.xml'
              sh 'aws s3 cp manifest.xml s3://syrius-priest-cloud-flexgalaxy/templar/order_service/manifest-cloud/manifest-cloud-${BUILD_NUMBER}/  --acl public-read'
              env.MANIFEST_FILE = "s3://syrius-priest-cloud-flexgalaxy/templar/order_service/manifest-cloud/manifest-cloud-${BUILD_NUMBER}/manifest.xml"
            }
         }
    }
    stage('Deploy Images') {
          steps {
            script {
              env.VERSION = getVersion()
              sh 'aws ecr get-login-password --region cn-north-1 | docker login --username AWS --password-stdin ${ECR_URI}'
            }
            script {
              retry(3) {s
                docker.withRegistry('https://' + env.ECR_URI) {
                  echo 'build and push docker image for order_service'
                  buildImageAndPush('./src/order_service/', "order_service", "flex-galaxy/templar/order-service")
                }
              }

              //def artifactUrl = env.ECR_URI + "/flex-galaxy/templar/order-service:" + env.VERSION
              //def artifactName = "flexgalaxy-templar-order-service-${VERSION}"
              //pushArtifactsToPulse(artifactUrl, artifactName, "${INTERFACE_DOCUMENT_URL}", "com.syriusrobotics.flexgalaxy%3Aorder_service")
            }
            script {
              retry(3) {
                docker.withRegistry('https://' + env.ECR_URI) {
                  echo 'build and push docker image for order_service'
                  buildImageAndPush('./src/adaptor/adaptor_api/', "adaptor_api", "flex-galaxy/templar/adaptor-api")
                }
              }

              //def artifactUrl = env.ECR_URI + "/flex-galaxy/templar/adaptor-api:" + env.VERSION
              //def artifactName = "flexgalaxy-templar-adaptor-api-${VERSION}"
              //pushArtifactsToPulse(artifactUrl, artifactName, "${INTERFACE_DOCUMENT_URL}", "com.syriusrobotics.flexgalaxy%3Aadaptor_api")
            }
          }
    }
  }
}


def pushArtifactsToPulse(artifactUrl, artifactName, interfaceDocumentUrl, testReportComponentName) {

  def url = "'${SNOAR_HOST_URL}api/measures/component?component="+testReportComponentName+"&metricKeys=conditions_to_cover,uncovered_conditions,lines_to_cover,uncovered_lines,coverage,line_coverage'"
  def lines_to_cover = 0
  def uncovered_lines = 0
  def conditions_to_cover = 0
  def uncovered_conditions = 0
  def total_lines = 0
  def total_conditions = 0

  if(!"none".equals(testReportComponentName)) {
    def sonarqubeJson = sh(returnStdout: true, script: 'curl ' + url).trim()
    def json = readJSON text: sonarqubeJson, returnPojo: true

    def measuresArr = json['component']['measures']
    
    for(po in measuresArr){
      if(po['metric'] == 'uncovered_conditions'){
        uncovered_conditions = po['value'].toInteger()
      }else if(po['metric'] == 'conditions_to_cover'){
        conditions_to_cover = po['value'].toInteger()
      }else if(po['metric'] == 'uncovered_lines'){
        uncovered_lines = po['value'].toInteger()
      }else if(po['metric'] == 'lines_to_cover'){
        lines_to_cover = po['value'].toInteger()
      }
    }

    total_lines = lines_to_cover + uncovered_lines
    total_conditions = conditions_to_cover + uncovered_conditions
  }
  

def push_result_to_pulse_patches_job = build job: 'push_result_to_pulse_patches', propagate: true, wait: false, parameters: [
    [$class: 'StringParameterValue', name: 'projectName', value: "flexgalaxy-templar-order-service"],
    [$class: 'StringParameterValue', name: 'artifactName', value: artifactName],
    [$class: 'StringParameterValue', name: 'artifactUrl', value: artifactUrl],
    [$class: 'StringParameterValue', name: 'pulseType', value: "AddArtifacts"],
    [$class: 'StringParameterValue', name: 'artifactBuildType', value: "release"],
    [$class: 'StringParameterValue', name: 'artifactVersion', value: "${VERSION}"],
    [$class: 'StringParameterValue', name: 'artifactOrder', value: "${BUILD_NUMBER}"],
    [$class: 'StringParameterValue', name: 'linesExecuteNum', value: lines_to_cover+""],
    [$class: 'StringParameterValue', name: 'linesTotalNum', value: total_lines+""],
    [$class: 'StringParameterValue', name: 'conditionalsExecuteNum', value: conditions_to_cover+""],
    [$class: 'StringParameterValue', name: 'conditionalsTotalNum', value: total_conditions+""],
    [$class: 'StringParameterValue', name: 'xmlFilePath', value: "${MANIFEST_FILE}"],
    [$class: 'StringParameterValue', name: 'interfaceDocumentUrl', value: interfaceDocumentUrl],
  ]
}

def pushTestResultToPulse(artifactName, reportUrl) {

    build job: 'push_result_to_pulse_patches', wait: false, propagate: true, parameters: [
        [$class: 'StringParameterValue', name: 'projectName', value: "flexgalaxy-templar-order-service"],
        [$class: 'StringParameterValue', name: 'artifactName', value: artifactName.replace("/", "-").replace(":", "-")],
        [$class: 'StringParameterValue', name: 'testReportUrl', value: reportUrl],
        [$class: 'StringParameterValue', name: 'pulseType', value: "UpdateArtifactsTestResult"],
        [$class: 'StringParameterValue', name: 'currentEnv', value: "UT"],
        [$class: 'StringParameterValue', name: 'buildResult', value: "${currentBuild.result}"],
    ]
}

def buildImageAndPush(path, jarFileName, imageName) {
    def targetPath = path + "build/libs"
    def jarInTarget = sh ( returnStdout: true, script: 'cd '+ targetPath + ' && find -name *.jar' ).trim()
    def copyJarCommand = String.format("#!/bin/bash\n cd %s\n cp %s ../../docker\n cd ../../docker\n mv %s %s.jar\n",
                                targetPath, jarInTarget, jarInTarget, jarFileName)
    sh copyJarCommand

    def imageNameTag = imageName + ":" + env.VERSION
    def image = docker.build(imageNameTag, path+"/docker")
    image.push()

    sh 'docker images'
    sh 'docker rmi ' + imageNameTag
    sh 'docker rmi ' + env.ECR_URI + '/' + imageNameTag

}

def getVersion() {
  return String.format("1.0.0.%s", env.BUILD_NUMBER)
}

def getRandomPort() {
    def port = (int)(Math.random()*50000) + 10000
    return port
}

Jenkinsfile流水线构建教程 本文介绍Jenkins2 Jenkinsfile构建流水线的方法. 阅读详情

相关推荐

Jenkinsfile 参考

pipeline { agent { label 'master' } parameters { extendedChoice ( name: 'projectApiBranch', defaultValue: 'master', description: 'project api 分支名', type: 'PT_SINGLE_SELECT', groov

K8sCat 1万+

jenkins的withCredentials方法读取用户凭据, 但是在sh命令中密码没隐藏的解决方法,神奇的单引号

jenkins的withCredentials方法读取用户凭据, 但是在sh命令中密码没隐藏的解决方法, 神奇的单引号

Kainx 3279

三、Jenkinsfile 的使用

上面讲过流水线支持两种语法,即声明式和脚本式,这两种语法都支持构建持续交付流水线。并且都可以用来在 Web UI 或 Jenkinsfile 中定义流水线,不过通常将 Jenkinsfile 放置于代码仓库中(当然也可以放在单独的代码仓库中进行管理)。

Cyan_Jiang的博客 1411

jenkins流水线语法--withCredentials篇

在代码中不怎么严谨,也缺失安全性;在网上查找资料和大佬们的博客,得出一篇完整详细步骤,大家共同学习,也当为自己作个备忘录。在jenkinsfile中进行harbor登录上传镜像时。#2 安装Credentials Binding。Dashboard > 系统管理 > 凭证管理。#1 进入项目 或 创建新流水线。#3 使用流水线语法来自动生成。print("完结撒花")

qq_70531838的博客 2900

Jenkins学习——Jenkinsfile示例一

Jenkins学习——Jenkinsfile示例一写在前头的话 写在前头的话 记菜鸟运维狗开始学习jenkins使用,走上CICD趟坑路。Jenkinsfile 用于创建pipeline,类似于Dockerfile创建镜像。格式类似yaml,还可以参考java使用方法。 jenkinsfile 可以采用两种方式编写:Jenkins Pipeline首次创建时,Groovy被选为基础;后来引入了Sc...

u010430511的博客 3514

配置 default Jenkinsfile 文件

问题: 公司有很多代码工程(几十个),如果将Jenkinsfile文件放置在每个代码工程里面,维护量很大,且当脚本发生必要的变更后,所有的工程代码中的这个文件都要重新修改。 为了解决这个问题,我编写了一个通用的Jenkinsfile脚本。将该文件设置为全局默认的脚本文件。 设置方法: 1、安装插件 Pipeline: Multibranch with defaults Pipeline: Mult...

小单的博客专栏 4647

「Jenkins Pipeline」- 凭证的处理 @20210314

问题概述 在 Jenkins Pipeline 中,如果直接在脚本中使用明文的敏感信息(比如密钥、证书等等),会降低程序的可移植性、安全性。 那么如何正确管理和使用凭证,以提高程序的安全性和可移植性,避免直接使用私密信息? 解决办法 安装 Credentials Binding 插件 简单实例 使用SSH私钥文件 withCredentials([file(credentialsId: 'secret', variable: 'FILE')]) { sh 'use $FILE' .

k4nz 1414

jenkinsfile调用groovy

这里最初不太理解,为为啥我没指定对象名称,但是却可以用文件名称做实例化,后来查了下发现,如果没有定义对象信息,那么就默认以文件名称作为对象信息.脚本路径写的是Jenkinsfile,默认就是,如果修改的话那么可能会存在Jenkinsfile找不到的情况.这里将原本写在页面上的jenkinsfile,写到了gitlab中,Jenkinsfile中指明的共享库的引用名称就是在这里配置的.并配置jenkinsfile文件的分支.这里配置ide是main。系统管理-->凭据管理-->系统-->全局凭据。

crontab_e的博客 542

Jenkins 基础07 凭据管理

Jenkins凭据管理 Jenkins凭据管理,在流水线部署过程当中是非常实用的,比如将一些用户账号,如gitlab管理员的一个账号等存在这里,流水线就可以去使用,凭据的作用就是存放这些账号 Jenkins的每个凭据会有一个唯一的ID,这个ID很重要,可以自定义也可以随机生成。(后续流水线中引用都是通过ID引用的) Jenkins的凭据有很多种类型,可以将一些敏感信息存储为凭据,然后在项目中引用。 凭据-> 系统-> 全局凭据 Token和用户名密码方式足够使用了 U...

小楼一夜听春雨,深巷明朝卖杏花 2025

SAP PI实战:5分钟搞定REST适配器同步接口配置(含Postman测试技巧)

本文详细介绍了如何在SAP PI中快速配置REST适配器同步接口,包括ESR设计、集成流配置及Postman测试技巧。通过实战步骤和关键参数设置,帮助开发者高效实现系统集成,特别适合需要实时数据交互的业务场景。

weixin_33738555的博客 485

MATLAB实战:5步搞定GNSS单点定位解算(附完整代码)

本文提供了一份基于MATLAB的GNSS单点定位实战指南。通过5个核心步骤,详细讲解了如何从卫星坐标和伪距观测值出发,利用最小二乘迭代算法,构建并实现一个完整的单点定位解算器。文章附有完整代码,并涵盖精度评估与结果分析,适合GNSS初学者和MATLAB用户快速上手实践。

a2b3c4d5e的博客 250

Jenkins的一些记录

在 Jenkins 流水线中,取决于使用的是声明式还是脚本式流水线,设置环境变量的方法不同。声明式流水线支持指令,而脚本式流水线的使用者必须使用 withEnv 步骤。

路人的博客 1383

详解如何用爬虫工具批量采集阿里巴巴批发网商品数据

本文主要介绍如何使用后羿采集器的智能模式,免费采集阿里巴巴批发网商品的批发价格、发货时间、是否代发等信息。 采集字段: 商品标题、商品链接、图片链接、标签1、标签2、标签3、价格、30天成交数、 评价、店铺 功能点目录: 如何对采集字段进行配置 如何采集列表+详情页类型网页 采集结果预览: 下面我们来详细介绍一下如何免费采集1688批发网的商品数据,我们以“羽绒服女”为例,具体步骤如下: 步骤一...

weixin_43777427的博客 1万+

jenkinsfile示例_Jenkinsfile用示例解释

jenkinsfile示例 代理商 (Agent) Let’s start with agent where certain phase will be executed. It can be the entire pipeline or certain stage. At top level agent, we set it to none so we need to set each stag...

weixin_26746861的博客 1808

TCP/IP协议栈之LwIP(三)---网际寻址与路由(IPv4 + ARP + IPv6)

一、网际寻址原理 当网络设备地址总数并不是很多的情况下,有了唯一地址(比如MAC地址)就可以定位相互通信的主体。然而,当地址总数越来越多时,如何高效地从中找出通信的目标地址将成为一个重要的问题。为此人们发现地址除了具有唯一性还需要具有层次性。MAC地址虽然具有唯一性,但没有层次性,也即当网络设备增加到一定程度,需要将网络分成多个数据链路时,MAC地址无法跨链路寻址,是真正负责最终通信的地址。要实现跨局域网的网际寻址,就要靠具有层次性的网络IP地址实现了。

流云 6819

解决vscode无法运行npm命令的问题(cmd可行)

Powershell以及vscode中npm命令使用不了

无痕坚守本心的博客 2749

Jenkinsfile各指令详解

post {always {script {**构建摘要**- 构建号: ${env.BUILD_NUMBER}- 分支: ${env.BRANCH_NAME}- 提交: ${env.GIT_COMMIT}- 触发者: ${currentBuild.getBuildCauses()[0].userId}"""需插件 Custom Parametercustom(name: 'CUSTOM_PARAM', description: '自定义参数')

ZhanBiaoChina的博客 1183

Open3D点云算法与点云深度学习案例汇总(长期更新)

Open3D-python算法专栏文章汇总,长期更新算法原理与实战案例。

纵马踏花向自由 7467

Jenkinsfile详解:用代码定义你的CI/CD流水线

Jenkins是一款强大的自动化服务器,而Jenkinsfile则是实现CI/CD流水线即代码的核心文件。通过Jenkinsfile,你可以将构建、测试、部署等流程以代码形式固化,实现版本控制和团队协作,让持续集成和持续部署变得更加简单高效。 ## 什么是Jenkinsfile? Jenkinsfile是一个文本文件,用于定义Jenkins Pipeline(流水线)的完整流程。它采用Groo

gitblog_00977的博客 750

C#实战:YOLOv5+海康工业相机上位机开发全攻略(从图像采集到检测落地)

工业场景下AI质检系统的开发需要综合考虑硬件适配性、算法性能和稳定性。本文针对新能源电池极片缺陷检测场景,提出基于海康工业相机+YOLOv5+C#的技术方案,涵盖以下关键点: 工业级技术选型:选择支持全局快门的海康相机、OpenCvSharp图像处理、YOLOv5s轻量化模型,确保在无GPU工控机上稳定运行。 开发流程优化: 海康SDK集成:详细说明DLL配置和常见报错解决方案 YOLOv5模型导出:强调batch=1、opset12等工业适配参数 相机采集封装:提供线程安全的C#封装类,支持触发采集模式

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1196

Allegro技巧----相同模块复用实现快速布局

使用Allegro软件进行PCB Layout设计时,当电路图中有很多路相同的模块,使用模块复用的的操作方法,可以显著提高工作效率,同时也可以使PCB布局在整体上显得美观。 如图,有8个相同的ADC采样电路模块,它们在原理图中的电路也是一样的,对于这多个相同的电路模块,如果一个个元器件布局很明显做了很多重复机械的劳动,效率低下;但是强大的Allegro软件早就考虑到了这点,只需要在PCB中做好其中的一个,则其余相同的模块通过复用的方式,可以快速完成,方便省事还美观。 具体步骤: 1.首先完成一个模块的PC

sinat_15677011的博客 5655

深度揭秘:JenkinsFile与Pipeline的完美结合

JenkinsFile是Jenkins Pipeline的配置文件,它使用Groovy DSL编写,帮助用户定义整个CI/CD流程。通过将流水线逻辑封装在一个或多个JenkinsFile中,团队可以方便地进行版本控制,并在需要时轻松修改构建逻辑。Pipeline是Jenkins中用于定义构建和部署过程的一种方式。通过Pipeline,我们能以流水线形式表达整个CI/CD流程。由于其灵活性和可扩展性,Pipeline已经成为现代DevOps项目的标准实践。

ceshiren_com的博客 1381

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

持续交付-Jenkinsfile 语法

我们学习必然是为了找到高薪的工作,下面这些。

2301_78843735的博客 1020

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Jenkinsfile语法

语法形式有两种: V2.5之后引入,结构化方式:Declarative pipeline 基于groovy的语法:Scripts pipeline

m0_63674789的博客 2877

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Jenkinsfile共享库介绍

类似的,比如获取某个服的 DB 配置等等,也可以在共享库内实现一次, jenkinsfile 中直接从环境变量中获取。jenkinsfile 通常是一些脚本,没有共享库,重复脚本会非常多。可以在 vars 下编写 groovy 文件,比如。每个 jenkinsfile 中,只要调用。比如, resources 目录下有配置。比如,重复的获取配置代码,到后期维护不易。共享库主要用来抽离公共函数。,自动加载对应服的配置。

范安崇的博客 956

08_使用Jenkinsfile构建多环境Pipeline部署流程

在日常的持续集成与部署(CI/CD)流程中,使用 Jenkinsfile 来定义 Pipeline 是一种非常优雅且易于版本控制的方式。本文将带大家一步步实现在 Jenkins 中配置 Maven 环境,并编写一个支持“选择部署环境(测试/正式)”的自动化部署 Pipeline。

wgy17734894660的博客 553
上一篇: app all kinds of ymal
下一篇: flagship jenkins file
小时候跟鹅打过架
博客等级 码龄11年 1粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值