Centos7.x內網環境Jenkins前端打包環境配置
參考地址:
https://www.cnblogs.com/guangdelw/p/18763336
https://2048.csdn.net/682c1be8606a8318e857d687.html
前言:環境描述和目標
最近公司新接了一個項目,要求是:需要再桌面云中進行內網開發,所有的開發桌面云沒辦法連接公網,但是內網搭建了nexus私服,java 和 npm 的應用可以通過nexus私服來下載依賴。
我們本地的文件可以復制到桌面云內部,但是桌面云中的文件無法復制出來。
目標:
- 需要將本地的代碼上傳到對方提供的gitlab私服
- 安裝Jenkins到Centos服務器中
- 添加前后端的打包配置到Jenkins中
代碼遷移的過程就不描述了,這里著重描述安裝Jenkins 和 添加配置。
一、安裝Jenkins
Jenkins的國內源:
以下是一些常用的國內 Jenkins 插件更新源地址:
- 清華大學:https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
- 華為開源鏡像站:https://mirrors.huaweicloud.com/jenkins/updates/update-center.json
- 騰訊云:https://mirrors.cloud.tencent.com/jenkins/updates/update-center.json
- 中國科學技術大學:https://mirrors.ustc.edu.cn/jenkins/updates/update-center.json
- 北京理工大學:https://mirror.bit.edu.cn/jenkins/updates/update-center.json
1.1、前置思考:
由于公司的后端代碼使用的JDK版本為1.8,所以為了統一jdk版本,所以最初選定使用JDK8的最后一個版本:Jenkins-2.346.3;
但是再實際操作的時候發現:Jenkins在線安裝插件的時候,并不會將當前Jenkins的版本傳過去獲取適合當前版本的插件,而是會獲取當前最新版本,基于這種情況最終選定安裝比較LTS新版本的2.479.3 (注意這里使用的是JDK17)
而安裝的過程區分為兩種方式:
- 再一個可聯網的機器上安裝插件,然后將插件和配置目錄打包一起遷移到服務器中(默認的目錄為:當前用戶主目錄下的**.jenkins**文件夾下)
- 只是將 jpi插件 copy到桌面云中,并通過web界面一個個上傳上去
相比之下第一種操作方式更簡單,所以最終選用第一種方式。
但是當前時間(2025-05-27)前后國內的插件源沒辦法使用,找不到對應的 update-center.json 文件,所以吭哧了好久最終使用魔法直接連接插件官網直接進行下載的。
1.2、安裝的過程
操作步驟如下:
- 下載 jenkins.war 文件
- 通過 java -jar jenkins.war 命令進行啟動
- 然后配置用戶名和密碼和選擇插件下載即可。
- 下載完畢后,直接將jenkins配置主目錄(當前用戶主目錄下的**.jenkins**文件夾下)和 jenkins.war 文件打包上傳到桌面云服務器中
- 然后解壓,將其 .jenkins 目錄同樣放到當前用戶主目錄下,然后啟動即可
二、前端環境的配置
2.1、nodejs環境的安裝和配置
2.1.1、前置思考:
由于我們使用服務器為:Centos7.9,而項目依賴的nodejs版本要求為:16.15.1, pnpm的安裝要求為:大于18,基于安裝LTS版本的要求,最終選定安裝:18.20.8或者20.19.2版本。
而官網提供 18.20.8 或者 20.19.2 版本的nodejs再Centos7.9通過tar包安裝配置后,再執行:node -v 的過程出現類似一下的錯誤:
$ node -v
/lib64/libm.so.6: version `GLIBC_2.27' not found (required by ./node)
/lib64/libc.so.6: version `GLIBC_2.25' not found (required by ./node)
/lib64/libc.so.6: version `GLIBC_2.28' not found (required by ./node)
/lib64/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by ./node)
/lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by ./node)
/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by ./node)linux-vdso.so.1 => (0x00007ffca6bd4000)libdl.so.2 => /lib64/libdl.so.2 (0x00002b574ed87000)libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00002b574ef8b000)libm.so.6 => /lib64/libm.so.6 (0x00002b574f293000)libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00002b574f595000)libpthread.so.0 => /lib64/libpthread.so.0 (0x00002b574f7ab000)libc.so.6 => /lib64/libc.so.6 (0x00002b574f9c7000)/lib64/ld-linux-x86-64.so.2 (0x00002b574eb63000)
大概的原因是:
而CentOS 7.x等操作系統自帶的glibc版本為2.17,Node.js v18.x或更高編譯的環境所需glibc≥2.28,所以這里有三種方案:
- 升級本服務器的glibc,但是各個應用之間會依賴低版本的,強制升級會導致其他應用服務異常(不推薦)
- 通過Linux的scl計劃,再CentOS 7.x安裝各種開發工具集,重新編譯(不推薦)
- 通過nodejs官網旗下的unofficial-builds子計劃,來下載對方提供好的編譯版。地址為:https://unofficial-builds.nodejs.org/download/release/
再unofficial-builds提供的nodejs中, 18.20.8 版本再實際的使用過程中發現還是會有報錯的情況,所以最終選擇了 20.19.2,下載的地址為:
https://unofficial-builds.nodejs.org/download/release/v20.19.2/node-v20.19.2-linux-x64-glibc-217.tar.xz
2.1.2、nodejs的安裝
具體的操作如下:
- 下載 node-v20.19.2-linux-x64-glibc-217.tar.xz 文件并上傳到桌面云服務器中
- 通過
tar -Jxf node-v20.19.2-linux-x64-glibc-217.tar.xz
對文件進行解壓縮 - 配置環境變量,將當前目錄配置到 PATH 中,然后重新加載配置文件:
. /etc/profile
- npm配置使用nexus的私服,執行操作:
npm config set registry https://nexus.sunwoda.com/repository/npm-group
2.2、項目的編譯
2.2.1、項目中的配置文件
{// 省略部分配置"devDependencies": {"@ant-design/colors": "^6.0.0","@commitlint/cli": "^17.6.6","@commitlint/config-conventional": "^17.6.6","@iconify/json": "^2.2.87","@purge-icons/generated": "^0.9.0","@types/codemirror": "^5.60.8","@types/crypto-js": "^4.1.1","@types/intro.js": "^5.1.1","@types/lodash-es": "^4.17.7","@types/mockjs": "^1.0.7","@types/nprogress": "^0.2.0","@types/qrcode": "^1.5.1","@types/qs": "^6.9.7","@types/showdown": "^2.0.1","@types/sortablejs": "^1.15.1","@dcore/eslint-config": "workspace:*","@dcore/stylelint-config": "workspace:*","@dcore/ts-config": "workspace:*","@dcore/types": "workspace:*","@dcore/vite-config": "workspace:*","@vue/compiler-sfc": "^3.3.4","@vue/test-utils": "^2.4.0","cross-env": "^7.0.3","cz-git": "^1.6.1","czg": "^1.6.1","eslint": "^8.13.0","eslint-config-prettier": "^8.5.0","eslint-define-config": "^1.1.1","eslint-plugin-jest": "^25.2.2","eslint-plugin-prettier": "^4.0.0","eslint-plugin-vue": "^8.6.0","husky": "^8.0.3","lint-staged": "13.2.3","prettier": "^2.8.8","prettier-plugin-packagejson": "^2.4.4","rimraf": "^5.0.1","turbo": "^1.10.7", // 這里是個關鍵,后面考試要考"typescript": "^5.1.6","unbuild": "^1.2.1","vite": "^4.4.0","vite-plugin-mock": "^2.9.6","vue-tsc": "^1.8.4"},"packageManager": "pnpm@8.1.0","engines": {"node": ">=16.15.1","pnpm": ">=8.1.0"}
}
2.2.2、配置、編譯和打包
# npm 先配置registry私服地址,注意私服地址結尾不要添加“/”否則后期會報錯
$ npm config set registry https://nexus.sunwoda.com/repository/npm-group# 先安裝 pnpm 命令
$ npm install pnpm@8.6.7 -g# 安裝 turbo 命令
$ npm install turbo@1.10.8 -g# pnpm 命令也配置registry私服地址
$ pnpm config set registry https://nexus.sunwoda.com/repository/npm-group# 進入項目工程,先拉取依賴
$ pnpm install# 打包操作
$ pnpm run build
2.2.3、操作過程中的異常情況
2.2.3.1、pnpm install
出現error (ERR_INVALID_THIS)的情況
具體的報錯內容如下:
$ pnpm install
Scope: all 7 workspace projects
internal/eslint-config | ?WARN? deprecated eslint@8.46.0WARN? deprecated eslint-define-config@1.1.1: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.WARN? deprecated @iconify/iconify@3.1.1: no longer maintained, switch to modern iconify-icon web componentWARN? GET https://nexus.sunwoda.com/repository/npm-ptl-hosted/debug error (ERR_INVALID_THIS). Will retry in 10 seconds. 2 retries left.WARN? GET https://nexus.sunwoda.com/repository/npm-ptl-hosted/graphemer error (ERR_INVALID_THIS). Will retry in 10 seconds. 2 retries left.WARN? GET https://nexus.sunwoda.com/repository/npm-ptl-hosted/ignore error (ERR_INVALID_THIS). Will retry in 10 seconds. 2 retries left.?WARN? GET https://nexus.sunwoda.com/repository/npm-ptl-hosted/natural-compare-lite error (ERR_INVALID_THIS). Will retry in 10 seconds. 2 retries left.WARN? GET https://nexus.sunwoda.com/repository/npm-ptl-hosted/semver error (ERR_INVALID_THIS). Will retry in 10 seconds. 2 retries left.WARN? GET https://nexus.sunwoda.com/repository/npm-ptl-hosted/ts-api-utils error (ERR_INVALID_THIS). Will retry in 10 seconds. 2 retries left.WARN? GET https://nexus.sunwoda.com/repository/npm-ptl-hosted/@eslint%2Feslintrc error (ERR_INVALID_THIS). Will retry in 10 seconds. 2 retries left.WARN? GET https://nexus.sunwoda.com/repository/npm-ptl-hosted/@eslint%2Fjs error (ERR_INVALID_THIS). Will retry in 10 seconds. 2 retries left.
在 nodejs20 版本中,就會出現這個問題,為了解決這個問題,你只需要升級到 pnpm v8.3.1 或更高版本即可。
參考地址:
https://www.wyr.me/post/746
https://blog.csdn.net/qq_19661477/article/details/134234971
2.2.3.2、pnpm install
出現turbo run stub,run failed: error hashing package files
具體的報錯內容如下:
$ pnpm install
. postinstall$ turbo run stub
│ ERROR run failed: error hashing package files: git error: 'git status' in /root/abc/limsui/packages/hooks exited with code 129 stderr: error: unknown option `no-renames'
│ usage: git status [options] [--] <pathspec>...
│ -v, --verbose be verbose
│ -s, --short show status concisely
│ -b, --branch show branch information
│ --porcelain machine-readable output
│ --long show status in long format (default)
│ -z, --null terminate entries with NUL
│ -u, --untracked-files[=<mode>]
│ show untracked files, optional modes: all, normal, no. (Default: all)
│ --ignored show ignored files
│ --ignore-submodules[=<when>]
│ ignore changes to submodules, optional when: all, dirty, untracked. (Default: all)
│ --column[=<style>] list untracked files in columns
這個是 turbo v1.10.7 版本的bug,然后升級package.json中turbo的版本到新版本即可,例如: turbo v1.10.8,
參考地址:
https://github.com/vercel/turborepo/issues/5447#issuecomment-1621908600
擴展操作
1、將依賴上傳到nexus私服中
# 本地npm環境添加鏡像
$ npm config set registry https://registry.npmmirror.com# 安裝 pnpm
$ npm i pnpm@8.6.7 -g# 安裝 get-npm-tgz
$ npm i get-npm-tgz -g# 進入到項目目錄中,然后下載依賴
$ pnpm install# 然后將 pnpm-lock.yaml 轉換為:package-lock.json
$ npx pnpm-lock-to-npm-lock ./pnpm-lock.yaml# 這個命令會把當前文件夾的 package-lock.json 的依賴tgz格式下載下來, 執行成功后所有的依賴會再當前目錄的 tgz 文件夾下
$ npx get-npm-tgz# 然后將tgz文件夾壓縮為xz文件,然后上傳到桌面云中
$ tar -Jcf tgz.tar.xz tgz#======= 以下內容再桌面云中執行 =======
# 先解壓縮
$ tar -Jxf tgz.tar.xz# 先設置私服的url并進行登錄
$ npm login --registry http://registry.npmjs.com# 發布 xxxx.tgz 文件
$ npm publish xxxx.tgz
批量的發布腳本
#!/bin/bashREPOSITORY=https://nexus.sunwoda.com/repository/npm-ptl-hosted
PACKAGES_PATH=./tgznpm login --registry=$REPOSITORYfor package in $PACKAGES_PATH/*.tgz; donpm publish --registry=$REPOSITORY $package
done
參考地址:
https://blog.csdn.net/2401_85743969/article/details/141128702
https://www.npmjs.com/package/get-npm-tgz