上一篇文章在這
https://blog.csdn.net/D759378563/article/details/84643034
本文的目標是,在github上實現Qt工程的自動化發行。
看個預覽圖先:
上圖所示github的Release中,包含了兩個macos平臺的dmg包、5個windows平臺的zip包以及一個ubuntu平臺的包,都是自動化發行的結果。
後續會加入Android和ios包。
1、Appveyor的配置
https://blog.csdn.net/D759378563/article/details/84643034
前一篇文章中已經介紹過,Appveyor網站提供了windows的Docker鏡像,包含各種版本的visual studio和Qt,這裏通過yml配置文件,來使用這些鏡像。
先是通過一個矩陣來配置不同的鏡像
matrix之下,每一個‘-’號開頭的一段描述,都代表一個鏡像的配置。
其中APPVEYOR_BUILD_WORKER_IMAGE是網站提供的環境變量,用來指定Docker鏡像。
platform、 qt以及releaseName是我自定義的變量,用來在後文中執行腳本時做區分
before_build腳本,就是編譯之前要執行的腳本,默認使用windows的cmd語法,當然也可以使用Powershell等。
我這段腳本目的是,在編譯之前,先確認要使用的vs編譯器和Qt所在路徑。
vs一般通過調用vcvarsall.bat腳本,並傳入x86或x64等參數,來確定相應的編譯器和鏈接器,如cl.exe、nmake.exe等。
Qt的使用,是將QTDIR\bin設置到環境變量PATH中,以便可以找到qmake.exe。
有了正確的環境設置,接下來就是編譯了,很簡單的qmake make
編譯通過後,有一個after_build的腳本執行時機,此時的環境變量和前面一樣。
我這段腳本目的是,在代碼被打上tag的情況下,執行windeployqt命令,將依賴的Qt庫都打包到一起。
APPVEYOR_REPO_TAG是Docker提供的環境變量,有tag的時候這個變量的值爲true。
artifacts用來描述可以發行的代碼包,這裏指定了bin路徑,則Docker會自動將bin路徑打包爲zip,zip的名字是指定的name。
deploy用來描述要發行的目標網站。
這裏的provider指定爲github,就可以使用github的Release功能了。當然還有很多其它的網站也可用來發行。
auth_token是從github上生成的驗證用的token,後面再說如何生成。爲了不讓別人看到具體token,這裏引用了自定義的環境變量GITHUB_OAUTH_TOKEN
on:
APPVEYOR_REPO_TAG: true
表示只有在代碼被打上tag的時候,才執行deploy。
這裏的deploy沒有指定artifacts,默認會把定義的artifacts都發行出去,這就夠了。
最終的yml配置文件
appveyor.yml
version: '{build}'
branches:
except:
- project/travis
environment:
matrix:
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
platform: x86
qt: 5.9
releaseName: HelloCI_qt59_vs2015_x86
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
platform: x64
qt: 5.9
releaseName: HelloCI_qt59_vs2015_x64
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
platform: x64
qt: 5.9
releaseName: HelloCI_qt59_vs2017_x64
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
platform: x64
qt: 5.12
releaseName: HelloCI_qt512_vs2015_x64
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
platform: x64
qt: 5.12
releaseName: HelloCI_qt512_vs2017_x64
before_build:
- if "%APPVEYOR_BUILD_WORKER_IMAGE%"=="Visual Studio 2015" set msvc=msvc2015
- if "%APPVEYOR_BUILD_WORKER_IMAGE%"=="Visual Studio 2015" set vs=C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC
- if "%APPVEYOR_BUILD_WORKER_IMAGE%"=="Visual Studio 2017" set msvc=msvc2017
- if "%APPVEYOR_BUILD_WORKER_IMAGE%"=="Visual Studio 2017" set vs=C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build
- if "%platform%"=="x86" set QTDIR=C:\Qt\%qt%\%msvc%
- if "%platform%"=="x64" set QTDIR=C:\Qt\%qt%\%msvc%_64
- set PATH=%PATH%;%QTDIR%\bin;
- if "%platform%"=="x86" set vcvarsall=%vs%\vcvarsall.bat
- if "%platform%"=="x64" set vcvarsall=%vs%\vcvarsall.bat
- if "%platform%"=="x86" call "%vcvarsall%" x86
- if "%platform%"=="x64" call "%vcvarsall%" x64
build_script:
- qmake
- nmake
after_build:
- if "%APPVEYOR_REPO_TAG%"=="true" windeployqt bin\HelloCI.exe --qmldir %QTDIR%\qml
artifacts:
- path: bin
name: $(releaseName)
deploy:
provider: GitHub
auth_token: $(GITHUB_OAUTH_TOKEN)
description: 'HelloCI Release'
draft: false
prerelease: false
on:
APPVEYOR_REPO_TAG: true
2、 Travis
Travis網站有兩個,https://travis-ci.org 和https://travis-ci.com, 區別是https://travis-ci.com可以操作github的私有倉庫。
同樣的,先看一下矩陣,這裏配置了兩個osx系統和一個ubuntu系統。
os:linux
dist: xenial
這是ubuntu16.04的配置(目前還不支持18.04 bionic)
env中自定義了一些環境變量,後面用到
cache是用來緩存的,這裏指定了Qt的安裝路徑,那麼在下一次同樣的Docker鏡像啓動時,優先使用緩存,除非沒有安裝或者有新版本纔會去更新這個路徑。這樣可以節省大量的Docker運行時間哦。
os: osx
osx_image: xcode10.2
這是macos系統的設置,osx_image是travis提供的,可在其文檔中找到其它可用版本
https://docs.travis-ci.com/user/reference/osx/
緩存也是要有的。
osx系統通過brew安裝Qt,只需要一條命令即可 brew install qt,按照brew官網https://brew.sh/
的描述,目前安裝的版本爲5.12.2
濤哥試過後,發現安裝路徑是/usr/local/Cellar/qt/5.12.2/
ubuntu系統安裝Qt,上一篇文章也說過了,是通過launchpad源,目前已經有了最新的5.12.2和5.12.3了。
3、OAuth token
OAuth機制,是在不知道密碼的情況下,只通過授權的token去訪問特定的api。
使用token大致步驟:
接下來要去兩個地方粘貼,最好先貼到記事本或着什麼地方,備用。
先到Travis的項目配置頁面
Name寫前面的yml配置文件中引用的變量名GITHUB_OAUTH_TOKEN,value就是前面的token
接下來是Appveyor
一樣的東西,填好後保存即可。
最後,給代碼打上tag,提交吧。
濤哥在連續提交了50多次後。。。
最終拿到了這兩個徽章
還有這正確的發佈包。
(ubuntu那個,缺少linuxdeployqt打包步驟,後面再加)
當然,你們不用像我一樣提交50多次,你們可以直接用我寫好的配置文件。
最後附上GitHub鏈接
https://github.com/wentaojia2014/HelloCI