梳理一下基于jenkins一键打包生成软件exe:
Prerequisite:
将需要用到的文件上传到svn指定位置,以便于随时可以checkout使用。这里把以下文件import到svn的路径:https://192.168.xxx.xxx/svn/APL/trunk/products/system/setup/server
apache-tomcat-6.0.51
jdk1.6.0_43
mysql-5.7.17-win32
Xxxxxx.ico
install.bat
uninstall.bat
platform.iss
vcredist_x64.exe
vcredist2010_x64_XiaZaiBa.exe
也可以把这些文件放到服务器的某个位置,比如D:\setup
1. Createa new job on Jenkins
SVNRepository URL:
https://192.168.1.9/svn/APL/trunk/products/system
Buildcommand:
setup\server\Jenkins_Build.bat
注意事项:
1) 脚本的关键其实是最后一步,调用Inno Setup工具进行封装,但前提是要先在本机安装Inno setup软件,platform.iss/install.bat/uninstall.bat都通过SVN上export。
2) Platform.iss是Inno setup的主运行程序,分析脚本内容如下:
OutputDir=E:\setup\setup
这里,OutputDir是生成的exe软件包的位置,本例中,是我本机的E盘
OutputBaseFilename=mysetup
这里,OutputBaseFilename是生成的exe软件包的名字,本例中,软件包名字为mysetup.exe。
Source:"E:\setup\jdk1.6.0_43\*"; DestDir: "C:\Program Files(x86)\jdk1.6.0_43"; Flags: ignoreversion recursesubdirs createallsubdirs
其中,Source路径是本机存放的需要封装的文件的路径,DestDir路径是封装成exe后再运行时的对象机中的路径,本例中,Source是我本机的E盘,DestDir是192.168.1.9服务器的C盘。
3) 以下五个文件都会放到{app}路径下,本例中是192.168.1.9服务器的C:\ Program Files (x86)\AplIot下。
Source:"E:\setup\install.bat"; DestDir: "{app}"; Flags:ignoreversion
Source:"E:\setup\uninstall.bat"; DestDir: "{app}"; Flags:ignoreversion
Source:"E:\setup\AgriGarden.ico"; DestDir: "{app}"; Flags:ignoreversion
Source:"E:\setup\vcredist_x64.exe"; DestDir: "{app}"; Flags: ignoreversion
Source:"E:\setup\vcredist2010_x64_XiaZaiBa.exe"; DestDir: "{app}";Flags: ignoreversion
4) 这里需要注意的是,vcredist_x64.exe和vcredist2010_x64_XiaZaiBa.exe是可执行文件,通过Platform.iss可以自启动可执行文件,除了在[Files]里增加Source和DestDir之外,还需要在[Run]里添加Filename和路径。
[Files]
Source: "E:\setup\vcredist_x64.exe";DestDir: "{app}"; Flags: ignoreversion
Source:"E:\setup\vcredist2010_x64_XiaZaiBa.exe"; DestDir: "{app}";Flags: ignoreversion
[Run]
Filename:"{app}\vcredist_x64.exe";Description:"正在安装vcredist_x64.exe";
Filename:"{app}\vcredist2010_x64_XiaZaiBa.exe";Description:"正在安装vcredist2010_x64_XiaZaiBa.exe";
5) 在[Run]里会调用启动install.bat,在[UninstallRun]里会调用启动uninstall.bat
[Run]
Filename:"{app}\install.bat";Description:"正在启动或配置相关程序";
[UninstallRun]
Filename:"{app}\uninstall.bat";
2. Verifythe job
Job成功完成后,去Platform.iss脚本里的OutputDir路径下取exe文件,本例中是在E:\setup\setup中会生成mysetup.exe。
在本地的虚拟机中进行验证:
1. 新建虚拟机
2. 控制面板->卸载程序->卸载和VC++Redistributable相关的程序
3. 将本机中的E:\setup\setup\mysetup.exe粘贴到虚拟机桌面,双击运行。
4. 运行成功后,登陆http://localhost:8080/AplIot/webSite-iot/html/login.html (选择Chrome浏览器或者360浏览器)查看AplIot网页是否可以正常运行。
附源码:
; Script generated by the Inno Setup Script Wizard. ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! #define MyAppName "AplIot" #define MyAppVersion "1.0" #define MyAppPublisher "AgriGarden" #define MyAppURL "http://www.agri-garden.com/" #define MyAppExeName "MyProg.exe" [Setup] ; NOTE: The value of AppId uniquely identifies this application. ; Do not use the same AppId value in installers for other applications. ; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) AppId={{FC6B755E-7269-44BD-ADD1-3E641794BDA9} AppName={#MyAppName} AppVersion={#MyAppVersion} ;AppVerName={#MyAppName} {#MyAppVersion} AppPublisher={#MyAppPublisher} AppPublisherURL={#MyAppURL} AppSupportURL={#MyAppURL} AppUpdatesURL={#MyAppURL} DefaultDirName={pf}\{#MyAppName} DisableProgramGroupPage=yes OutputDir=E:\setup\setup OutputBaseFilename=mysetup Compression=lzma SolidCompression=yes SetupIconFile=AgriGarden.ico [Languages] Name: "english"; MessagesFile: "compiler:Default.isl" [Tasks] Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked [Files] Source: "E:\setup\apache-tomcat-6.0.51\*"; DestDir: "C:\Program Files (x86)\apache-tomcat-6.0.51"; Flags: ignoreversion recursesubdirs createallsubdirs Source: "E:\setup\jdk1.6.0_43\*"; DestDir: "C:\Program Files (x86)\jdk1.6.0_43"; Flags: ignoreversion recursesubdirs createallsubdirs Source: "E:\setup\mysql-5.7.17-win32\*"; DestDir: "C:\Program Files (x86)\mysql-5.7.17-win32"; Flags: ignoreversion recursesubdirs createallsubdirs Source: "E:\setup\install.bat"; DestDir: "{app}"; Flags: ignoreversion Source: "E:\setup\uninstall.bat"; DestDir: "{app}"; Flags: ignoreversion ;Source: "D:\setup\项目启动.html"; DestDir: "{app}"; Flags: ignoreversion Source: "E:\setup\AgriGarden.ico"; DestDir: "{app}"; Flags: ignoreversion Source: "E:\setup\vcredist_x64.exe"; DestDir: "{app}"; Flags: ignoreversion Source: "E:\setup\vcredist2010_x64_XiaZaiBa.exe"; DestDir: "{app}"; Flags: ignoreversion ; NOTE: Don't use "Flags: ignoreversion" on any shared system files [Icons] Name: "{commonprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}" Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon [Run] Filename:"{app}\vcredist_x64.exe";Description:"正在安装vcredist_x64.exe"; Filename:"{app}\vcredist2010_x64_XiaZaiBa.exe";Description:"正在安装vcredist2010_x64_XiaZaiBa.exe"; Filename:"{app}\install.bat";Description:"正在启动或配置相关程序"; [UninstallRun] Filename:"{app}\uninstall.bat"; [UninstallDelete] Type:filesandordirs;Name:"C:\Program Files (x86)\apache-tomcat-6.0.51" Type:filesandordirs;Name:"C:\Program Files (x86)\mysql-5.7.17-win32" @echo off title 运维系统正在安装中,请不要手动关闭 color 0a echo compil32 环境变量 set InnoSetup=C:\Program Files (x86)\Inno Setup 5\ echo jdk 环境变量 set jdkpath=C:\Program Files (x86)\jdk1.6.0_43 ::setx variable value -m :: setx 这个是用来设置环境变量的,并且会写入注册表. variable,会被覆盖,此操作不可逆的 :: variable 代表键 value代表值 -m代表写入系统环境变量,如果没有该参数会写入当前用户环境变量. setx JAVA_HOME "%jdkpath%" -m setx CLASSPATH ".:%%JAVA_HOME%%\lib\tools.jar;%%JAVA_HOME%%\lib\dt.jar" -m ::追加path环境变量 find 后面/i代表忽略大小写 &&执行成功执行的命令 ||执行失败执行的命令 echo %Path%|find /i "%JAVA_HOME%" && set IsNull=true || set IsNull=false echo %IsNull% if not %IsNull%==true ( reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path /t REG_SZ /d "%Path%;%%JAVA_HOME%%\bin;%%JAVA_HOME%%\jre\bin" /f ::设置当前用户环境变量 setx Path "%%JAVA_HOME%%\bin;%Path%;%InnoSetup%" ) echo mysql 环境变量 set mysqlpath=C:\Program Files (x86)\mysql-5.7.17-win32 ::setx variable value -m :: setx 这个是用来设置环境变量的,并且会写入注册表. variable,会被覆盖,此操作不可逆的 :: variable 代表键 value代表值 -m代表写入系统环境变量,如果没有该参数会写入当前用户环境变量. setx MYSQL_HOME "%mysqlpath%" -m ::追加path环境变量 find 后面/i代表忽略大小写 &&执行成功执行的命令 ||执行失败执行的命令 echo %Path%|find /i "%MYSQL_HOME%" && set IsNull=true || set IsNull=false echo %IsNull% if not %IsNull%==true ( reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path /t REG_SZ /d "%Path%;%%MYSQL_HOME%%\bin" /f ::设置当前用户环境变量 setx Path "%%JAVA_HOME%%\bin;%%MYSQL_HOME%%\bin;%Path%" ) echo tomcat 环境变量 reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v CATALINA_HOME /t REG_EXPAND_SZ /d "C:\Program Files (x86)\apache-tomcat-6.0.51" /f echo mysql 环境变量 reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v MYSQL_HOME /t REG_EXPAND_SZ /d "C:\Program Files (x86)\mysql-5.7.17-win32" /f ::echo 安装vcredist_x64.exe ::start /wait .\vcredist_x64.exe /verysilent sp- ::echo 安装vcredist2010_x64_XiaZaiBa.exe ::start /wait .\vcredist2010_x64_XiaZaiBa.exe /verysilent sp- echo 启动mysql并更新密码 "C:\Program Files (x86)\mysql-5.7.17-win32\bin\mysqld.exe" --install net start mysql ::设置mysql服务自启动 sc config mysql start=auto "C:\Program Files (x86)\mysql-5.7.17-win32\bin\mysql.exe" -u root -e "update mysql.user set authentication_string=password('root') where user='root' and Host = 'localhost'; " net stop mysql net start mysql echo mysql启动完毕 echo 启动tomcat set JAVA_HOME=C:\Program Files (x86)\jdk1.6.0_43 set CATALINA_HOME=C:\Program Files (x86)\apache-tomcat-6.0.51 set CATALINA_BASE=C:\Program Files (x86)\apache-tomcat-6.0.51 cd /d C:\Program Files (x86)\apache-tomcat-6.0.51\bin ::安装tomcat到服务中 call service.bat install tomcat ::设置tomcat服务自启动 sc config tomcat start=auto net start tomcat exit @echo off title abc系统正在卸载中,请不要手动关闭 color 0a echo 删除环境变量 reg delete "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v JAVA_HOME /f reg delete "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v CATALINA_HOME /f reg delete "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v MYSQL_HOME /f reg delete "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v CLASSPATH /f setx Path "" echo 停止并删除tomcat net stop tomcat cd C:\Program Files (x86)\tomcat6\bin cd ..\..\ call service.bat remove sc delete tomcat echo 停止并删除mysql net stop mysql sc delete mysql exit @echo off ::创建文件夹APL用来打包 md APL cd projects/server/AplIot :: compile svn code echo start compiling java source code ... javac -encoding UTF-8 -classpath .;WebRoot\WEB-INF\lib\* src\com\zhyd\apliot\common\*.java src\com\zhyd\apliot\controller\*.java src\com\zhyd\apliot\dao\*.java src\com\zhyd\apliot\dao\impl\*.java src\com\zhyd\apliot\filter\*.java src\com\zhyd\apliot\listener\*.java src\com\zhyd\apliot\modbus\dao\*.java src\com\zhyd\apliot\modbus\dao\impl\*.java src\com\zhyd\apliot\modbus\model\*.java src\com\zhyd\apliot\model\*.java src\com\zhyd\apliot\server\dao\*.java src\com\zhyd\apliot\server\dao\impl\*.java src\com\zhyd\apliot\task\*.java src\com\zhyd\apliot\test\*.java src\com\zhyd\apliot\util\*.java src\com\zhyd\apliot\xml\dao\*.java src\com\zhyd\apliot\xml\dao\impl\*.java -d WebRoot\WEB-INF\classes :: 生成AplIot.war cd WebRoot jar -cvf AplIot.war .\* @echo off echo 当前CMD默认目录: