本文主要介紹流水線構建,相關常見問題及錯誤解決方案。
Java 構建常見問題
Java 構建失敗—構建依賴缺失
Flow在Java構建時需要下載settings.xml依賴文件,Flow提供阿里云 Maven 公庫作為下載源,如果您的項目涉及自己定義創建的不規則依賴文件,Flow構建會失敗,報錯信息如下:
為了讓Flow可以正常下載您項目構建所依賴的文件完成構建,您可以通過以下三種方式完成配置。
方法一:將依賴包上傳至云效制品倉庫 packages
如果您項目的代碼庫根目錄沒有Maven settings.xml且沒有選擇企業自定義Maven配置, Flow構建時會為用戶自動生成一個settings.xml文件,并且配置云效制品倉庫 packages 和阿里云公共代理倉庫。因此您可以將自己需要的依賴文件上傳至 云效制品倉庫 packages,具體操作步驟您可以進入目標制品倉庫參考倉庫指南。
方法二:將依賴包所在的倉庫添加至云效制品倉庫 packages 的代理倉庫
如果您有私有Maven倉庫,又不想把倉庫下的依賴文件上傳至 云效制品倉庫 packages,您可以把原有依賴包所在的倉庫地址綁定至云效制品倉庫作為代理倉庫。Flow在構建時就會從您設置的代理倉庫中去拉取依賴文件。
通過進入云效目標制品倉庫
,完成代理倉庫綁定。建議您在生產庫-release 和非生產庫-snapshot的代理倉庫中均添加您原有的依賴包倉庫。方法三:使用企業自定義的 settings.xml 文件
如果您有私有Maven倉庫,并且希望Flow在構建時可以直接從您的私有倉庫中下載依賴文件,具體配置如下。
在 Flow
自定義Maven配置,并上傳settings.xml文件,該企業內所有的Java構建均使用此配置文件。請確保Flow可以通過公網正常訪問您的私有倉庫,若您的私有倉庫有白名單限制配置,請參考云效默認構建集群Flow構建機的 IP 地址配置白名單。
Java 構建緩慢—未設置有效緩存目錄
由于Flow流水線執行時,每個任務節點都會創建新的構建環境,構建完后會銷毀,為解決流水線運行過程構建依賴反復下載提升整體構建效率的問題,Flow提供了自定義緩存功能。用戶可以結合自己使用場景自定義緩存目錄,實現流水線任務多次運行緩存共享。
如果您未設置正確的緩存目錄,會導致您每次進行Java構建時,即使依賴文件未未更新,也會下載您項目所有的構建依賴。典型現象如下:
即使運行多次后,依然需要耗時很久。
即使運行多次后,依然要下載大量的構建依賴。
如果您的場景包括以下任意一種:
沒有使用企業自定義的
settings.xml
(代碼庫根目錄 or 企業自定義Maven配置)。使用了企業自定義的
settings.xml
(代碼庫根目錄 or 企業自定義Maven配置),但settings.xml
中不包含自定義緩存目錄節點 <localRepository></localRepository>。
請在流水線編輯 -> 變量和緩存中添加Maven緩存目錄/root/.m2
。
緩存目錄填寫正確且開關開啟。
提速效果
增加緩存目錄的流水線,只會在第一次構建時下載您所需的依賴文件,后續構建會直接從緩存中加載依賴。
項目的依賴文件越多,緩存的加速效果越明顯。
Java 構建緩慢—刪除緩存文件
由于 Flow 流水線執行時,每個任務節點都會創建新的構建環境,構建完后會銷毀,為解決流水線運行過程中,構建依賴反復下載的問題,提升整體構建效率,Flow 提供了自定義緩存功能。用戶可以自定義自己的緩存目錄,實現流水線任務多次運行的緩存共享。
當您在構建指令中使用rm -rf
刪除了部分緩存文件,會導致您每次構建過程中都會反復下載依賴文件,從而導致構建緩慢。
如果您是擔心依賴的 snapshot 包更新后,流水線無法及時拉取,可以修改您的構建指令如下:
mvn -B clean package -Dmaven.test.skip=true -Dautoconfig.skip -U
在構建指令中添加-U
的作用:
對于release版本,緩存中已經存在,則不會重復下載
對于snapshots版本,不管緩存中是否存在,都會強制刷新,但是刷新并不意味著把jar重新下載一遍。只下載幾個比較小的文件,通過這幾個小文件確定本地和遠程倉庫的版本是否一致,再決定是否下載
Java 構建緩慢—自定義 Maven 配置
當您使用了企業自定義的settings.xml
(代碼庫根目錄or企業自定義Maven 配置),且在settings.xml
中 <localRepository></localRepository> 自定義了緩存目錄。如果您未將該目錄添加至Flow流水線的緩存目錄,則會導致您每次進行Java構建時,即使您的依賴文件未發生任何變化,都會下載您項目所有的構建依賴。
您可以通過以下兩種方案:
刪除您企業自定義的
settings.xml
(代碼庫根目錄 or 企業自定義 Maven 配置)中 <localRepository></localRepository> 節點,使用默認緩存目錄,確保流水線編排 -> 變量與緩存中添加Maven緩存目錄/root/.m2
。重要緩存目錄填寫正確且開關開啟。
將您企業自定義的
settings.xml
(代碼庫根目錄 or 企業自定義 Maven 配置)中 <localRepository></localRepository> 節點的目錄,添加到流水線編排 -> 變量與緩存的緩存目錄中。請注意:緩存目錄填寫正確且開關開啟。
Java 構建報錯 Could not resovle dependencies for project com.xxx
問題描述:Java構建步驟依賴缺失導致構建失敗,典型報錯如下。
解決方案:請參考Maven依賴設置檢查流水線構建使用的settings.xml是否符合預期,檢查settings.xml文件中配置的依賴庫是否符合預期,檢查依賴庫中是否存在目標包文件。
Java 構建緩慢—下載海外依賴
當您使用云效Flow進行 Java構建時,Flow支持通過三種方式設置settings.xml完成Maven配置:
代碼庫根目錄settings.xml文件。
Flow 企業設置 -> Maven設置中上傳settings.xml文件。
云效默認的Maven配置settings.xml 文件。
其中,第三種方式,云效默認Maven配置會幫你自動配置連接阿里云企業私有倉庫和阿里云公共代理倉庫。
若您通過前兩種方式使用了企業自定義的settings文件(代碼庫根目錄or企業自定義Maven配置),且settings.xml
中未配置國內的代理倉庫,會導致您所有公共的構建依賴都從境外Maven中央庫進行下載,從而導致構建緩慢。典型現象如下:
加速方案
優化您的企業settings.xml文件(代碼庫根目錄or企業自定義Maven配置),添加阿里云公共代理倉庫,如下:
<mirrors>
<mirror>
<id>mirror</id>
<mirrorOf>central,jcenter</mirrorOf>
<name>aliyunmaven</name>
<url>https://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>
提速效果
從阿里云公共代理倉庫下載公共依賴,更快更穩定。
Java 構建失敗:未拉取到最新依賴包
問題描述:Java構建過程中,未拉取到最新依賴包導致構建失敗。
解決方案:
若最新依賴包為新版本號,請檢查pom文件中是否更新了相應版本號。
若最新依賴包為老版本號(對已存在的依賴包進行了相同版本的覆蓋),解決方法如下。
若依賴包是snapshot版本,可使用
-U
參數強制刷新。構建命令參考如下:mvn -B clean package -Dmaven.test.skip=true -Dautoconfig.skip -U
若依賴包是release版本,可能原因是老的release依賴包已經被 Flow 緩存,因為版本未發生更新,構建過程中不會重新下載最新依賴包。可參考 緩存設置 清理緩存后重試。
Java構建下載jar包卡住
日志中出現jar包下載不繼續往下執行。出現這種情況是由于 jar 包下載失敗,首先排查使用的Maven源是否為國內鏡像源,推薦使用aliyun提供的mave鏡像倉庫 進行依賴下載加速。
Maven依賴下載報錯,提示:上傳的包有問題或者找不到
這種情況通常是用戶使用二方庫依賴導致,排查順序:首先確認下載依賴使用的私有倉庫地址(默認的 settings.xml 文件在 ~/.m2/settings.xml 下),再登錄到對應倉庫查看該依賴是否存在。
如果依賴存在且使用的是云效提供的私有倉庫(repo.rdc.aliyun.com),可以尋求云效答疑幫助。
日志顯示:pom.xml文件不存在
請檢查代碼是否克隆成功,如果克隆成功,請確認代碼庫根目錄存在 pom.xml 文件。
如何在鏡像構建中獲取Java構建的構建產物
Flow流水線內每個任務節點之間工作區相互獨立,需要將Java構建步驟和鏡像構建步驟放在同一個任務節點,可選擇以下任務。
Gradle 構建報錯 ./gradlew: No such file or directory
問題描述:Java構建步驟失敗,提示 ./gradlew: No such file or directory
,典型報錯如下圖。
解決方案:Flow未提供內置Gradle,建議使用GradleWrapper,請檢查代碼目錄下是否存在gradlew文件,若不存在請上傳gradlew文件后重試。
Gradle 構建報錯 ./gradlew:Permission denied
問題描述:Java構建步驟失敗,提示 ./gradlew:Permission denied
,典型報錯如下圖。
解決方案:該錯誤原因為gradlew沒有執行權限,可以在構建命令中通過chmod +x gradlew
修改gradlew權限后重試。詳見下圖。
Gradle 構建緩慢或超時失敗
問題描述:Java構建步驟Gradle構建緩慢或下載依賴超時失敗。
解決方案:
檢查Gradle Wrapper是否存在跨境網絡等問題,如有,可參考構建環境更換下載源。
檢查構建日志是否存在跨境下載依賴情況,如有,可以修改build.gradle文件,將依賴倉庫配置為國內代理。如下示例。
buildscript {
repositories {
maven {
url 'http://maven.aliyun.com/nexus/content/groups/public/'
}
maven {
url 'http://maven.aliyun.com/nexus/content/repositories/jcenter'
}
}
}
allprojects {
repositories {
maven {
url 'http://maven.aliyun.com/nexus/content/groups/public/'
}
maven {
url 'http://maven.aliyun.com/nexus/content/repositories/jcenter'
}
}
}
PHP 構建常見問題
PHP 構建報錯 requested PHP extension xxx is missing from your system
問題描述:composer install安裝失敗,提示缺少部分依賴。
解決方案:可以通過類似apt-get install xxx或者yum install xxx 指令安裝相關依賴。
PHP 構建 Composer 版本不滿足
問題描述:PHP 構建時因 Composer 版本問題導致失敗。
解決方案:云效默認 PHP 環境中,提供的 Composer 為 1.8.6。您可通過添加以下指令將默認環境中的 Composer 版本快速升級至 2.1.5。
wget https://rdc-public-software.oss-cn-hangzhou.aliyuncs.com/composer/2.1.5/composer.phar -O /usr/local/bin/composer
Go 構建常見問題
GO 構建報錯 not found: xxx 無法訪問倉庫
問題描述:Go構建步驟報錯not found xxx,無法訪問倉庫,典型報錯如下。
解決方案:Go 構建過程中,如果需要通過private registry下載依賴文件,需要在環境中配置相關憑證,可參考設置依賴下載訪問憑證配置。
GO 構建下載海外依賴導致構建緩慢
問題描述:從 Github等海外倉庫直接下載構建依賴會導致構建緩慢。
解決方案:建議添加以下命令,設置國內代理。
export GOPROXY=https://goproxy.cn
GO 構建報錯 no rule to make target build
問題描述:使用make build執行go構建,報錯no rule to make target build...。
解決方案:
執行make build需要代碼倉庫下有makefile文件,請檢查您代碼中該文件是否存在。
修改流水線中的執行命令,使用本地可以通過的構建命令。
Golang 構建下載依賴卡住
日志中出現依賴下載后不繼續執行,可能是由于使用了海外的go鏡像源。阿里云提供了官方的Go Module 代理倉庫服務,來避免模塊拉取緩慢或失敗的問題,加速構建。
Go 鏡像源訪問報錯,提示:unrecognized import path
這種情況通常是引文海外Go鏡像源存在訪問不穩定的情況。建議將鏡像源改為使用阿里云提供的 Go 鏡像源:https://developer.aliyun.com/mirror。
構建物管理常見問題
構建物上傳失敗,報錯:找不到指定文件或文件夾...
問題描述:代碼經過 Flow 構建后,生成了您的構建產物(例如:jar 包),需要先將構建物進行上傳,用于后續部署任務(例如:主機部署 ECS)可以獲取構建物的下載地址,并通過拉取構建物進行部署。在構建物上傳的步驟中,您可以為制品選取一個名稱,該名稱在流水線后續階段(比如部署階段)會被引用到。此外,用戶可以指定打包路徑,該路徑可以為一個文件或文件夾,系統會將其打包為一個壓縮包。如果用戶想將多個文件或文件夾打包,也可以點擊”+”號添加更多的打包路徑。
您的打包路徑可能填寫錯誤,會導致您的構建物上傳失敗,典型的報錯信息如下:
典型錯誤場景:Java項目中包含了多個微服務,Flow的構建物上傳步驟的打包路徑中需要填寫構建物的子目錄。如下圖,微服務spring-boot-mp-demo的構建物子目錄在spring-boot-mp-demo/target/
目錄下,需要將打包路徑修改為spring-boot-mp-demo/target/
。
解決方案:通過Java構建步驟的日志,確認你需要上傳的具體路徑,修改為正確的上傳路徑即可。
自有集群構建緩存清理
當你使用自有構建集群,在運行一段時間之后,會產生較多的鏡像緩存與依賴緩存需要進行清理。
通過提供的腳本會對以下內容做清理:
鏡像緩存
Untaged的鏡像,如采用相同的標簽進行鏡像構建會產生。
自定義環境構建過程中產生的中間鏡像,即名稱為custom-*的鏡像。
一些不再會被使用的步驟鏡像。
目錄緩存
超過30天未運行過的流水線工作區緩存。
超過7天其他本地緩存。
清理命令如下:
如果需要定期進行緩存清理,建議您將以下命令配置到cronjob中。
docker run -v /var/run/docker.sock:/var/run/docker.sock -v /root/yunxiao:/root/yunxiao registry.cn-beijing.aliyuncs.com/build-steps/cache-cleaner:0.0.3-20230914183240
如果你的企業創建于2023年之前,并且還沒有按照私有構建集群Runner升級指南中的提示進行過升級,那么請使用如下的命令進行緩存清理。
docker run -v /var/run/docker.sock:/var/run/docker.sock -v /root/yunxiao/build:/root/yunxiao/build registry.cn-beijing.aliyuncs.com/build-steps/cache-cleaner:0.0.1
本地調試優化
云效為用戶提供一定額度的免費構建環境資源,由于構建環境為系統自動生成分配,構建完成會隨之銷毀。針對構建環境失敗的問題,云效提供了本地調試優化工具。
該工具的工作原理,您可以理解為在本機環境中,拉取云效流水線環境的鏡像,模擬與Flow上相同的容器環境,并直接在本機中進行命令調試。因此,使用該工具的前提需要在本地安裝 Docker。
步驟一:復制調試指令并在本地環境執行
部分流水線任務執行失敗后,可以通過本地調試工具查看。由于第一次模擬環境,在拉取構建環境的鏡像時候,可能會耗費較長的時間。
步驟二:本地調試
可以通過在失敗的流水線步驟中查看當前的環境情況,并在本地環境下模擬調試來解決此問題。如以下示例,流水線任務在“Java 構建”步驟執行失敗,使用本地調試工具,進入到該構建的環境目錄下調試。
錯誤:“超時取消”問題排查
在流水線執行中,遇到超時終止的問題,用戶可以按照文檔進行相應的排查。
NodeJS 構建下載Npm 包卡住
日志中 npm install 后不繼續往下執行,可能是由于使用海外 npm 鏡像源,使用 cnpm 替換 npm 可以切換到使用 淘寶 NPM 鏡像。
其他依賴,如無法下載tar 包
可以考慮將依賴上傳到 開始使用OSS,再生成外部下載鏈接下載。
其他問題
檢查是否在腳本中執行了耗時超過一小時的操作。我們建議一個步驟的功能盡可能簡單,如果有耗時過長的步驟導致任務超時,請將其拆分為多個步驟且分別在不同任務中進行。
構建常見錯誤排查
代碼下載報錯,提示:Clone Failed
這種情況通常是觸發流水線的沒有代碼的訪問權限,或者輸入源中配置的分支不存在,請檢查相關配置。
npm 構建報錯,提示:找不到 module
這種情況通常是沒有執行 cnpm install, 請檢查相關任務的執行命令中是否有 cnpm install,沒有請加上。
構建報錯,提示:上傳文件路徑不存在
請檢查本地執行構建的構建產物路徑和流水線中配置的產物上傳路徑是否一致。
上傳文件的時候試圖使用正則匹配,例如: */target/*.jar
上傳文件路徑不支持正則匹配,需使用 target/ 或者 target/app.jar 這種格式。