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. python中文字符串编码问题

    接口测试的时候,发现接口返回内容是uncodie类型但是包含中文.在使用print进行打印时输出提示错误: UnicodeEncodeError: 'ascii' codec can't encode ...

  2. openresty使用笔记(一)

    背景介绍 游戏经过一段时间的运营,发现了原来的设计缺陷太多,所以决定重新设计架构.使用到nginx作为核心并通过lua+redis设计实现自己的负载分配方案.先看看下面这张简单的架构图吧~ 从图上看, ...

  3. 上下文Context详细介绍

    1.先看看它的继承结构,下图可以看出Context首先是一个抽象类,继承了Object,Activity,Service,Application都继承了它 2.API中对它的描述: @1Context ...

  4. php实现获取汉字的首字母

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...

  5. [编织消息框架][netty源码分析]4 eventLoop 实现类NioEventLoop职责与实现

    NioEventLoop 是jdk nio多路处理实现同修复jdk nio的bug 1.NioEventLoop继承SingleThreadEventLoop 重用单线程处理 2.NioEventLo ...

  6. Python pycrypto 加密与解密

    参考: python 使用 pycrypto‎ 实现 AES 加密解密 参考: 分组对称加密模式:ECB/CBC/CFB/OFB 代码示例 : import hashlib from Crypto.C ...

  7. PHP页面提示与跳转

    <?php function message($msgTitle,$message,$jumpUrl){ $str = '<!DOCTYPE HTML>'; $str .= '< ...

  8. less中的变量

     [less中的变量]1.声明变量:@变量名:变量值:使用变量:@变量名:[less中变量的类型]1.数字 数字px2.字符串:无引号字符串 red blue 有引号 "haha" ...

  9. 2017CCPC中南地区赛 H题(最长路)

    题目地址:202.197.224.59/OnlineJudge2/ 来自湘潭大学OJ. 这里用到了一个树的直径(树中的最长边)的结论:当你找到一棵树的最长边后,这个树中所有点的最长边必定和这条边的两个 ...

  10. Linux进阶命令-sort、uniq、 cut、sed、grep、find、awk

    命令难度总体来说有简入难,参数都是工作中常常用到的.如果涉及到一些生僻的参数还请百度或man一下. sort(参考学习网站:http://www.cnblogs.com/dong008259/arch ...