我们有一系列 shell 脚本在工作,我正尝试通过使用 Jenkins 对其进行改进(以便拥有更多控制权并允许不熟悉 shell 脚本的开发人员理解并在需要时更改流程)。
我对脚本没有任何问题,基本上涉及使用 SVN 检查项目、使用 Maven 构建项目并将 war 部署到我们的容器。
但现在我正在尝试创建一个 Jenkins 作业来为我们的客户打包 Linux、Linux x86_64 和 Windows 安装程序。该脚本执行以下操作:
- checkout 项目(SVN);
- 使用测试配置文件 (Maven) 构建主项目;
- 将 war 复制到 Samba 共享 (smbclient);
- 使用生产配置文件重建项目;
- 更新 Linux、Linux64 和 Windows 文件夹中的版本化 (SVN) 文件夹;
- 复制linux文件夹下的war;
- 使用 Linux 文件夹创建压缩包;
- 将war复制到Linux64文件夹;
- 使用 Linux64 文件夹创建压缩包;
- 将 war 复制到 Windows 文件夹中;
- 使用在 Wine 上运行的 InnoSetup 创建 Windows 可执行文件;
- 将包复制到 Samba 共享。
这个脚本太复杂了,Linux、Linux64和Windows文件夹之间有很多冗余。我设想了一个改进的过程,我会使用以下文件夹结构:
libs
|-- unversioned-folder
|-- linux
| `-- specific linux files
|-- linux64
| `-- specific linux x86_64 files
`-- windows
`-- specific windows files
workspace
|-- main-project
`-- versioned-folder
|-- versioned-subfolder1
|-- versioned-subfolder2
|-- unversioned-folder (copied from libs)
| `-- main-project.war (built with Maven from the main-project)
`-- Linux or Linux64 or Windows specific folder (overwritten after each packaging)
这样,版本控制的文件夹就不会重复,我可以打包 Linux、Linux64 和 Windows 安装程序而不会出现冗余,只是覆盖每个的特定文件。
我一直在尝试使用 Jenkins,并且正在使用 Publish Over CIFS脚本第一部分的插件。但是,如果我继续使用相同的工作,我意识到它会太复杂,而且大部分步骤都将发生在后期构建部分。
理想的方法是将作业分解为更小的作业,就像在 shell 脚本中调用函数一样。现在我正在研究 Multijob plugin .
我想知道是否可以在 Jenkins 中拥有这个层次结构,共享父作业的工作区:
安装作业
- 检查主要项目
- 子任务: 创建测试项目
- 使用测试配置文件构建主项目
- 将 war 文件复制到 Windows 共享
- 子任务:创建生产项目
- 使用生产配置文件重建主要项目
- 子工作: 创建包
- 检查版本化文件夹;
- 将未版本化的文件夹复制到版本化的文件夹中;
- 将主项目war文件复制到unversioned文件夹中;
- 子工作: 打包 linux 安装程序
- 将未版本化的 Linux 特定文件复制到版本化文件夹中;
- 创建一个 tarball(打包)。
- 子工作:打包linux x86_64安装程序
- 复制未版本化的 linux64 特定文件;
- 创建一个 tarball(打包)。
- 子工作:打包windows installer
- 复制未版本化的 Windows 特定文件;
- 使用 InnoSetup(可能是带有 wine 的 shell 脚本)创建可执行安装程序。
- 将包发送到 Windows Share。
如果父作业的工作空间无法在子作业之间共享,我如何使用 Jenkins 实现与 shell 脚本相同的结果?
最佳答案
使用 Clone Workspace 插件在作业之间共享您的 .war/文件:
https://wiki.jenkins-ci.org/display/JENKINS/Clone+Workspace+SCM+Plugin
并使用Build Flow 并行化操作系统特定的子作业:
https://wiki.jenkins-ci.org/display/JENKINS/Build+Flow+Plugin
关于jenkins - 如何使用 Jenkins 创建工作层次结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22025776/