當前位置: 妍妍網 > 碼農

AppVeyor CI 構建和釋出PHP擴充套件

2024-05-26碼農

感謝 yangweijie 大佬的投稿

介紹

AppVeyor 是一個持續整合的托管平台,它可以對GitHub等開源的計畫提供免費支持,也可以透過自建方式,對私有庫進行CI/CD流程,它支持Windows、Linux、MacOS系統。

AppVeyor 作為 Windows 開發者提供的持續整合工具 。它允許開發者在 Windows 環境下測試程式碼,並為使用 C 擴充套件的計畫構建面向 Windows 的二進制檔 。AppVeyor 與 GitHub 和 Bitbucket 整合,能夠在程式碼送出到這些平台後自動觸發構建 。對於開源計畫,AppVeyor 提供了免費的帳戶層,足以滿足基本的持續整合需求。

開始

該工具的研究來源於我看了一個工具php monitor的裏面有一個擴充套件,tidaways。官方個給的windows擴充套件點過去卻看不到構建產物。

於是研究了下如何用他自己生成windows用的php擴充套件。

首先,是自己 fork 了一下官方的倉庫到 yangweijie 帳號下。登入後有個匯入計畫

將其匯入。因為裏面如果需要互動釋出zip 作為release 到github 那肯定需要github 的 token 的。所以想著是將倉庫轉私有 再新建匯入。結果發先fork 的不能轉私有。網上有說免費如何用私有庫的,沒試。

主要是將官方的 token 透過加密後再寫到 deplo 裏的 auth_token 裏。本來想著用環境變量的,結果折騰半天讀取不對。

原官方 appveyor 配置。

