在AppVeyor上配置Python项目

本文介绍如何用AppVeyor来做纯Python项目的集成测试。

AppVeyor 官方示例

(以上图示源于官网,并非Python项目示例。)

简介

GitHub上做CI,大哥是Travis。 不过,Travis只支持Ubuntu和Mac OS X环境。 这就给二哥AppVeyor留下了生存空间,它专门负责做Windows环境的CI,并且对Windows生态下的.NET、Azure等,提供了很好的支持。 官方文档《Supporting Windows using Appveyor — Python Packaging User Guide》,就推荐用AppVeyor来做Windows下的编译验证、测试和wheel发布。

Travis.travis.yml配置文件类似,AppVeyor也支持一个appveyor.yml配置文件。 (也可命名为.appveyor.yml,早期Windows不支持.开头的文件名。) 不同的是,AppVeyor支持一个复杂的设置页面,也可以完全不用写appveyor.yml,全部手动设置。 果然不愧是Windows生态的CI,这一点很符合Windows的哲学。

配置文件与在线设置UI相比,互有优劣。 有时候,孤就挺烦Travis的,尤其是在用tag发布失败的时候——必须修改Git历史、重新打tag、并强制更新远程Git库,才能解决这类问题。 这就是把CI配置和项目代码混合管理的一个缺陷。

不过,把设置项用一目了然的配置文件来写,是非常Geek的做法。 这符合去UI化、纯文本化的思路。 那么,既然已经是纯文本了,当然可以用Git来管理; 既然用Git来管理了,那么不如和项目代码放在同一个Git库吧——有时候,技术规范的发展思路就是这么简单。

孤还是更认可『纯文本化』的思路。些许缺陷,可以忍耐。

appveyor.yml示例

如果要阐述怎么在网页上设置一个Python的AppVeyor项目,那得难死孤了。 一大堆截图是必须的,可能还得录个gif动图,或者段视频什么的。

如果用配置文件,那就简单多了。

environment:
  matrix:
    - PYTHON: "C:\\Python27"
    - PYTHON: "C:\\Python27-x64"
    - PYTHON: "C:\\Python35-x64"
    - PYTHON: "C:\\Python36-x64"

skip_commits:
  files:
    - "*.yml"
    - "*.rst"
    - "LICENSE"

install:
  - "%PYTHON%\\python.exe -m pip install . -r requirements.txt"

build: off

test_script:
  - "%PYTHON%\\python.exe -m pytest"

notifications:
  - provider: Email
    to:
      - yanqd0@outlook.com
    on_build_status_changed: true

以下简要介绍这个文件的部分配置项的涵义。

environment

environment是对一些环境进行设置,而matrix则是根据指定环境,进行组合。 PYTHON是指定一个环境变量,指向Python的位置。 AppVeyor上已经默认预装了主流版本的Python,并包含x86与x64两种架构。

本例中,会跑Python 2.7的x86、x64、以及Python 3.5与3.6的x64四种环境的Job。

由于(免费版)AppVeyor的Job并行数只有1,所以对一次commit没必要设太多Job。

skip_commits

默认情况下,AppVeyor支持提交信息中包含[skip ci][ci skip]这种通用风格的忽略,也支持[skip appveyor]这种专门的忽略。 除此之外,也支持用message自定义的忽略关键词,以及按authorfiles进行忽略。

除了忽略,也通过only_commits支持逻辑相反的『仅包括』。

本例中,忽略了项目根目录下*.yml*.rsLICENSE这三类文件的修改,只对其它文件修改的提交做CI。

更多信息可参考《Setting up commits filtering | AppVeyor》。

install

预装一些需要的东西。

本例中,利用了requirements.txt来进行配置。

build

这个部分是留给Windows生态的那些项目用的,Python项目填off即可。

test_script

由于不知道pytest被安到哪里去了,是否直接可执行,所以只能通过python.exe来跑测试。 支持更广泛的配置方式,是python.exe setup.py test

notifications

这部分配置的是通知信息,并非必要。 其实,这类信息不适合放在VCS中,去UI界面配置会更合适。

Validate

写好配置文件后,提前做出验证是一个良好的习惯。

不像Travis有CLI支持,要验证appveyor.yml文件的合法性,只能访问:https://ci.appveyor.com/tools/validate-yaml

Badges

最后,在项目对应的【Settings】【Badges】里,可以找到对应的徽章,放在项目介绍页面中。

由于官方只给出了Markdown风格的样例,这里提供一个README.rst的样例。 毕竟,reStructuredText才是Python生态里的官方标记语言。

.. image:: https://img.shields.io/appveyor/ci/USER/PROJECT.svg
   :target: https://ci.appveyor.com/project/USER/PROJECT
   :alt: AppVeyor

大致效果如下:

AppVeyor

参考

除了孤展示的appveyor.yml以外,可以参考的还有:

以下是官方文档中有关的部分。 不得不说一句,AppVeyor的(2018年1月)文档也做得没有Travis好,连搜索功能都没有。


相关笔记