Qt项目持续集成系列之-github自动化编译



  • 简介

    持续集成的概念和好处,涛哥就不再赘述了。

    本文的目标是,领各位读者入门,学会如何在GitHub上搭建Qt项目的自动化编译环境。

    后续的文章还会有Qt项目的自动化测试、及多平台自动发行。

    创建一个Qt工程

    这里使用默认的HelloWorld模板。

    文件结构如下:

    为代码创建git仓库

    使用命令行操作

    git init

    git add .

    git commit –a –m “init version”

    或者使用小乌龟(tortoiseGit)

    在github上创建仓库

    上传代码到github

    使用命令行

    git push https://github.com/yourpath/xxxxxxxxxxx master

    或者小乌龟


    使用Travis

    travis是一个第三方的CI网站,提供linux和osx的docker环境,可以与github集成。

    使用这个网站的docker,只需要在代码git仓库中放一个叫”.travis.yml”的配置文件即可,文件具体内容在下文中。

    网址: https://travis-ci.org/

    如果想知道更多关于travis的内容,访问帮助文档网址:https://docs.travis-ci.com/

    需要先注册/登陆。默认用github账号就好了。

    第一次使用会提示github账号认证之类的,通过就行了。

    登陆成功后,进入仓库管理界面,点击那个加号

    进入添加仓库界面,找到要添加的仓库HelloCI,打开开关。如果列表中没有仓库,可以点击左上角的Sync account进行同步,之后再去找仓库。

    使用appveyor

    appveyor是一个第三方的CI网站,提供windows的docker环境,可以与github集成。

    使用这个网站的docker,只需要提供一个叫” appveyor.yml”的配置文件即可,文件具体内容在下文中。

    网址:https://www.appveyor.com/

    帮助文档网址:https://www.appveyor.com/docs/

    登陆界面。这个网站用Github账号不一定能正常登陆,请自行尝试。

    本人使用的是微软的Visual Studio Team 账号

    登陆成功后,进入项目列表。点击上面的New Project进入添加项目页面。

    选github标签,然后找到HelloCI,点击ADD按钮

    添加成功了

    添加CI配置文件

    .travis.yml (后文有链接,可下载到)

    travis默认系统为ubuntu,并提供一些基础的命令。但是没有安装Qt,这里通过ubuntu源进行安装,选择的版本为5.9.6。

    关于ubuntu源 在这个网站上查看细节 https://launchpad.net/~beineri/+archive/ubuntu/

    在搜索框输入想要的qt版本,查看是否有对应的源、如何使用

    appveyor.yml

    Appveyor比较方便一些,已经装好了各种版本的vs 和Qt,这里使用vs 14.0和qt 5.9.5 msvc2015_64

    其它版本详情看这里https://www.appveyor.com/docs/windows-images-software/

    后续的自动化测试、覆盖率统计、自动部署也是在这两个配置文件里实现,这次先不说了。

    配置文件添加到仓库

    通常为了方便查看CI状态,我们会写一个README.md的文件,里面链接上CI仓库和仓库对应的状态图标(专业名字叫徽章/badge)


    上图四个红框依次编号1-4,那么

    1是travis的小图标链接,在travis网站上,对应仓库里

    点击那个小图标,在弹出的页面中,选择代码分支为master,格式为MardDown

    (也可以仿照我提供的格式来写,我的那个是个表格的方式,看着更好一些)

    2是travis仓库对应的链接

    3是appveyor的状态图标,在appveyor的对应仓库中找到:


    4是appveyor的对应仓库链接

    添加好之后的文件结构

    提交修改到github,触发CI

    用命令行

    git add .

    git commit –a –m “add CI and README”

    git push xxx master

    或者小乌龟



    提交好了,到github上看一看吧

    这次提交已经触发了CI。

    上图这四个按钮分别 对应前面的四个链接,可以点开查看状态。

    状态图标里面显示的状态是默认的,等一段时间后(CI运行完成),刷新即可看到最新的状态。

    也可以在github 仓库的commit栏,点击CI状态按钮,来查看CI信息。

    github仓库链接

    https://github.com/wentaojia2014/HelloCI

    转载声明

    文章出自涛哥的博客 -- 点击这里查看涛哥的博客
    本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可进行许可, 转载请注明出处, 谢谢合作 © 涛哥

    联系方式


    作者 涛哥
    开发理念 弘扬鲁班文化,传承工匠精神
    博客 https://wentaojia2014.github.io
    知乎 https://www.zhihu.com/people/wentao-jia
    邮箱 jared2020@163.com
    微信 xsd2410421
    QQ 759378563

    请放心联系我,乐于提供咨询服务,也可洽谈有偿技术支持相关事宜。

    打赏

    weixin
    zhifubao


    觉得分享的内容还不错, 就请作者喝杯奶茶吧~~



Log in to reply
 

走马观花

