Jenkins 默认是不支持执行 PowerShell 命令的,需要安装插件才能完成这样的任务。本文将介绍 Jenkins PoserShell 插件的基本用法和常见问题。

安装 PowerShell 插件

在 Jenkins->Plugin Manager 界面中选择 "Available" 标签页,输入 "powershell" 进行过滤:

选则 "PowerShell plugin",然后点击 "Install without restart" 按钮。安装完成后就可添加 PowerShell 类型的 build step 了:

在 build step 中执行 PowerShell 命令

我们通过 PowerShell 来执行一个简单的任务:检查 agent 的操作系统版本和 PowerShell 版本。
先创建一个 Freestyle 类型的 job,然后添加一个 "Windows PowerShell" 类型的 build step,并添加下面的 PowerShell 命令:

Write-Host
Write-Host "Windows version info:"
[System.Environment]::OSVersion.Version
Write-Host
Write-Host "PowerShell version info:"
$host

看起来像这个样子:

保存 job,然后运行它。执行成功后查看运行日志:

上图中的第一行说明了 Jenkins 是如何执行 PowerShell 命令的,其实就是把我们写的命令打包到一个 PowerShell 脚本文件中,然后在 agent 上调用 powershell.exe 执行这个脚本。第二个和第三个红框中则是输出的系统版本和 PowerShell 版本信息。

让 build step 失败

接下来我们发现,无论怎么执行 PowerShell 命令,build step 的结束状态都是 "成功"(包括一些命令执行失败的情况)!

这是不科学的,因为当命令执行失败或是满足一些条件时,我们希望 build step 的结束状态是 "失败"。后续的 build step 根据前面 step 的结束状态决定是否执行。
默认情况下之所以 build step 不会失败,是因为 PowerShell 执行的过程中没有执行 exit 调用!这就导致 Jenkins 无法判断执行的命令是否成功退出,默认就认为都是成功的啦。所以要完善这里的逻辑就要求我们一定要在脚本中实现自己的 exit 逻辑:判断脚本执行成功时调用 exit 0;判断脚本执行失败时调用 exit 1(当然你可以根据自己的需要返回其他整数)。
作为 demo,我们编辑上面的 job 并在最后一行添加 exit 1,保存后执行:

终于可以让 build step 失败了!

Run task as admin

在 Windows 类型的 agent 上执行的任务,有些需要 admin 权限。那么如何以 admin 权限执行 PowerShell 的命令呢?其实这是由 Jenkins agent 程序运行的权限决定的。
我们在 agent 上启动 Jenkins 程序的时候有大概三种选择,直接运行或者以 run as admin 的方式运行再或者以 Windows Service 方式运行的。如果以后两种方式运行 Jenkins agent 程序,那么所有的 task 也会以 admin 的权限运行。

在 pipeline 中执行 PowerShell 命令

毫无疑问,pipeline 将会被越来越多的使用。我们当然应当具备在 pipeline 中执行 PowerShell 命令的能力。还好,Jenkins 刚刚支持了这个功能。创建一个 pipeline 类型的 job,输入下面的代码:

node {
powershell 'Write-Output "Hello, world!";'
}

然后保存并运行。遗憾的是,这个功能还不完美:

在笔者的环境中,输出的日志总带有一点乱码,具体原因不明。猜测是 pipeline 功能对 PowerShell 插件的支持还有小问题。

总结

到目前为止,Jenkins 已经实现了对 PowerShell 的主流支持。期待 Jenkins 逐步的完善还存在的一些小问题,毕竟 MS 已经开始用 PowerShell 取代 bat 了。

