PackageEditor.js 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. var fs = require('fs-extra');
  2. var host = require("./Host");
  3. var config = require("./BuildConfig");
  4. namespace('package', function() {
  5. // TODO: Look into if possible to archive on jenkins with different base dir than workspace
  6. var webplayerSrcDir = config.artifactsRoot + "DistGen/Artifacts/AtomicEditor/AtomicEditor.app/Contents/Resources/ToolData/Deployment/Web";
  7. task('windows_editor', {
  8. async: true
  9. }, function() {
  10. var srcDir = config.artifactsRoot + "AtomicEditor/";
  11. var dstDir = config.artifactsRoot + "Dist/";
  12. host.cleanCreateDir(dstDir);
  13. // Copy WebGL CI artifacts into editor package
  14. if (fs.existsSync(webplayerSrcDir)) {
  15. fs.copySync(webplayerSrcDir,
  16. config.artifactsRoot + "/AtomicEditor/Resources/ToolData/Deployment/Web", {clobber : true });
  17. }
  18. var installerName = "AtomicEditor_Windows64_Setup_" + config.buildSHA + ".exe";
  19. var installerPath = config.artifactsRoot + "Dist/" + installerName;
  20. var nsisDefines = "/DATOMIC_ROOT=" + config.atomicRoot;
  21. nsisDefines += " /DEDITOR_VERSION=1";
  22. nsisDefines += " /DINSTALLER_NAME=" + installerName;
  23. var makeNSISCmd = config.atomicRoot + "\\Build\\Scripts\\Windows\\CreateInstaller.bat";
  24. makeNSISCmd += " " + nsisDefines + " " + config.atomicRoot + "/Build/Scripts/Windows/Installer/AtomicEditor.nsi";
  25. var editorExe = dstDir + "/AtomicEditor.exe";
  26. var pfxFile = process.env.ATOMIC_PFX_FILE;
  27. var pfxPW = process.env.ATOMIC_PFX_PW;
  28. var certSubjectName = process.env.ATOMIC_CERT_SUBJECTNAME;
  29. var codesign = false;
  30. if (certSubjectName || (pfxFile && pfxPW)) {
  31. codesign = true;
  32. }
  33. var signBaseCmd = "signtool.exe sign";
  34. if (certSubjectName.indexOf(" ") != -1) {
  35. var original = certSubjectName;
  36. certSubjectName = certSubjectName.split(" ")[0];
  37. console.log("CodeSign: ATOMIC_CERT_SUBJECTNAME: \"" + original + "\" contains a space, changed to " +
  38. certSubjectName + " to avoid jake.exec quote issue on Windows");
  39. }
  40. if (certSubjectName) {
  41. signBaseCmd += " /tr http://timestamp.digicert.com /td sha256 /fd sha256";
  42. signBaseCmd += " /n " + certSubjectName + " ";
  43. } else {
  44. signBaseCmd += " /f " + pfxFile;
  45. signBaseCmd += " /p " + pfxPW;
  46. signBaseCmd += " /t http://timestamp.verisign.com/scripts/timestamp.dll";
  47. signBaseCmd += " /v ";
  48. }
  49. var signEditorCmd = signBaseCmd + config.artifactsRoot + "AtomicEditor/AtomicEditor.exe";
  50. var signInstallerCmd = signBaseCmd + installerPath;
  51. var cmds = [];
  52. if (codesign) {
  53. cmds.push(signEditorCmd);
  54. }
  55. cmds.push(makeNSISCmd);
  56. if (codesign) {
  57. cmds.push(signInstallerCmd);
  58. }
  59. jake.exec(cmds, function() {
  60. complete();
  61. }, {
  62. printStdout: true
  63. });
  64. });
  65. task('mac_editor', {
  66. async: true
  67. }, function() {
  68. var editorAppFolder = config.editorAppFolder;
  69. var srcDir = config.artifactsRoot + "AtomicEditor/";
  70. var dstDir = config.artifactsRoot + "Dist/";
  71. var editorZip = dstDir + "AtomicEditor_MacOSX_" + config.buildSHA + ".zip";
  72. var devIDApp = config.devIDApp;
  73. host.cleanCreateDir(dstDir);
  74. // Copy WebGL CI artifacts into editor package
  75. if (fs.existsSync(webplayerSrcDir)) {
  76. fs.copySync(webplayerSrcDir,
  77. config.artifactsRoot + "/AtomicEditor/AtomicEditor.app/Contents/Resources/ToolData/Deployment/Web", {clobber : true });
  78. }
  79. cmds = [];
  80. if (config.jenkins) {
  81. cmds.push("security unlock-keychain -p \"jenkins\" /Users/jenkins/Library/Keychains/login.keychain ");
  82. }
  83. if (devIDApp) {
  84. cmds.push("codesign --deep --force --verify --verbose --sign \"Developer ID Application: " + devIDApp + "\" " + editorAppFolder);
  85. }
  86. cmds.push("cd " + srcDir + " && zip -r -X " + editorZip +" ./AtomicEditor.app");
  87. jake.exec(cmds, function() {
  88. console.log("Packaged Mac Editor to ", editorZip);
  89. if (!devIDApp) {
  90. console.log("\nDeveloper ID Application not specified, code is not be signed!\n\n");
  91. }
  92. complete();
  93. }, {
  94. printStdout: true,
  95. printStderr: true
  96. });
  97. });
  98. task('linux_editor', {
  99. async: true
  100. }, function() {
  101. var editorAppFolder = config.editorAppFolder;
  102. var srcDir = config.artifactsRoot + "AtomicEditor/";
  103. var dstDir = config.artifactsRoot + "Dist/";
  104. var dstDeb = config.artifactsRoot + "AtomicEditor_LINUX_" + config.buildSHA + ".deb";
  105. host.cleanCreateDir(dstDir); // create new staging directory
  106. fs.removeSync(dstDeb); // remove old one, if there
  107. // copy in the two magic dirs
  108. fs.copySync(config.atomicRoot + "Build/Linux/DEBIAN", dstDir + "DEBIAN");
  109. fs.copySync(config.atomicRoot + "Build/Linux/usr", dstDir + "usr" );
  110. // copy in the atomic dir
  111. fs.copySync(editorAppFolder, dstDir + "usr/share/atomicgameengine" );
  112. //copy in menu pixmap
  113. fs.copySync(config.atomicRoot + "Build/Linux/atomic_menu.xpm", dstDir + "usr/share/atomicgameengine/atomic_menu.xpm" );
  114. //copy in copyright
  115. fs.copySync(config.atomicRoot + "LICENSE.md", dstDir + "usr/share/doc/atomicgameengine/copyright" );
  116. cmds = [];
  117. // go to staging root directory
  118. cmds.push("cd " + config.artifactsRoot + " ;" );
  119. // get rid of some lintian errors
  120. cmds.push("find " + dstDir + "usr/share/atomicgameengine/ -name .gitignore -type f -delete ;");
  121. cmds.push("find " + dstDir + "usr/share/atomicgameengine/ -maxdepth 9 -type f -print0 | xargs -0 chmod oug-x ;");
  122. cmds.push("/bin/chmod oug+x " + dstDir + "usr/share/atomicgameengine/AtomicEditor ;");
  123. cmds.push("/bin/chmod oug+x " + dstDir + "usr/share/atomicgameengine/Resources/ToolData/Deployment/Linux/AtomicPlayer ;" );
  124. cmds.push("/usr/bin/strip --strip-unneeded " + dstDir + "usr/share/atomicgameengine/AtomicEditor ;" );
  125. cmds.push("/usr/bin/strip --strip-unneeded " + dstDir + "usr/share/atomicgameengine/Resources/ToolData/Deployment/Linux/AtomicPlayer ;" );
  126. // create the package
  127. // needs fakeroot for package file ownership issues
  128. cmds.push("/usr/bin/fakeroot /usr/bin/dpkg-deb --build " + dstDir + ";");
  129. // change the deb name, following Atomic standards
  130. cmds.push("/bin/mv " + config.artifactsRoot + "Dist.deb " + dstDeb + " ;");
  131. // clean up the staging area
  132. cmds.push("/bin/rm -rf "+ dstDir + " ;");
  133. jake.exec(cmds, function() {
  134. console.log("Packaged Linux Editor to " + dstDeb );
  135. complete();
  136. }, {
  137. printStdout: true,
  138. printStderr: true
  139. });
  140. });
  141. });