抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

去年 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
2
/usr/bin/wolframscript -authenticate $WOLFRAM_ID $WOLFRAM_PASS
/usr/bin/wolframscript -activate

解决了认证激活的问题,剩下的基本就也没什么难度了。对参数缺失以及不合法的报错处理直接按 xu-cheng/latex-action 照搬。其它配置也基本大同小异。

最后,将 Action 发布到了市场上,见 GitHub action for Wolfram language。有什么用我也不清楚,大概可以方便推广?

食用方法

使用时将下面的内容复制到 .github/workflow/main.yml (或者其它名字的)配置文件里

1
2
3
4
5
6
7
- name: Run Wolfram script
uses: miRoox/wolfram-action@master
with:
file: script.wl
env:
WOLFRAM_ID: ${{ secrets.WolframID }}
WOLFRAM_PASS: ${{ secrets.WolframPW }}

这里,script.wl 即你要运行的 Wolfram 语言脚本;secrets.WolframIDsecrets.WolframPW 分别对应你的 Wolfram 账号 ID 和密码,你需要在仓库中建立对应名称的 Secrets,操作流程见 Creating and using encrypted secrets

下面是一个完整的配置文件的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
on: [push]
jobs:
run_wolfram:
name: Run Wolfram language code
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v1
- name: Run Wolfram script
uses: miRoox/wolfram-action@master
with:
file: script.wl
env:
WOLFRAM_ID: ${{ secrets.WolframID }}
WOLFRAM_PASS: ${{ secrets.WolframPW }}

附录

关于 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
2
3
wget https://account.wolfram.com/download/public/wolfram-engine/desktop/LINUX
sudo bash LINUX -- -auto -verbose
rm LINUX

安装 Wolfram Engine ,然后采用前述同样的命令激活。

评论