本文共 1681 字,大约阅读时间需要 5 分钟。
在Jenkins 2之后Jenkinsfile作为重要的特性之一得到了广泛地推广,Jenkinsfile的书写也有很多注意事项,这篇文章以习惯使用sh ‘’模块的开发者的角度,以一个NodeJS构建的Jenkinsfile来memo一下条件跳转和当前路径这两个容易被忽视的问题。
示例Jenkinsfile
这是一个使用了NodeJS插件的Angular应用构建的Jenkinsfile示例,里面的if和cd所在的两个stage就是这篇文章所memo的内容。
node { stage('Prepare Node and NPM') { // confirm nodejs plugin and setting env.NODEJS_HOME = "${tool 'nodejs-10.15.3'}" env.PATH="${env.NODEJS_HOME}/bin:${env.PATH}" sh 'npm --version' } stage('Prepare Angular CLI') { // install global angular cli sh 'npm -g install @angular/cli' sh 'ng --version' } stage('Prepare Angular Project') { // prepare angular demo app sh 'if [ ! -d demo ]; then ng new demo --style less; fi' } stage('Build Angular Project') { // build angular demo app sh 'cd demo && npm install && npm run build' }}
条件跳转
Jenkinsfile中提供了各种机制进行辅助条件控制,在前面的文章中已经有过整理,可以参看:
- 使用if:https://liumiaocn.blog.csdn.net/article/details/92851099
- 使用when:https://liumiaocn.blog.csdn.net/article/details/92817179
以Jenkins的when为例,内置了很多支持。但是不熟悉的人还是希望直接使用bash。虽然里面已经有script可以更容易的写脚本,如果希望写到一行中,可以参考一下如下的代码示例。这并不算是一个好的做法,但是对于有脚本书写经验的开发者来说不需要学习任何东西。
stage('Prepare Angular Project') { // prepare angular demo app sh 'if [ ! -d demo ]; then ng new demo --style less; fi' }
不过一旦当内容变得复杂,显然写在一行将会越来越复杂,如果你的功能不是很复杂,这是一种凑合过的方式。
另外,这行这么简单的if语句,能不能替换成 ! test -d demo && ng new demo --style less呢,答案是不能。因为当路径存在的时候,可能希望的动作是继续往下走,而不是一个只能执行一次的Job,&&会因为test命令的失败直接使得Job的执行异常而中断。
当前目录
cd demo、npm install、npm run build这本是三条命令,强硬地使用&&写在了一起,为什么不能分开使用三个sh ''的原因是因为,在具体的实现的时候,显然执行完返回当前目录会恢复为原始状态。这是一个非常容易被忘记的问题。
stage('Build Angular Project') { // build angular demo app sh 'cd demo && npm install && npm run build' }
转载地址:https://liumiaocn.blog.csdn.net/article/details/102632742 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!