注冊不講了,github授權。
該工具的研究來源于我看了一個工具[php monitor](https://github.com/laynefyc/php-monitor/blob/master/README-zh_CN.md) 的里面有一個擴展,tidaways。官方個給的 [windows擴展](https://ci.appveyor.com/project/tideways/php-profiler-extension) 點過去卻看不到構建產物。


于是研究了下如何用他自己生成windows用的php擴展。
首先,是自己fork了一下官方的倉庫到yangweijie 賬號下。
登錄后有個導入項目

將其導入。因為里面如果需要交互發布zip 作為release 到github 那肯定需要github 的token 的。所以想著是將倉庫轉私有 再新建導入。結果發先fork 的不能轉私有。網上有說免費如何用私有庫的,沒試。
主要是將官方的token 通過加密后再寫到.deplo 里的auth_token 里。本來想著用環境變量的,結果折騰半天讀取不對。

原官方 appveyor 配置。
~~~ yaml
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, 8.0 (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包了,無非性能問題。