node項目構建
1.把npm變成cnpm
2.使用cnpm進行構建打包
sh "cd /var/lib/jenkins/workspace/sdc-h5"
sh "cnpm config set strict-ssl false"
sh "cnpm install node-sass --unsafe-perm --save-dev"
sh "cnpm install"
sh "cnpm run build:sit"
ansible安裝配置
1.配置免密登錄 在ansible主機上使用普通用戶創建公私鑰即可,不一定要使用管理員用戶
1.[jenkins@localhost ~]$ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
2.[jenkins@localhost ~]$ ssh-copy-id -i .ssh/id_rsa.pub admin@192.168.30.98
3.ansible建立ssh免密的時候必須選用合適的用戶 服務端主機上和客戶端主機上必須存在同樣的用戶才行
ansible主機上存在jenkins普通用戶 但是遠程主機上沒有jenkins用戶,執行ansible命令的時候是以jenkins用戶遠程連接的所以會出現連接異常
4.在ansible主機上從jenkins用戶切換到admin用戶,然后重新生成公私密鑰即可
5.在執行ansible命令的時候指定遠程連接用戶
ansible webservers --user=admin -m ping
發布項目流程
ansible webservers --user=admin -m copy -a "src=/var/lib/jenkins/workspace/sdc-h5/dist/* dest=/home/admin/testh5/"
copy模塊用於將本地或遠程機器上的文件拷貝到遠程主機上
拷貝前備份 backup=yes
src是目錄時
源目錄以/結尾,只拷貝了目錄下的內容
源目錄未以/結尾,直接將src目錄本身拷貝到目的地
src和dest都是文件,若dest的文件的父目錄不存在將報錯
Pipeline依次執行指令
1.獲取命令執行是否成功 excuteCode = sh(script: "<shell command>", returnStatus: true)
2.獲取命令執行的輸出內容 result = sh(script: "<shell command>", returnStdout: true)

stage("Deploy"){ steps { script { sh "ansible webservers --user=admin -m copy -a 'src=/var/lib/jenkins/workspace/AppServiceProject/register-center/target/register-center.jar dest=/home/admin/app/'" sh "ansible webservers --user=admin -m copy -a 'src=/var/lib/jenkins/workspace/AppServiceProject/config-center/target/config-center.jar dest=/home/admin/app/'" sh "ansible webservers --user=admin -m copy -a 'src=/var/lib/jenkins/workspace/AppServiceProject/gateway-zuul/target/gateway-zuul.jar dest=/home/admin/app/'" sh "ansible webservers --user=admin -m copy -a 'src=/var/lib/jenkins/workspace/AppServiceProject/admin/target/admin.jar dest=/home/admin/app/'" sh "ansible webservers --user=admin -m copy -a 'src=/var/lib/jenkins/workspace/AppServiceProject/bizapp/sdc-collect-config/target/sdc-collect-config-0.0.1-SNAPSHOT.jar dest=/home/admin/app/'" sh "ansible webservers --user=admin -m copy -a 'src=/var/lib/jenkins/workspace/AppServiceProject/bizapp/sdc-rule-config/target/sdc-rule-config-1.0-SNAPSHOT.jar dest=/home/admin/app/'" sh "ansible webservers --user=admin -m copy -a 'src=/var/lib/jenkins/workspace/AppServiceProject/bizapp/sdc-es-service/target/sdc-es-service.jar dest=/home/admin/app/'" } } post { success { print("Deploy success......") } } } stage("Start"){ steps { script { //sh "ansible webservers --user=admin -m shell -a '/home/admin/app/start-register.sh'" res = sh(script: "ansible webservers --user=admin -m shell -a '/home/admin/app/start-register.sh'", returnStdout: true) if (res.contains("Start Fail")){ error("register服務啟動失敗,本次發布流程終止") } //sh "ansible webservers --user=admin -m shell -a '/home/admin/app/start-config.sh'" res = sh(script: "ansible webservers --user=admin -m shell -a '/home/admin/app/start-config.sh'", returnStdout: true) if (res.contains("Start Fail")){ error("config服務啟動失敗,本次發布流程終止") } //sh "ansible webservers --user=admin -m shell -a '/home/admin/app/start-gateway.sh'" res = sh(script: "ansible webservers --user=admin -m shell -a '/home/admin/app/start-gateway.sh'", returnStdout: true) if (res.contains("Start Fail")){ error("gateway服務啟動失敗,本次發布流程終止") } //sh "ansible webservers --user=admin -m shell -a '/home/admin/app/start-admin.sh'" res = sh(script: "ansible webservers --user=admin -m shell -a '/home/admin/app/start-admin.sh'", returnStdout: true) if (res.contains("Start Fail")){ error("admin服務啟動失敗,本次發布流程終止") } //sh "ansible webservers --user=admin -m shell -a '/home/admin/app/start-sdccollectconfig.sh'" res=sh(script: "ansible webservers --user=admin -m shell -a '/home/admin/app/start-sdccollectconfig.sh'", returnStdout: true) if (res.contains("Start Fail")){ error("sdc-collect-config服務啟動失敗,本次發布流程終止") } //sh "ansible webservers --user=admin -m shell -a '/home/admin/app/start-sdcruleconfig.sh'" res=sh(script: "ansible webservers --user=admin -m shell -a '/home/admin/app/start-sdcruleconfig.sh'", returnStdout: true) if (res.contains("Start Fail")){ error("sdc-rule-config服務啟動失敗,本次發布流程終止") } //sh "ansible webservers --user=admin -m shell -a '/home/admin/app/start-es.sh'" res=sh(script: "ansible webservers --user=admin -m shell -a '/home/admin/app/start-es.sh'", returnStdout: true) if (res.contains("Start Fail")){ error("es服務啟動失敗,本次發布流程終止") } } } post { success { print("所有應用啟動成功,本次流水線執行成功") } } }
如果其中一條命令執行失敗,后面的指令就會中斷執行
錯誤排查
1. name cannot start with an underscore; name can only contain URL-friendly characters
原因分析:通過cnpm命令安裝模塊時,會同時生成帶下划線的文件(eg: _jquery@3.4.1@jquery),不符合命名規范(根據報錯提示)
1.安裝模塊時用npm,非cnpm
2.先通過npm init初始化目錄,生成包管理文件package.json,再安裝模塊(npm/cnpm)
2.如何指定`package.json`的npm的路徑
cnpm run build:sit -config=/var/lib/jenkins/workspace/netcehui-h52/h5-new/package.json
打包成功發布
npm編譯異常
1.安裝nodejs第三方模塊權限不足,提示創建node_modules下的文件夾權限不足
npm install --unsafe-perm 使用非安全模式提升操作權限
2.安裝nodejs第三方模塊一直處於卡死狀態
使用國內源cnpm
cnpm install --unsafe-perm
cnpm install --registry=https://registry.npm.taobao.org
cnpm install node-sass --unsafe-perm --save-dev
cnpm run build:${PROFILE}
用npm install 和npm run build打包失敗
改成cnpm install 和cnpm run build打包成功
3.npm ERR! Maximum call stack size exceeded