Jenkins: 执行 PowerShell 命令的更多相关文章

  1. 在Jenkins中执行 PowerShell 命令实现高效的CD/CI部署

    相比于cmd,powershell支持插件.语法扩展和自定义扩展名,是智能化部署中闪闪的新星,越来越多的开发者偏爱使用Powershell. 如何让Jenkins支持Powershell呢?本文即展开 ...

  2. Jenkins服务使用 宿主机的docker、docker-compose (Jenkins 执行sudo命令时出现“sudo: no tty present and no askpass program specified”,以及 docker-compose command not found解决办法)

    若要转载本文,请务必声明出处:https://www.cnblogs.com/zhongyuanzhao000/p/11681474.html 原因: 本人最近正在尝试CI/CD,所以就使用了 Jen ...

  3. jenkins(3): jenkins执行shell命令

    参考: https://www.cnblogs.com/reblue520/p/7146693.html 1. 执行 本地 shell命令或者脚本 是在一个构建中的  bulid 选项卡. 执行本地中 ...

  4. jenkins执行shell命令提示找不到命令解决办法

    用jenkins执行shell脚本,执行一条命令: #唤醒休眠手机 adb shell input keyevent 提示: [adb] $ /bin/sh -xe /Users/xxxxx/tool ...

  5. jenkins执行shell命令,有时会提示“Command not found”

    这个问题其实就是环境变量没有配准确 (1)检查你在Jenkins中设置的maven是否准确,可以通过[new job]按钮查看新建job中是否有maven选项,没有就是你配置的不准确 如果你下载的插件 ...

  6. Windows任务计划创建计划,定时执行PowerShell命令

    [环境介绍] 操作系统:Windows Server 2012 R2,64位操作系统 PowerShell版本:PowerShell 1.0 脚本位置:C:\BackUp.ps1 启动目录:C:\Wi ...

  7. 使用C#执行PowerShell命令

    按照网上的教程配置会发生SSL链接错误 该文章的最后使用了SSL来保证账户在连接服务器的时候不发生账户认证错误,但是我经过测试发现这个是不可行的,有一种更为简单的方法 首先要对服务器进行winrm设置 ...

  8. jenkins 执行shell命令出错command not found 和No such file or directory

    [root@localhost usr]# sh test.sh command not found -bash: cd: usr: No such file or directory 这里碰到了一个 ...

  9. Centos中使用Jenkins执行gulp命令:command not found

    在Centos操作系统,使用Jenkins的pipeline执行发布流程:jenkinsfile如下: stage("前端项目构架gulp") { steps { dir('src ...

随机推荐

  1. Java文件流应用:剪切文件

    剪切的实际操作是: 第一步,先复制文件到指定位置, 第二步,删除原文件,这样就实现了剪切 与复制文件相比,多了一步删除文件 注意:删除文件必须在流关闭后,才能删除,否则,删除不了. 实例代码 pack ...

  2. Spring MVC 学习笔记一 HelloWorld

    Spring MVC 学习笔记一 HelloWorld Spring MVC 的使用可以按照以下步骤进行(使用Eclipse): 加入JAR包 在web.xml中配置DispatcherServlet ...

  3. JSP手动注入 全

    检测可否注入 http://****.house.sina.com.cn/publics/detail.jsp?id=7674 and 1=1 (正常页面) http://****.house.sin ...

  4. PHP·笔记(函数总结)

    PHP 指 PHP:超文本预处理器(译者注:PHP: Hypertext Preprocessor,递归命名) PHP 是一种服务器端的脚本语言,类似 ASP PHP 脚本在服务器上执行 PHP 支持 ...

  5. xtrabackup备份原理

    Percona XtraBackup工作原理 Percona XtraBackup是基于InnoDB的崩溃恢复功能.复制InnoDB数据文件,导致内部不一致的数据; 但随后它对文件执行崩溃恢复,使它们 ...

  6. LeetCode 206 单链表翻转

    https://leetcode.com/problems/reverse-linked-list/ 思路很简单,分别设置三个结点,之后依次调整结点1和结点2的指向关系. Before: pre -& ...

  7. ionic 项目中使用ngCordova插件$cordovaCamera筛选手机图库图片显示出来并上传

    原文档请看http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/ionic%E5%9B%BE%E7%89%87%E4%B8%8A%E4%B ...

  8. “Failed to access IIS metabase”解决方法

    原因:IIS没有注册解决办法:在CMD中进入目录C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727,运行aspnet_regiis1.aspnet_regiis ...

  9. tomcat抬头有“选择”或“选定”,导致tomcat无法运行问题

    2. 遇到tomcat抬头有"选择"或"选定",导致tomcat无法运行问题 解决:在tomcat抬头右键--属性,去掉"快速编辑模式"勾选 ...

  10. memcache与mysql的连接

    MySQL官方在5.6版本以上有一个与memcache连接的插件,名字叫做innodb_memcache. 1),没有安装过MySQL的,可以在CMAKE的时候加入:-DWITH_INNODB_MEM ...