去年 GitHub 推出了 Actions,以提供内置的持续集成能力。同样是在去年,Wolfram Research 也推出了免费的开发者 Wolfram 引擎,让我们有机会免费运行 Wolfram 语言代码。那么,两件快乐事情重合在一起。而这两份快乐,又给我带来多的快乐。得到的……没错,就是我们期待已久的对 Wolfram 语言程序的持续集成。
配置经历(趟过的坑)
当然,天下代码一大抄,照猫画虎首先也需要一个参考对象。这里参照的是 xu-cheng/latex-action,因为这是一个基于 Docker 容器的 Actions。而现成的 Wolfram 引擎的 Docker 配置早已经出现的 DockerHub 上了,直接拿来用就可以了。
由于缺乏经验,还是先按照 Creating a Docker container action 的文档过了一遍基本的流程,了解了一下 Docker 的基本用法。
基本思路是继承 arnoudbuzing/wolframengine 的 Docker 容器,然后通过入口点脚本 entrypoint.sh
认证激活 Wolfram 引擎,再运行输入的 Wolfram 脚本。
在这里遇到的最大的困难大概还是认证激活。
首先,认证需要对应的 Wolfram ID 账号密码登录。显然,账号密码不能要用户直接写在 Action 的配置里。GitHub 提供了 Secrets 机制来避免加密内容直接出现在配置文件中,但如果直接通过参数将账号密码传递给 Docker,仍不能避免让密码内容在日志中以明文出现。参考了 sliteteam/github-action-git-crypt-unlock 后,尝试得知环境变量在传递过程中不会在日志中直接输出其内容。因此,账号密码在使用时都应以环境变量的方式传递。
另一方面,Wolfram 引擎通常的激活流程是初次启动时手动在 prompt 下依序键入账号密码,文档里并没有提供利用 wolframscript 自动化这一激活流程的办法,还是在我几经失败踩坑后才探索出一种合适的办法:
1 | /usr/bin/wolframscript -authenticate $WOLFRAM_ID $WOLFRAM_PASS |
解决了认证激活的问题,剩下的基本就也没什么难度了。对参数缺失以及不合法的报错处理直接按 xu-cheng/latex-action 照搬。其它配置也基本大同小异。
最后,将 Action 发布到了市场上,见 GitHub action for Wolfram language。有什么用我也不清楚,大概可以方便推广?
食用方法
使用时将下面的内容复制到 .github/workflow/main.yml
(或者其它名字的)配置文件里
1 | - name: Run Wolfram script |
这里,script.wl
即你要运行的 Wolfram 语言脚本;secrets.WolframID
和 secrets.WolframPW
分别对应你的 Wolfram 账号 ID 和密码,你需要在仓库中建立对应名称的 Secrets,操作流程见 Creating and using encrypted secrets。
下面是一个完整的配置文件的例子:
1 | on: [push] |
附录
关于 Wolfram 引擎的许可证:
根据 FAQ 里的 “我可以在开源项目中使用免费引擎吗?”:
您可以使用免费引擎开发项目,以及演示和测试。但是,免费引擎许可证不允许终端用户使用,除非此用途用于进一步开发。对于终端用户使用,用户必须拥有 Wolfram 引擎的单独许可证。如果您拥有 Wolfram 产品(如 Wolfram|One 或 Mathematica),或者您所在的组织拥有 Wolfram 站点许可证,则您可能已拥有相应的许可证。开源项目可以申请特殊的 Wolfram 引擎许可证,允许终端用户自由使用免费引擎作为他们项目用途的一部分。
由于持续集成服务本身是“用于进一步开发”的用途,而且终端用户使用时也确实不能免除 Wolfram 引擎的单独许可证,我认为在许可上应该时没有什么风险的。
关于许可证的使用次数。经测试,对于同一个 Docker image,重复使用是不会消耗许可证的。
而在进行了新 build 的 image 中使用才会消耗许可证。
这也是这个 action 相对于直接在 workflow 中使用 wget
下载 Wolfram Engine 再激活的一个优势。
2020.08.28 补记:
最近发现 Wolfram Engine 的许可证好像可以随便用了,这个项目的意义顿时变得微妙了起来。现在在 GitHub Action 中可以直接在 Ubuntu 环境下运行:
1 | wget https://account.wolfram.com/download/public/wolfram-engine/desktop/LINUX |
安装 Wolfram Engine ,然后采用前述同样的命令激活。