背景
- Windows 平台
- -jar 发布
问题一:windows文件互传
同网络已经有一台windows上搭好的Jenkins环境(78),和目标发布机不是同一台主机(178)。尝试从78的jenkins上用脚本把发布包传到178,可用的方法是FTP、NFS、SMB等,没有linux下scp/ssh等,非常不方便,有类似的winscp/openssh需要再安装配置。最终放弃了还是在178再部署一个jenkins服务。
jenkins admin默认密码在".jenkins\secrets\initialAdminPassword"
问题二:maven配置私有nexus库
- pom.yam
<project>
<repositories>
<!-- 配置nexus远程仓库 -->
<repository>
<id>nexus-releases</id>
<name>Nexus Snapshot Repository</name>
<url>http://192.168.8.106:8081/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<!-- 配置从哪个仓库中下载构件,即jar包 -->
<pluginRepositories>
<pluginRepository>
<id>nexus-releases</id>
<name>Nexus Releases Repository</name>
<url>http://192.168.8.106:8081/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</project>
- maven settings.xml添加权限认证
<servers>
<server>
<id>nexus-releases</id>
<username>admin</username>
<password>admin1234</password>
</server>
<server>
<id>nexus-snapshots</id>
<username>admin</username>
<password>admin1234</password>
</server>
</servers>
注意:pom里repository的\<id>必须和settings中server里的\<id>一致
问题三:Jenkins Bat 脚本
上代码,Jenkins 脚本
:: 备份设置BUILD_ID 号,防止Jenkins杀进程
set OLD_BUILD_ID=%BUILD_ID%
echo %OLD_BUILD_ID%
set BUILD_ID=DONTKILLME
cmd /c "C:\ProgramData\Jenkins\.jenkins\workspace\TV-Sensor-Backend\deploy.cmd"
set BUILD_ID=%OLD_BUILD_ID%
echo %BUILD_ID%
178上的发布脚本deploy.cmd
call:killtask
call:compile && call:backup && call:copyfile && call:run
exit
:compile
D:\apache-maven-3.9.1\bin\mvn -Dmaven.test.skip=true clean package && echo 编译成功
goto:eof
:killtask
taskkill /IM "backendjavaw.exe" /F && echo 结束进程
goto:eof
:backup
E: && cd E:\Yiritech\yiritech-backend && del iotUimc-0.0.7-SNAPSHOT.jar.bak & rename iotUimc-0.0.7-SNAPSHOT.jar iotUimc-0.0.7-SNAPSHOT.jar.bak && echo 备份成功
goto:eof
:copyfile
copy "C:\ProgramData\Jenkins\.jenkins\workspace\TV-Sensor-Backend\target\iotUimc-0.0.7-SNAPSHOT.jar" "E:\Yiritech\yiritech-backend\iotUimc-0.0.7-SNAPSHOT.jar" && echo 拷贝成功
goto:eof
:: 把javaw重命名为backendjavaw
:run
start E:\Yiritech\jdk-11.0.2\bin\backendjavaw.exe -Xms500M -Xmx500M -XX:MaxDirectMemorySize=64M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=E:\Yiritech\yiritech-backend\iotUimcLog\backendOomDump.hprof -XX:+PrintGCDetails -jar iotUimc-0.0.7-SNAPSHOT.jar --spring.config.location=application.yml && echo 更新成功
goto:eof
问题四:Jenkins CRSF 安全限制
因为高版本Jenkins默认开启了CSRF(Cross-site request forgery)跨站请求伪造,导至Git推送报错。Jenkins设置没有关闭选项,需添加 Java 启动参数:
-Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true
问题五:yarn install 报错:The lockfile would have been modified by this install
Jenkins(CI)会改变yarn.lock,需要给矛权限,添加--no-immutable表明不锁定yarn.lock
yarn install --no-immutable
或
set YARN_ENABLE_IMMUTABLE_INSTALLS=false
yarn install
问题六:指定 git 分支,Jenkins的 %BRANCH_NAME% 不能用
前端的打包脚本会检查git分支名,否则会失败,因此需要 git switch 指定分支
由于Jenkins的 %BRANCH_NAME% 不可用,改用 Git Parameter 插件在This project is parameterized配置变量
前端脚本
:: %BRANCH_NAME%是空值
echo %BRANCH_NAME%
echo %branch%
git checkout -f %branch%
:: origin/release/WZSYS.1A.4.0,跳过origin字符
git switch %branch:~7%
echo 开始编译
:: node版本兼容
SET NODE_OPTIONS=--openssl-legacy-provider
set YARN_ENABLE_IMMUTABLE_INSTALLS=false
rmdir /s /q "C:\ProgramData\Jenkins\.jenkins\workspace\WenZhen-Vue\dist" & "C:\Program Files\nodejs\yarn" install && "C:\Program Files\nodejs\yarn" run build && echo 编译成功