Windows10利用winsw将应用封装成系统服务后台启动
# 1,前言
接到一个需求,是基于 Jenkins 给 unity 打包,unity 则需要在 Windows 环境下构建,因此实现这个需求的第一步,就是需要解决给主 Jenkins 添加一个 Windows 节点的 slave。
# 2,配置 slave
创建 slave 的步骤比较简单,这里通过一张截图来看下配置信息:
其他内容都是常规配置,这里不多赘述,需要注意其中标号的两个配置信息。
- 记得配置为只允许运行绑定到这台机器的 Job,以免其他正常构建的 Job 调度到这个节点。
- 此处使用 Java Web 启动代理的方式与 master 进行连接,需要注意的是,master 节点需要在系统管理 ==> 全局安全设置 ==> 代理中选择指定端口,一般将端口指定为 50000,用于与 slave 节点进行通信。
注意:
使用这种方式通信的 slave 配置方式,务必需要将 Jenkins 的访问域名解析在 Jenkins 的 master 节点上,因为 slave 启动之后,会通过域名与 50000 端口进行建连,如果域名通过其他主机的 Nginx 代理,则会出现建连超时的情况而失败。
当我们将上边的配置保存之后,Jenkins 会给一条启动命令,如下:
$ java -jar agent.jar -jnlpUrl http://jenkins.eryajf.net/computer/windows%2Dunity/jenkins-agent.jnlp -secret 73ed891710ac084b2b45d11b7935032bef012c4415273ded59c85a5a0fbd1bc3 -workDir "C:\tpln-work\jenkins"
此时,只要 Windows 主机上有 JDK 环境,那么把 agent.jar
下载之后,在终端使用这条命令启动即可成功配置该 slave 节点。
# 3,服务后台启动
上边介绍了给主 Jenkins 配置一个 Windows 节点的步骤,最后其实是遗留了一个问题,那就是启动 slave 节点的终端还不能关闭,一旦关闭,那么这个节点也就挂了。
看了网上的一些方案,最后选择了一个名为 winsw 的开源项目来解决这个问题:
- name: winsw
desc: 将任何应用程序作为 Windows 服务进行包装和管理。
avatar: https://avatars2.githubusercontent.com/u/416130?s=460&u=8753e86600e300a9811cdc539aa158deec2e2724&v=4 # 可选
link: https://github.com/winsw/winsw # 可选
bgColor: "#0074ff" # 可选,默认var(--bodyBg)。颜色值有#号时请添加单引号
textColor: "#fff" # 可选,默认var(--textColor)
2
3
4
5
6
# 1,安装
安装比较简单,通过 release (opens new window) 可以下载,根据自己系统架构,下载对应版本的包即可:
$ wget https://github.com/winsw/winsw/releases/download/v3.0.0-alpha.10/WinSW-x64.exe
此时这个 exe 文件就相当于一个命令行工具,接下来的操作,都将通过这个命令行工具来完成。
你可以把这个文件放在任意一个你方便浏览访问的地方。
我这里将文件单独放在了 soft 目录下:
$ cd C:\soft\winsw
$ cp WinSW-x64.exe jenkins.exe
2
建议把名字改成与你要托管的服务一致,便于后期维护管理。
# 2,配置
winsw 依赖 xml 配置文件来对服务进行管理,以下是官方文档的示例:
<service>
<id>jenkins</id>
<name>Jenkins</name>
<description>This service runs Jenkins continuous integration system.</description>
<env name="JENKINS_HOME" value="%BASE%"/>
<executable>java</executable>
<arguments>-Xrs -Xmx256m -jar "%BASE%\jenkins.war" --httpPort=8080</arguments>
<log mode="roll"></log>
</service>
2
3
4
5
6
7
8
9
如上配置信息基本上也都是见名知意,这里简单解析如下:
id:
服务 ID 名称(唯一)name:
服务显示名称description:
服务的描述信息env:
配置环境变量executable:
要执行命令的二进制,此处可以写绝对路径arguments:
启动命令跟随的参数
更详细说明,参考: https://github.com/winsw/winsw/blob/v3/docs/xml-config-file.md (opens new window)
我现在是要启动 Jenkins 的 slave,那么根据如上信息,配置文件大概如下:
$ cat jenkins.xml
<service>
<id>jenkins</id>
<name>Jenkins</name>
<description>Jenkins Windows Slave Node.</description>
<executable>java</executable>
<arguments>-jar C:\tpln-work\pack\agent.jar -jnlpUrl http://jenkins.eryajf.net/computer/windows%2Dunity/jenkins-agent.jnlp -secret 73ed891710ac084b2b45d11b7935032bef012c4415273ded59c85a5a0fbd1bc3 -workDir "C:\tpln-work\jenkins"</arguments>
<logmode>rotate</logmode>
</service>
2
3
4
5
6
7
8
9
配置文件可以放到与可执行文件相同的目录下。
# 3,管理
配置文件配置完毕之后,就可以使用如下命令创建这个服务:
# 安装服务
$ jenkins.exe install
Installing service 'Jenkins (jenkins)'...
Service 'Jenkins (jenkins)' was installed successfully.
# 启动服务
$ jenkins.exe start
Service 'Jenkins (jenkins)' was refreshed successfully.
Starting service 'jenkins (jenkins)'...
Service 'jenkins (jenkins)' started successfully.
# 查看服务状态
$ jenkins.exe status
Active (running)
2
3
4
5
6
7
8
9
10
11
12
13
14
此时就可以看到服务已经在后台守护中运行了。
当我们执行完 install
之后,在系统中,也可以看到这个服务:
# 4,注意
当我用如上方式启动了 Jenkins 之后,开始构建 unity 包,发现整个打包命令执行没有毛病,但是运行完毕之后,没能正常打出 apk 包,原来是因为这个 Jenkins 服务运行用户的权限问题,此时切换到登陆,使用 administrator 账号密码登陆,然后再重启服务,就能正常打包了。
或者直接在配置文件中添加:
<service>
<id>jenkins</id>
<name>Jenkins</name>
<description>Jenkins Windows Slave Node.</description>
<executable>java</executable>
<arguments>-jar C:\tpln-work\pack\agent.jar -jnlpUrl http://jenkins.eryajf.net/computer/windows%2Dunity/jenkins-agent.jnlp -secret 68de6a6f2f5d25b1fa2bd86841a1c4c23958b607d915b1cea046f7c07e40f7a2 -workDir "C:\tpln-work\jenkins"</arguments>
<serviceaccount>
<username>administrator</username>
<password>passwd</password>
<allowservicelogon>true</allowservicelogon>
</serviceaccount>
<logmode>rotate</logmode>
</service>
2
3
4
5
6
7
8
9
10
11
12
13
然后基于这个配置进行管理,就可以了。记得把老的 uninstall 下,然后再重新 install 新的配置。
# 5,更多
服务管理的时候,还有更多参数,这里一并整理:
命令 | 描述 |
---|---|
install (opens new window) | 安装服务。 |
uninstall (opens new window) | 卸载服务。 |
start (opens new window) | 启动服务。 |
stop (opens new window) | 停止服务。 |
restart (opens new window) | 重启服务。 |
status (opens new window) | 查看服务状态。 |
refresh (opens new window) | 重新加载配置文件。 |
customize (opens new window) | 自定义包装器可执行文件。 |
dev | 实验命令。 |
还有一些实验性的命令:
命令 | 描述 |
---|---|
dev ps (opens new window) | 绘制与服务关联的进程树。 |
dev kill (opens new window) | 如果服务已停止响应,则终止该服务。 |
dev list (opens new window) | 列出由当前可执行文件管理的服务。 |
每个参数都有对应的文档地址,点击之后可以查看更详细内容。