最近的回复

  • C

    Qt for MCU需要商业授权的

    read more
  • Qt for MCUs

    搭建Qt for MCUs PC端开发环境。qt for mcus提供了一个完整的图形框架和工具包,包含了在MCUs上设计、开发和部署gui所需的一切。它允许您在裸机或实时操作系统上运行应用程序。

    先决条件

    开发主机环境支持仅限于Windows 10

    MSVC compiler v19.16 (Visual Studio 2017 15.9.9 or newer) x64

    CMake v3.13 or newer (you can install it using the Qt Online installer) x64

    使用Qt联机安装程序安装Qt for MCUs,该安装程序可通过Qt帐户下载

    安装Qt 5.14和Qt Creator 4.11 or higher

    安装链接

    › Qt: https://account.qt.io/downloads
    › CMake: https://cmake.org/download/
    › Python 2.7 32-bit: https://www.python.org/downloads/release/python-2716/
    › Arm GCC: https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnutoolchain/gnu-rm/downloads
    › J-Link Software Pack: https://www.segger.com/downloads/jlink/JLink_Windows.exe
    › J-Link OpenSDA Firmware: https://www.segger.com/downloads/jlink/OpenSDA_MIMXRT1050-EVKHyperflash
    › STM32CubeProgrammer: https://www.st.com/en/development-tools/stm32cubeprog.html
    › STM32 ST-LINK Utility: https://www.st.com/en/development-tools/stsw-link004.html​​​​​​​

    Qt Creator设置 启用Qt Creator插件 选择“帮助>关于插件”,然后从列表中选择“MCU支持(实验性)”插件,重新启动Qt Creator以应用更改
    替代文字 为MCU创建Qt工具包

    选择工具>选项>设备>MCU

    选择Qt for MCUs-Desktop 32bpp作为目标

    如果尚未设置,请提供Qt for MCUs安装目录的路径。

    单击Apply应用。

    替代文字

    替代文字
    替代文字

    注意:

    编译器要选X64,Qt版本要选64bit,CMake Tool选x64

    打开恒温器项目demo

    选择文件>打开文件或项目。。。

    打开CMakefiles.txt文件来自thermo文件夹的文件。

    选择Qt作为MCU-桌面32bpp套件。

    单击“配置项目”以完成。

    替代文字

    问题

    开发主机环境支持仅限于Windows 10

    C++编译失败,文本大字体.pixelSize.

    文本类型无法正确呈现需要复杂文本布局的unicode序列。对复杂文本使用StaticText

    read more
  • H

    hi 有问题请教你,方便加个联系方式吗

    read more
  • boost.asio是一个很棒的网络库,这回儿我也开始系统地学习起来了。想想当年接触boost,也有八年多了。这次开始接触boost,觉得既熟悉又陌生。熟悉的是小写字母+下划线的命名方式、晦涩的模板、很慢的编译速度以及较大的程序体积,陌生的是asio的各种概念:io服务、接收器、套接字等等:我之前对网络编程不是非常了解。

    于是根据我的理解,参考《Boost.Asio C++网络编程》实现了这样一个简单的客户端和服务端通信的例子,例子非常简单,还不完善,但是幸运的是,可以在本机上互通了。
    下面是客户端的代码:

    #include <iostream> #include <boost/asio.hpp> #include <boost/proto/detail/ignore_unused.hpp> using namespace std; using namespace boost::asio; using namespace boost::system; using namespace boost::proto::detail;// 提供ignore_unused方法 void writeHandler( const boost::system::error_code& ec, size_t bytesTransferred ) { if ( ec ) { cout << "Write data error, code: " << ec.value( ) << "transferred: " << bytesTransferred << endl; } else { cout << "OK! " << bytesTransferred << "bytes written. " << endl; } } int main(int argc, char *argv[]) { ignore_unused( argc ); ignore_unused( argv ); io_service service; ip::tcp::socket sock( service ); ip::tcp::endpoint ep( ip::address::from_string( "127.0.0.1" ), 6545 ); boost::system::error_code ec; sock.connect( ep, ec ); if ( ec ) { cout << "Connect error, code: " << ec.value( ) << ", We will exit." << endl; return ec.value( ); } else { char buf[1024] = "Hello world!"; sock.async_write_some( buffer( buf ), writeHandler ); sock.close( ); } return service.run( ); }

    下面是服务端的代码:

    #include <iostream> #include <boost/asio.hpp> #include <boost/proto/detail/ignore_unused.hpp> using namespace std; using namespace boost::asio; using namespace boost::system; using namespace boost::proto::detail;// 提供ignore_unused方法 void acceptHandle( const boost::system::error_code& code ) { cout << "Accepted." << endl; } int main(int argc, char *argv[]) { ignore_unused( argc ); ignore_unused( argv ); io_service service; ip::tcp::endpoint ep( ip::address::from_string( "127.0.0.1" ), 6545 ); boost::system::error_code ec; ip::tcp::socket sock( service ); ip::tcp::acceptor acceptor( service, ep ); acceptor.async_accept( sock, acceptHandle ); if ( ec ) { cout << "There is an error in server. code: " << ec.value( ) << endl; } return service.run( );// 阻塞运行 }

    运行结果是这样的:
    78448d7b-b3ae-42fc-9e2e-4dd2fbdac2c2-image.png

    我对boost.asio中几个概念的理解:

    io_service,这就是一个类似事件循环的东西,它为io设备提供服务,故名。不管是套接字、文件还是串口设备,都要使用它的服务。它的run()函数相当于启动了一个事件循环。一旦有消息了,即进行响应。这也是实现异步编程的重要基础。 socket,这个类则是套接字,可以处理TCP或者是UDP请求。有同步以及异步的处理方式,也有带异常以及不带异常的处理方式。 acceptor,接收器,仅仅是服务端使用。相当于其余框架中的listener,作接收用的。

    比较浅显,如果有不当之处,敬请指正。

    read more

关注我们

微博
QQ群