从 C# 程序集中提取版本作为 Jenkins 管道的一部分

缺口

我想从 C# 程序集中提取构建版本,作为在 Windows 服务器上运行的 Jenkins 管道的一部分。程序集文件如下所示:

// [...snip...]

[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("BulkUpdater")]
[assembly: AssemblyCopyright("Copyright ©  2016")]

// [...snip...]

// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("3.4.1.9")]
[assembly: AssemblyFileVersion("3.4.1.9")]

我对 Jenkins 相当陌生,但对 Groovy 很熟悉,所以我转向了明显的 Groovy 工具来实现这一点:

String captureVersionFromAssembly(String assemblyFilename) {
  String version
  File file = new File(assemblyFilename)
  file.eachLine { line ->
    // avoid commented AssemblyVersion
    if (line.contains("AssemblyVersion") && !line.startsWith('//')) {
      version = line.split('"')[1]
    }
  }
  version
}

3.4.1.9在 Jenkins 管道之外正确返回

我知道 Jenkins 管道插件要求您授予管道脚本使用File该类的权限我已经在注册它这样做in-process script approval的部分Manage Jenkins

在 Jenkins 管道中,File该类似乎无法找到文件(即使bat 'dir'显示它们在那里。)

dir('omega-elms')  {
    bat 'dir'
    bat 'dir ELMS_Desktop_Application'
    echo "Working directory: ${pwd()}"
    fileExists('ELMS_Desktop_Application')
    fileExists('ELMS_Desktop_Application\\CARS')
    fileExists('ELMS_Desktop_Application\\CARS\\BulkUpdater')
    fileExists('ELMS_Desktop_Application\\CARS\\BulkUpdater\\Properties')
}

def fileExists(String filename) {
   echo "'$filename' exists? ${new File(filename).exists()}"
}

给出以下日志:

[windows] E:\Jenkins\Production\workspace\test_version_extract_buildonly\omega-elms>dir
[windows]  Volume in drive E is New Volume
[windows]  Volume Serial Number is 6695-F35A
[windows]
[windows]  Directory of E:\Jenkins\Production\workspace\test_version_extract_buildonly\omega-elms
[windows]
[windows] 29/08/2017  11:38 AM    <DIR>          .
[windows] 29/08/2017  11:38 AM    <DIR>          ..
[windows] 29/08/2017  11:38 AM    <DIR>          ELMS_Desktop_Application
[windows]                0 File(s)              0 bytes
[windows]                3 Dir(s)  105,175,678,976 bytes free
[Pipeline] [windows] bat
[windows] [omega-elms] Running batch script
[windows]
[windows] E:\Jenkins\Production\workspace\test_version_extract_buildonly\omega-elms>dir ELMS_Desktop_Application
[windows]  Volume in drive E is New Volume
[windows]  Volume Serial Number is 6695-F35A
[windows]
[windows]  Directory of E:\Jenkins\Production\workspace\test_version_extract_buildonly\omega-elms\ELMS_Desktop_Application
[windows]
[windows] 29/08/2017  11:38 AM    <DIR>          .
[windows] 29/08/2017  11:38 AM    <DIR>          ..
[windows] 29/08/2017  11:38 AM    <DIR>          AppData
[windows] 29/08/2017  11:38 AM    <DIR>          CARS
[windows] 29/08/2017  11:38 AM             1,322 README.md
[windows] 29/08/2017  11:38 AM    <DIR>          Tests
[windows]                1 File(s)          1,322 bytes
[windows]                5 Dir(s)  105,175,674,880 bytes free
[Pipeline] [windows] pwd
[Pipeline] [windows] echo
[windows] Working directory: E:\Jenkins\Production\workspace\test_version_extract_buildonly\omega-elms
[Pipeline] [windows] pwd
[Pipeline] [windows] echo
[windows] 'ELMS_Desktop_Application' exists? false
[Pipeline] [windows] echo
[windows] 'ELMS_Desktop_Application\CARS' exists? false
[Pipeline] [windows] echo
[windows] 'ELMS_Desktop_Application\CARS\BulkUpdater' exists? false
[Pipeline] [windows] echo
[windows] 'ELMS_Desktop_Application\CARS\BulkUpdater\Properties' exists? false
[Pipeline] [windows] echo
[windows] 'ELMS_Desktop_Application\CARS\BulkUpdater\Properties\AssemblyInfo.cs' exists? false

我还预先添加了工作目录以提供绝对文件路径:

String assembly = "${pwd()}\\ELMS_Desktop_Application\\CARS\\BulkUpdater\\Properties\\AssemblyInfo.cs"

但这也不能解决问题。

有什么建议么?

缺口

以下是丑陋但有效的:

appversion.batassemblyDir

@echo off
REM extract version from assembly ignoring commented out version
FOR /F delims^=^"^ tokens^=1^,2^* %%A IN ('findstr /L /B /C:"[assembly: AssemblyVersion" "AssemblyInfo.cs"') DO (
   set "version=%%B"
)
echo %version%

在詹金斯管道中:

String versionNumber
dir(assemblyDir) {
  bat './appversion.bat >stdout'
  versionNumber = readFile('stdout').trim()
}
// ...use versionNumber here

尚不清楚为什么这些File方法在 Jenkins 管道中找不到文件。更好地理解会很有趣。例如,这是故意的安全功能吗?

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

作为C#安装程序向导的一部分安装Matlab MCR

来自分类Dev

C/C++ - 按作为结构一部分的值数组进行复制

来自分类Dev

为什么Preproccessor不像C&C ++这样的Java程序的一部分?

来自分类Dev

如何执行Jenkins构建作业,作为另一个作业构建的一部分

来自分类Dev

C#从视频文件的一部分提取帧

来自分类Dev

编译用于GPU的C ++程序的一部分

来自分类Dev

编译用于GPU的C ++程序的一部分

来自分类Dev

如何使用oprofile计算C程序一部分的执行时间?

来自分类Dev

静默Jenkins CI日志的一部分

来自分类Dev

paste0和ifelse作为dplyr中管道的一部分

来自分类Dev

预配 VM 作为 Azure Devops 构建管道的一部分

来自分类Dev

如何覆盖“应用程序管道的一部分”内部名称?

来自分类Dev

在JMeter中提取href的一部分

来自分类Dev

从日志中提取线的一部分

来自分类Dev

哪个“ C ++可再发行文件”作为.NET Framework 3.5和4的一部分安装?

来自分类Dev

在 JSON C# 中包含类名作为序列化的一部分

来自分类Dev

在C中读取文件的一部分

来自分类Dev

在C中传递结构的一部分

来自分类Dev

C是.NET框架的一部分吗?

来自分类Dev

提取图像的一部分以识别

来自分类Dev

从STDOUT提取输出的一部分

来自分类Dev

提取因子的一部分

来自分类Dev

批量提取变量的一部分

来自分类Dev

如何提取JSON数组的一部分?

来自分类Dev

提取一部分字符串

来自分类Dev

Python提取json元素的一部分

来自分类Dev

提取字典文件的一部分

来自分类Dev

批量提取路径的一部分

来自分类Dev

使用ffmpeg提取视频的一部分