最近,对于QtProtobuf,我感到困惑的是设置了一个笨拙的 CI来验证又名拉取请求,当然还要在项目的README中插入一个时髦的徽章。 选择为GitHub Actions和Travis CI 。 老实说,我没有开始搜索,比较,分析,我想要简单和快速的解决方案来完成一个非常简单的任务。 首先,我确定了GitHub Actions的CI,并通过docker容器设置了构建和单元测试验证。 但是由于种种限制,GitHub Actions根本不适合Windows中的项目验证。 我不得不求助于Travis CI。
KDPV_not_found.png
在Travis CI撰写本文时,有一个免责声明:
Windows版本处于早期访问阶段。 请前往Travis CI社区论坛以获取帮助或发表想法。
这引起了人们的关注,因为最初我尝试通过docker容器配置所有内容,然后将其放入GitHub Actions,但是由于容器的大小,类型等方面的限制,这项尝试失败了。 在github上
对企业
首先,您需要在GitHub上授权Travis CI,之后Travis CI 应用程序将出现在您的个人资料设置中。 方便地,您可以定义Travis CI可以访问的存储库:

下一步是配置Travis CI触发器。 此过程已在Travis CI本身的管理面板中完成;在撰写本文时,以下触发器可用:
- 将启动推送到任何项目早午餐
- 创建合并请求时运行
- 定时触发(定时)
原则上讲,这是构建CI的合适工具。
在选择要运行构建的触发器之后,您需要创建.travis.yml ,其中包含构建过程的描述,然后根据可用触发器将此文件放入存储库中。 Travis CI本身有关.travis.yml的零散,无系统的文档立刻引起了困惑,但是您可以根据需要弄清楚。
站立的主要任务是为装配准备环境,因为装配本身和验证是CMake的业务。
我们在.travis.yml中描述了组装过程
首先,您需要选择一个在Travis CI服务器上作为虚拟机运行的操作系统以及一种编程语言。
os: windows language: C++ ...
据我了解, language语言会自动执行某些步骤(如果未明确指定),但是对我来说这是一个谜。 我以为没有它,就不会预安装MSVC,但是在实验过程中,事实证明它也存在于其他语言中。
下一步是下载并安装必要的依赖项。 对于QtProtobuf,这些是:
- Qt 5.12.3或更高
- cmake-3.1或更高
- 草莓perl 5.28或更高
- GoLang 1.10或更高版本
- Yasm 1.3或更高
- Visual Studio编译器14.16.x
而Travis CI在这里大有帮助 。 预安装的软件包中不仅包括Git和MSVC,还包括cmake,wget和Chocolatey 。 在存在巧克力味的普里斯尼普(prisnip)中,极大地促进了依赖关系的进一步安装。 的确,为什么Qt尚未交付使用巧克力,这仍然是一个谜。
首先,请从官方存储库下载完整的Qt安装程序:
... before_install: - wget -q https://download.qt.io/official_releases/qt/5.13/5.13.2/qt-opensource-windows-x86-5.13.2.exe ...
注意:下载时,wget会转储大量具有下载进度的日志。 像GitHub一样,Travis CI对构建日志的大小有限制,因此应避免不必要的日志。 -q aka --quite选项隐藏wget日志输出。
我们进行必要的依赖项的安装:
... install: - choco install golang - choco install yasm - ./qt-opensource-windows-x86-5.13.2.exe --script ./.ci/qt_installer_windows.qs ...
通过安装GoLang和Yasm,我认为应该没有问题。 但是启动Qt安装程序后,我会更加注意。
QtInstallerFramework通过编写脚本 来支持安装过程的自动化。
对于谷歌来说,用于安装特定版本的Qt的现成脚本非常简单,我将只提供一个指向我现有Qt的链接,并注意安装组件的选择:
... Controller.prototype.ComponentSelectionPageCallback = function() { var widget = gui.currentPageWidget(); widget.deselectAll(); widget.selectComponent("qt.qt5.5132.win32_msvc2017"); gui.clickButton(buttons.NextButton); } ...
在这里,我通过调用widget.deselectAll();
关闭所有复选框组件widget.deselectAll();
并包含构建所需的“ qt.qt5.5132.win32_msvc2017 ”。 编写此过程时,有两个方面很重要:
- selectComponent与图形组件的工作原理相同,因此依赖项和子组件是根据与我们在图形界面中选择它们相同的逻辑选择的。 这就是为什么无需担心解决依赖关系的原因。
- 可以在“语言”安装模式下查看组件的名称。 为此,我在其中一次迭代中执行了
widget.selectAll();
并使用- ./qt-opensource-windows-x86-5.13.2.exe --verbose --script ./.ci/qt_installer_windows.qs
命令开始安装。 在日志中,您可以轻松地找到所需的所有组件,并使用widget.selectComponent / widget.deselectComponent来简化其安装。
我将在本教程中讨论的最后一个重点是构建环境。 由于依赖项和程序集的安装是在同一shell中进行的,因此在我们的shell中设置Go和Yasm之后,在可执行文件之前没有注册的PATH。 因此,在进行虚脱之前,必须手动注册PATH,GOROOT:
script: ... - setx path "%path%;C:\Qt\5.13.2\msvc2017\bin;C:\Go\bin;C:\ProgramData\chocolatey\lib\yasm\tools" - set GOROOT="c:\Go" - set PATH="%PATH%;C:\Qt\5.13.2\msvc2017\bin;C:\Go\bin;C:\ProgramData\chocolatey\lib\yasm\tools" - cmake -DCMAKE_PREFIX_PATH="C:\Qt\5.13.2\msvc2017;C:\Go\bin;C:\ProgramData\chocolatey\lib\yasm\tools" .. ...
我还想注意一个事实,以此类推,在CMAKE_PREFIX_PATH中,您需要指定Go和Yasm的路径,以使find_program函数正常工作。
也许稍后,我将描述如何在船上使用Qt进行构建的docker容器的创建。
所有脚本都可以在这里找到。