image: Visual Studio 2015
version: '{branch}.{build}'
cache:
- c:\build-cache -> .appveyor.yml, .appveyor/*.cmd
environment:
PHP_BUILD_CACHE_BASE_DIR: c:\build-cache
PHP_BUILD_OBJ_DIR: c:\obj
PHP_BUILD_CACHE_SDK_DIR: c:\build-cache\sdk
PHP_BUILD_SDK_BRANCH: php-sdk-2.2.0
SDK_REMOTE: https://github.com/OSTC/php-sdk-binary-tools.git
SDK_BRANCH: php-sdk-2.2.0
matrix:
- PHP_REL: 8.0
ARCHITECTURE: x64
ZTS_STATE: enable
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
PHP_BUILD_CRT: vs16
- PHP_REL: 8.0
ARCHITECTURE: x64
ZTS_STATE: disable
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
PHP_BUILD_CRT: vs16
- PHP_REL: 8.0
ARCHITECTURE: x86
ZTS_STATE: enable
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
PHP_BUILD_CRT: vs16
- PHP_REL: 8.0
ARCHITECTURE: x86
ZTS_STATE: disable
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
PHP_BUILD_CRT: vs16
- PHP_REL: 7.4
ARCHITECTURE: x64
ZTS_STATE: enable
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
PHP_BUILD_CRT: vc15
- PHP_REL: 7.3
ARCHITECTURE: x64
ZTS_STATE: enable
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
PHP_BUILD_CRT: vc15
- PHP_REL: 7.2
ARCHITECTURE: x64
ZTS_STATE: enable
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
PHP_BUILD_CRT: vc15
- PHP_REL: 7.4
ARCHITECTURE: x64
ZTS_STATE: disable
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
PHP_BUILD_CRT: vc15
- PHP_REL: 7.3
ARCHITECTURE: x64
ZTS_STATE: disable
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
PHP_BUILD_CRT: vc15
- PHP_REL: 7.2
ARCHITECTURE: x64
ZTS_STATE: disable
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
PHP_BUILD_CRT: vc15
- PHP_REL: 7.4
ARCHITECTURE: x86
ZTS_STATE: enable
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
PHP_BUILD_CRT: vc15
- PHP_REL: 7.3
ARCHITECTURE: x86
ZTS_STATE: enable
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
PHP_BUILD_CRT: vc15
- PHP_REL: 7.2
ARCHITECTURE: x86
ZTS_STATE: enable
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
PHP_BUILD_CRT: vc15
- PHP_REL: 7.4
ARCHITECTURE: x86
ZTS_STATE: disable
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
PHP_BUILD_CRT: vc15
- PHP_REL: 7.3
ARCHITECTURE: x86
ZTS_STATE: disable
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
PHP_BUILD_CRT: vc15
- PHP_REL: 7.2
ARCHITECTURE: x86
ZTS_STATE: disable
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
PHP_BUILD_CRT: vc15
install:
- .appveyor\install.cmd
build_script:
- .appveyor\build.cmd

可以看出來和 github action 編譯 php 擴充套件一樣。用到了矩陣。我們要做的就是補上gitbub 部署那步。

官方文件是這麽寫的:

auth_token 透過 account 裏的加密 yaml

獲取到就行,別人最多拿到加密後字串也沒法操作你的github其他只能用於構建。然後我就嘗試構建。

經過多此嘗試後終於構建成功了第一次。點選計畫下【構建歷史】,右面顯示 jobs


能看到4個job因為我精簡了,只構建 7.4 , 7.3 (x86、x64) 。不然一個任務job不完成,會影響下次送出導致的構建(排隊中)。只能手動取消。他文件裏說 可以在構建初始化時後,rdp遠端連線電腦看。

為了搞清楚最後構建成功的檔在哪裏。我就加上了。他每次遠端後會在桌面產生一個delete 開頭的檔。構建後job 就卡住,刪除檔就會繼續job 測試生成的dll。

加上後 init 會顯示機器遠端ip:埠 使用者名稱都固定的,密碼是


自己配的。最終研究發現 他會在被遠端的電腦上建一個project 裏clone 除php-src 源碼,然後將源碼 拉取到ext 目錄裏,構建的dll 在build目錄下。

然而,我第一次成功的名字都很奇怪,只有源碼的zip。

這個得細看文件。

release: php_tideways_xhprof-v$(APPVEYOR_BUILD_VERSION)

當時yaml 是這麽寫的,v 因為沒有tag name 他只好以分支名來作為tag,5是第5次釋出。

後來既然能生成了,我幹脆改了。

固定了一個名字

補了一個 tag name 的環境變量。結合架構,php版本。

這個源碼的壓縮包怎麽來的。


build_task.cmd 裏有 7zip 壓縮 ext 擴充套件源碼為壓縮包,最後上傳。

我依葫蘆畫瓢,補上了 build下dll 壓縮 為dll.zip,並上傳至產物。


最終我研究了半天 上傳至github 只需要把deploy 下的 artifacts 或 artifacts 刪除用預設的,保證 build_cmd裏有

7z a php_tideways_xhprof-%APPVEYOR_REPO_TAG_NAME%-%PHP_REL%-%PHP_BUILD_CRT%!ZTS_IN_FILENAME!!ARCH_IN_FILENAME!.zip %APPVEYOR_BUILD_FOLDER%\php_tideways_xhprof-%PHP_REL%-!ZTS_SHORT!-%PHP_BUILD_CRT%-%PHP_SDK_ARCH%\*
 appveyor PushArtifact php_tideways_xhprof-%APPVEYOR_REPO_TAG_NAME%-%PHP_REL%-%PHP_BUILD_CRT%!ZTS_IN_FILENAME!!ARCH_IN_FILENAME!.zip -FileName php_tideways_xhprof-%APPVEYOR_REPO_TAG_NAME%-%PHP_REL%-%PHP_BUILD_CRT%!ZTS_IN_FILENAME!!ARCH_IN_FILENAME!.zip

類似這兩行程式碼,就是將 build 副檔名目錄壓縮為壓縮包,然後上傳至本地 ci 的產物裏。所有產物都會被上傳作為release的附件。壓縮包內容類似


剩下的一個方向是,這個構建用的別人電腦,能否自己電腦用於編譯?

答案是可以的。


bYOC 點了新增電腦


windows 後按照要求在家裏電腦執行就行。

PS> 坑很多,需要自己嘗試。

之前我那個init 遠端指令碼沒刪,導致我電腦被建立了帳戶,關閉的防火墻又加了N多規則,本地github 連不通之類的。很麻煩。

這個 ci server 也可以區域網路伺服器 本地部署。

反正,折騰來折騰去半天,大部份配置、環境、網路問題。總算解決了, windows dll 生成難的問題。


貼兩張 php-monitor 成功後的圖 互勉。

成功也是各種問題, monitor 用的 db illuminate tp env collection 沖突啊。計畫7 monitor 8 之類的。也想過這種效能數據 應該只上報,監控平台應該獨立出來。可他實作接入的是透過 append php 原始檔來開啟的。兩個計畫雜交。一地雞毛。 tidyawyes 4.17.5 後又不支持 sql 了。你看到的 sql 是我本地計畫看源碼模擬的

結果也不是span 那種樣式。 tp trace 默日可以取到 sql 執行時間的。就是函式耗時不知道。不禁讓我想到 如果ui 層做成 headless ui 多好。擴充套件只采集上報。當然pecl 擴充套件以後都是composer包了,無非效能問題。