Jenkins发布踩坑

背景

  • 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库

  1. 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>
  1. 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 编译成功 

posted @ 2024-01-25 10:39  MangoJuice  阅读(4)  评论(0编辑  收藏  举报