Merge branch 'ci' into 'master'
This commit is contained in:
		
						commit
						f489f2064c
					
				
							
								
								
									
										192
									
								
								.gitlab-ci.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										192
									
								
								.gitlab-ci.yml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,192 @@
 | 
			
		||||
stages:
 | 
			
		||||
  - build
 | 
			
		||||
  - deploy
 | 
			
		||||
  - publish
 | 
			
		||||
 | 
			
		||||
cache:
 | 
			
		||||
  key: ${CI_COMMIT_REF_SLUG}
 | 
			
		||||
  paths:
 | 
			
		||||
    - lib/
 | 
			
		||||
 | 
			
		||||
before_script:
 | 
			
		||||
  - echo Current working directory is $(pwd)
 | 
			
		||||
 | 
			
		||||
build linux x86_64:
 | 
			
		||||
  image: ubuntu
 | 
			
		||||
  stage: build
 | 
			
		||||
  tags:
 | 
			
		||||
    - docker
 | 
			
		||||
    - linux
 | 
			
		||||
  script:
 | 
			
		||||
    # Install dependencies
 | 
			
		||||
    - apt-get update
 | 
			
		||||
    - >
 | 
			
		||||
      apt-get install --no-install-recommends -y qt5-default qtmultimedia5-dev
 | 
			
		||||
      clang make git sudo curl ca-certificates pkg-config upx unzip
 | 
			
		||||
 | 
			
		||||
    # Print versions
 | 
			
		||||
    - qmake --version
 | 
			
		||||
    - clang --version
 | 
			
		||||
 | 
			
		||||
    # Extract BASS
 | 
			
		||||
    - mkdir bass
 | 
			
		||||
    - cd bass
 | 
			
		||||
    - curl http://www.un4seen.com/files/bass24-linux.zip -o bass.zip
 | 
			
		||||
    - unzip bass.zip
 | 
			
		||||
    - cp x64/libbass.so ../lib
 | 
			
		||||
    - curl http://www.un4seen.com/files/bassopus24-linux.zip -o bassopus.zip
 | 
			
		||||
    - unzip bassopus.zip
 | 
			
		||||
    - cp x64/libbassopus.so ../lib
 | 
			
		||||
    - cd ..
 | 
			
		||||
 | 
			
		||||
    # Extract Discord RPC
 | 
			
		||||
    - mkdir discord-rpc
 | 
			
		||||
    - cd discord-rpc
 | 
			
		||||
    - curl -L https://github.com/discordapp/discord-rpc/releases/download/v3.4.0/discord-rpc-linux.zip -o discord_rpc_linux.zip
 | 
			
		||||
    - unzip discord_rpc_linux.zip
 | 
			
		||||
    - cp discord-rpc/linux-dynamic/lib/libdiscord-rpc.so ../lib
 | 
			
		||||
    - cd ..
 | 
			
		||||
 | 
			
		||||
    # Extract QtApng
 | 
			
		||||
    - mkdir qtapng
 | 
			
		||||
    - cd qtapng
 | 
			
		||||
    - curl -L https://github.com/Skycoder42/QtApng/releases/download/1.1.0-5/build_gcc_64_5.12.0.tar.xz -o apng.tar.xz
 | 
			
		||||
    - tar -xvf apng.tar.xz
 | 
			
		||||
    - cp gcc_64/plugins/imageformats/libqapng.so ../lib
 | 
			
		||||
    - cd ..
 | 
			
		||||
 | 
			
		||||
    # Build
 | 
			
		||||
    - qmake -spec linux-clang
 | 
			
		||||
    - make -j4
 | 
			
		||||
 | 
			
		||||
    # Post-processing
 | 
			
		||||
    - upx --lzma -9 --force bin/Attorney_Online
 | 
			
		||||
  artifacts:
 | 
			
		||||
    paths:
 | 
			
		||||
      - bin/
 | 
			
		||||
 | 
			
		||||
build windows i686:
 | 
			
		||||
  image: ${CI_REGISTRY_IMAGE}/builder-windows-i686
 | 
			
		||||
  stage: build
 | 
			
		||||
  tags:
 | 
			
		||||
    - docker
 | 
			
		||||
    - linux
 | 
			
		||||
  script:
 | 
			
		||||
    # Extract BASS
 | 
			
		||||
    - mkdir bass
 | 
			
		||||
    - cd bass
 | 
			
		||||
    - curl http://www.un4seen.com/files/bass24.zip -o bass.zip
 | 
			
		||||
    - unzip bass.zip
 | 
			
		||||
    - cp bass.dll ../lib
 | 
			
		||||
    - curl http://www.un4seen.com/files/bassopus24.zip -o bassopus.zip
 | 
			
		||||
    - unzip bassopus.zip
 | 
			
		||||
    - cp bassopus.dll ../lib
 | 
			
		||||
    - cd ..
 | 
			
		||||
 | 
			
		||||
    # Build
 | 
			
		||||
    - /opt/mxe/usr/${TARGET_SPEC}/qt5/bin/qmake
 | 
			
		||||
    - make -j4
 | 
			
		||||
 | 
			
		||||
    # Post-processing
 | 
			
		||||
    - upx --lzma -9 --force bin/Attorney_Online.exe
 | 
			
		||||
  artifacts:
 | 
			
		||||
    paths:
 | 
			
		||||
      - bin/
 | 
			
		||||
 | 
			
		||||
# Base folder
 | 
			
		||||
.deploy_base: &deploy_base |
 | 
			
		||||
    mkdir base
 | 
			
		||||
    mkdir base/themes
 | 
			
		||||
    cp -a ../base/themes/default base/themes/
 | 
			
		||||
    cp -a ../base/config.ini base/config.sample.ini
 | 
			
		||||
    cp -a ../base/serverlist.txt base/serverlist.sample.txt
 | 
			
		||||
 | 
			
		||||
# Miscellaneous files
 | 
			
		||||
.deploy_misc: &deploy_misc |
 | 
			
		||||
    cp -a ../README.md README.md.txt
 | 
			
		||||
    cp -a ../LICENSE.MIT LICENSE.txt
 | 
			
		||||
 | 
			
		||||
deploy linux x86_64:
 | 
			
		||||
  stage: deploy
 | 
			
		||||
  dependencies:
 | 
			
		||||
    - build linux x86_64
 | 
			
		||||
  tags:
 | 
			
		||||
    - docker
 | 
			
		||||
    - linux
 | 
			
		||||
  script:
 | 
			
		||||
    - mkdir artifact
 | 
			
		||||
    - cd artifact
 | 
			
		||||
    - *deploy_base
 | 
			
		||||
    - *deploy_misc
 | 
			
		||||
 | 
			
		||||
    # Platform-specific
 | 
			
		||||
    - cp -a ../lib/*.so .
 | 
			
		||||
    - cp -a ../bin/Attorney_Online .
 | 
			
		||||
    - echo "#!/bin/sh" >> ./run.sh
 | 
			
		||||
    - echo "LD_LIBRARY_PATH=.:\$LD_LIBRARY_PATH ./Attorney_Online" >> ./run.sh
 | 
			
		||||
    - chmod +x ./run.sh
 | 
			
		||||
 | 
			
		||||
    # Zipping
 | 
			
		||||
    # zip -r -9 -l Attorney_Online_$(git describe --tags)_linux_x86_64.zip .
 | 
			
		||||
    - mkdir ../zip
 | 
			
		||||
    - tar cavf ../zip/Attorney_Online_$(git describe --tags)_linux_x64.tar.xz *
 | 
			
		||||
    - sha1sum ../zip/*
 | 
			
		||||
  artifacts:
 | 
			
		||||
    paths:
 | 
			
		||||
      - zip/
 | 
			
		||||
 | 
			
		||||
deploy windows i686:
 | 
			
		||||
  image: ubuntu
 | 
			
		||||
  stage: deploy
 | 
			
		||||
  dependencies:
 | 
			
		||||
    - build windows i686
 | 
			
		||||
  tags:
 | 
			
		||||
    - docker
 | 
			
		||||
    - linux
 | 
			
		||||
  script:
 | 
			
		||||
    - apt-get update
 | 
			
		||||
    - apt-get install --no-install-recommends -y zip git
 | 
			
		||||
 | 
			
		||||
    - mkdir artifact
 | 
			
		||||
    - cd artifact
 | 
			
		||||
    - *deploy_base
 | 
			
		||||
    - *deploy_misc
 | 
			
		||||
 | 
			
		||||
    # Platform-specific
 | 
			
		||||
    - cp -a ../lib/*.dll .
 | 
			
		||||
    - cp -a ../bin/Attorney_Online.exe .
 | 
			
		||||
 | 
			
		||||
    # Zipping
 | 
			
		||||
    # -r: recursive; -9: max compression; -l: convert to CR LF
 | 
			
		||||
    - mkdir ../zip
 | 
			
		||||
    - zip -r -9 -l ../zip/Attorney_Online_$(git describe --tags)_windows_x86.zip .
 | 
			
		||||
    - sha1sum ../zip/*
 | 
			
		||||
  artifacts:
 | 
			
		||||
    paths:
 | 
			
		||||
      - zip/
 | 
			
		||||
 | 
			
		||||
publish linux x86_64:
 | 
			
		||||
  image: ubuntu
 | 
			
		||||
  stage: publish
 | 
			
		||||
  dependencies:
 | 
			
		||||
    - deploy linux x86_64
 | 
			
		||||
  when: manual
 | 
			
		||||
  script:
 | 
			
		||||
    - cd zip
 | 
			
		||||
    - ../scripts/wasabi.sh
 | 
			
		||||
  variables:
 | 
			
		||||
    MANIFEST: program_linux_x86_64.json
 | 
			
		||||
    ARTIFACT_SUFFIX: _linux_x64.tar.xz
 | 
			
		||||
 | 
			
		||||
publish windows i686:
 | 
			
		||||
  image: ubuntu
 | 
			
		||||
  stage: publish
 | 
			
		||||
  dependencies:
 | 
			
		||||
    - deploy windows i686
 | 
			
		||||
  when: manual
 | 
			
		||||
  script:
 | 
			
		||||
    - cd zip
 | 
			
		||||
    - ../scripts/wasabi.sh
 | 
			
		||||
  variables:
 | 
			
		||||
    MANIFEST: program_winnt_i386.json
 | 
			
		||||
    ARTIFACT_SUFFIX: _windows_x86.zip
 | 
			
		||||
							
								
								
									
										11
									
								
								.travis.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								.travis.yml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,11 @@
 | 
			
		||||
language: cpp
 | 
			
		||||
os: osx
 | 
			
		||||
 | 
			
		||||
addons:
 | 
			
		||||
    homebrew:
 | 
			
		||||
        packages:
 | 
			
		||||
            - qt5
 | 
			
		||||
 | 
			
		||||
script:
 | 
			
		||||
    - ./scripts/macos_build.sh
 | 
			
		||||
    - ./scripts/macos_post_build.sh
 | 
			
		||||
@ -13,6 +13,7 @@ MOC_DIR = $$PWD/build
 | 
			
		||||
SOURCES += $$files($$PWD/src/*.cpp)
 | 
			
		||||
HEADERS += $$files($$PWD/include/*.h)
 | 
			
		||||
LIBS += -L$$PWD/lib -lbass -ldiscord-rpc
 | 
			
		||||
macx:LIBS += -framework CoreFoundation -framework Foundation -framework CoreServices
 | 
			
		||||
 | 
			
		||||
CONFIG += c++14
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -94,9 +94,9 @@ public:
 | 
			
		||||
 | 
			
		||||
  //////////////////versioning///////////////
 | 
			
		||||
 | 
			
		||||
  constexpr int get_release() const { return RELEASE; }
 | 
			
		||||
  constexpr int get_major_version() const { return MAJOR_VERSION; }
 | 
			
		||||
  constexpr int get_minor_version() const { return MINOR_VERSION; }
 | 
			
		||||
  int get_release() const { return RELEASE; }
 | 
			
		||||
  int get_major_version() const { return MAJOR_VERSION; }
 | 
			
		||||
  int get_minor_version() const { return MINOR_VERSION; }
 | 
			
		||||
  QString get_version_string();
 | 
			
		||||
 | 
			
		||||
  ///////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										6
									
								
								scripts/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								scripts/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,6 @@
 | 
			
		||||
node_modules/
 | 
			
		||||
 | 
			
		||||
# Cursed file
 | 
			
		||||
package-lock.json
 | 
			
		||||
 | 
			
		||||
s3_keys.sh
 | 
			
		||||
							
								
								
									
										33
									
								
								scripts/macos_build.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										33
									
								
								scripts/macos_build.sh
									
									
									
									
									
										Executable file
									
								
							@ -0,0 +1,33 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
 | 
			
		||||
set -Eexo pipefail
 | 
			
		||||
 | 
			
		||||
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig:/usr/local/opt/openssl/lib/pkgconfig
 | 
			
		||||
export PATH=$PATH:/usr/local/opt/qt5/bin:/usr/local/bin
 | 
			
		||||
 | 
			
		||||
mkdir bass
 | 
			
		||||
cd bass
 | 
			
		||||
curl http://www.un4seen.com/files/bass24-osx.zip -o bass.zip
 | 
			
		||||
unzip bass.zip
 | 
			
		||||
cp libbass.dylib ../lib
 | 
			
		||||
 | 
			
		||||
curl http://www.un4seen.com/files/bassopus24-osx.zip -o bassopus.zip
 | 
			
		||||
unzip bassopus.zip
 | 
			
		||||
cp libbassopus.dylib ../lib
 | 
			
		||||
cd ..
 | 
			
		||||
 | 
			
		||||
mkdir discord-rpc
 | 
			
		||||
cd discord-rpc
 | 
			
		||||
curl -L https://github.com/discordapp/discord-rpc/releases/download/v3.4.0/discord-rpc-osx.zip -o discord_rpc_osx.zip
 | 
			
		||||
unzip discord_rpc_osx.zip
 | 
			
		||||
cp discord-rpc/osx-static/lib/libdiscord-rpc.a ../lib
 | 
			
		||||
cd ..
 | 
			
		||||
 | 
			
		||||
mkdir qtapng
 | 
			
		||||
cd qtapng
 | 
			
		||||
curl -L https://github.com/Skycoder42/QtApng/releases/download/1.1.0-5/build_clang_64_5.12.0.tar.xz -o apng.tar.xz
 | 
			
		||||
tar -xvf apng.tar.xz
 | 
			
		||||
cp clang_64/plugins/imageformats/libqapng.dylib ../lib
 | 
			
		||||
cd ..
 | 
			
		||||
 | 
			
		||||
qmake && make -j2
 | 
			
		||||
							
								
								
									
										22
									
								
								scripts/macos_post_build.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								scripts/macos_post_build.sh
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,22 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
 | 
			
		||||
# This script prepares the compiled bundle for shipping as a standalone release
 | 
			
		||||
# Assumes the Qt bin folder is in PATH
 | 
			
		||||
# Should be used on a "Release" build from QT creator
 | 
			
		||||
# Note that this DOES NOT add the base/ folder
 | 
			
		||||
 | 
			
		||||
# Exit on errors and unset variables
 | 
			
		||||
set -eu
 | 
			
		||||
 | 
			
		||||
ROOT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )/"
 | 
			
		||||
 | 
			
		||||
cd ${ROOT_DIR}
 | 
			
		||||
 | 
			
		||||
# This thing basically does all the work
 | 
			
		||||
macdeployqt ../bin/Attorney_Online.app
 | 
			
		||||
 | 
			
		||||
# Need to add the dependencies
 | 
			
		||||
cp ../lib/* ../bin/Attorney_Online.app/Contents/Frameworks
 | 
			
		||||
 | 
			
		||||
# libbass has a funny path for some reason, just use rpath
 | 
			
		||||
install_name_tool -change @loader_path/libbass.dylib @rpath/libbass.dylib ../bin/Attorney_Online.app/Contents/MacOS/Attorney_Online
 | 
			
		||||
							
								
								
									
										9
									
								
								scripts/package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								scripts/package.json
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,9 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "ao-ci-scripts",
 | 
			
		||||
  "version": "1.0.0",
 | 
			
		||||
  "main": "update_manifest.js",
 | 
			
		||||
  "dependencies": {
 | 
			
		||||
    "argparse": "^1.0.10"
 | 
			
		||||
  },
 | 
			
		||||
  "license": "ISC"
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										151
									
								
								scripts/update_manifest.js
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										151
									
								
								scripts/update_manifest.js
									
									
									
									
									
										Executable file
									
								
							@ -0,0 +1,151 @@
 | 
			
		||||
#!/usr/bin/env node
 | 
			
		||||
 | 
			
		||||
const fs = require("fs");
 | 
			
		||||
const crypto = require("crypto");
 | 
			
		||||
const path = require("path");
 | 
			
		||||
const ArgumentParser = require("argparse").ArgumentParser;
 | 
			
		||||
 | 
			
		||||
function isFile(file) {
 | 
			
		||||
    if (!fs.existsSync(file)) {
 | 
			
		||||
        console.error(`File '${file}' not found. Try again.`);
 | 
			
		||||
        throw Error();
 | 
			
		||||
    }
 | 
			
		||||
    return file;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const argParser = new ArgumentParser({
 | 
			
		||||
    addHelp: true,
 | 
			
		||||
    description: "Adds a new latest version to the manifest file based on the " +
 | 
			
		||||
        "provided zip file, including an incremental update."
 | 
			
		||||
});
 | 
			
		||||
argParser.addArgument("manifestFile", {
 | 
			
		||||
    metavar: "<manifest file>", type: isFile
 | 
			
		||||
});
 | 
			
		||||
argParser.addArgument("version", {
 | 
			
		||||
    metavar: "<version>"
 | 
			
		||||
});
 | 
			
		||||
argParser.addArgument([ "-f", "--full" ], {
 | 
			
		||||
    metavar: "<full zip file>", type: isFile, nargs: 1,
 | 
			
		||||
    dest: "fullZipFileArgs"
 | 
			
		||||
});
 | 
			
		||||
argParser.addArgument([ "-i", "--incremental" ], {
 | 
			
		||||
    type: isFile, nargs: 2, dest: "incrementalArgs",
 | 
			
		||||
    metavar: ["<incremental zip file>", "<file containing list of changed files>"]
 | 
			
		||||
});
 | 
			
		||||
argParser.addArgument([ "-e", "--executable" ], {
 | 
			
		||||
    metavar: "[executable file]", nargs: 1,
 | 
			
		||||
    dest: "executableArgs"
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
const {
 | 
			
		||||
    manifestFile,
 | 
			
		||||
    version,
 | 
			
		||||
    fullZipFileArgs,
 | 
			
		||||
    incrementalArgs,
 | 
			
		||||
    executableArgs
 | 
			
		||||
} = argParser.parseArgs();
 | 
			
		||||
 | 
			
		||||
const [incrementalZipFile, changesFile] = incrementalArgs || [];
 | 
			
		||||
const [fullZipFile] = fullZipFileArgs || [];
 | 
			
		||||
const [executable] = executableArgs || [];
 | 
			
		||||
 | 
			
		||||
// Do one final check
 | 
			
		||||
if (!incrementalZipFile && !fullZipFile) {
 | 
			
		||||
    console.error("No download archive specified! Abort.");
 | 
			
		||||
    process.exit(1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Do a quick litmus test to prevent deleting everything incorrectly
 | 
			
		||||
if (changesFile && !fs.existsSync("base")) {
 | 
			
		||||
    console.error("The working directory must be set to an " +
 | 
			
		||||
                  "asset folder in order for deleted directories " +
 | 
			
		||||
                  "to be calculated correctly. Abort.");
 | 
			
		||||
    process.exit(1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const manifest = JSON.parse(fs.readFileSync(manifestFile));
 | 
			
		||||
 | 
			
		||||
const dirsDeleted = new Set();
 | 
			
		||||
const specialActions = changesFile ?
 | 
			
		||||
    fs.readFileSync(changesFile)
 | 
			
		||||
    .toString()
 | 
			
		||||
    .trim()
 | 
			
		||||
    .split("\n")
 | 
			
		||||
    .map(line => line.split("\t"))
 | 
			
		||||
    .map(([mode, target, source]) => {
 | 
			
		||||
        switch (mode[0]) {
 | 
			
		||||
            case "D": // Deleted
 | 
			
		||||
                // Check if the folder exists relative to the working
 | 
			
		||||
                // directory, and if not, add it to the dirsDeleted list.
 | 
			
		||||
                // Keep going up the tree to see how many directories were
 | 
			
		||||
                // deleted.
 | 
			
		||||
                let dir = path.dirname(target);
 | 
			
		||||
                while (!dirsDeleted.has(dir) && !fs.existsSync(dir)) {
 | 
			
		||||
                    dirsDeleted.add(dir);
 | 
			
		||||
                    dir = path.dirname(dir);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                return { action: "delete", target };
 | 
			
		||||
            case "R": // Renamed
 | 
			
		||||
                // NOTE: Make sure that the launcher's implementation of
 | 
			
		||||
                // the move action also creates directories when needed.
 | 
			
		||||
                return { action: "move", source, target};
 | 
			
		||||
            default:
 | 
			
		||||
                return null;
 | 
			
		||||
        }
 | 
			
		||||
    })
 | 
			
		||||
    // Remove ignored file mode changes
 | 
			
		||||
    .filter(action => action !== null)
 | 
			
		||||
    // Create actions based on directories to be deleted.
 | 
			
		||||
    // Always have deeper directories first, to guarantee that deleting
 | 
			
		||||
    // higher-level directories will succeed.
 | 
			
		||||
    .concat(Array.from(dirsDeleted.values())
 | 
			
		||||
        .sort((a, b) => b.split("/").length - a.split("/").length)
 | 
			
		||||
        .map(dir => {
 | 
			
		||||
            return { action: "deleteDir", target: dir };
 | 
			
		||||
        }))
 | 
			
		||||
    : [];
 | 
			
		||||
 | 
			
		||||
const urlBase = "https://s3.wasabisys.com/ao-downloads/";
 | 
			
		||||
 | 
			
		||||
const versionEntry = {
 | 
			
		||||
    version,
 | 
			
		||||
    executable,
 | 
			
		||||
    prev: manifest.versions[0] ? manifest.versions[0].version : undefined,
 | 
			
		||||
    full: fullZipFile ? [
 | 
			
		||||
        {
 | 
			
		||||
            action: "dl",
 | 
			
		||||
            url: urlBase + encodeURIComponent(path.basename(fullZipFile)),
 | 
			
		||||
            hash: crypto.createHash("sha1")
 | 
			
		||||
                .update(fs.readFileSync(fullZipFile))
 | 
			
		||||
                .digest("hex")
 | 
			
		||||
        }
 | 
			
		||||
    ] : undefined,
 | 
			
		||||
    update: incrementalArgs ? [
 | 
			
		||||
        ...specialActions,
 | 
			
		||||
        {
 | 
			
		||||
            action: "dl",
 | 
			
		||||
            url: urlBase + encodeURIComponent(path.basename(incrementalZipFile)),
 | 
			
		||||
            hash: crypto.createHash("sha1")
 | 
			
		||||
                .update(fs.readFileSync(incrementalZipFile))
 | 
			
		||||
                .digest("hex")
 | 
			
		||||
        }
 | 
			
		||||
    ] : undefined
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
console.log("Generated version entry:", versionEntry);
 | 
			
		||||
 | 
			
		||||
const existingVersions = manifest.versions.filter(v => v.version == version);
 | 
			
		||||
if (existingVersions.length > 0) {
 | 
			
		||||
    console.warn(`Warning: version ${version} already exists. Adding new values.`);
 | 
			
		||||
 | 
			
		||||
    // Don't overwrite prev - it will cause headaches
 | 
			
		||||
    delete versionEntry.prev;
 | 
			
		||||
 | 
			
		||||
    Object.assign(existingVersions[0], versionEntry);
 | 
			
		||||
    console.log("Merged version entry:", existingVersions[0]);
 | 
			
		||||
} else {
 | 
			
		||||
    manifest.versions = [versionEntry, ...manifest.versions];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fs.writeFileSync(manifestFile, JSON.stringify(manifest, null, 4));
 | 
			
		||||
							
								
								
									
										39
									
								
								scripts/update_program_manifest.js
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										39
									
								
								scripts/update_program_manifest.js
									
									
									
									
									
										Executable file
									
								
							@ -0,0 +1,39 @@
 | 
			
		||||
#!/usr/bin/env node
 | 
			
		||||
 | 
			
		||||
const fs = require("fs");
 | 
			
		||||
const crypto = require("crypto");
 | 
			
		||||
 | 
			
		||||
const [ _nodeExe, _jsPath, manifestFile, version, zipFile ] = process.argv;
 | 
			
		||||
 | 
			
		||||
if (!manifestFile || !version || !zipFile) {
 | 
			
		||||
    console.log(`Usage: update_program_manifest <manifest file> <version> <zip file>`);
 | 
			
		||||
    console.log(`Adds a new latest version to the manifest file based on the ` +
 | 
			
		||||
                `provided zip file.`);
 | 
			
		||||
    process.exit(1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
if (!fs.existsSync(manifestFile)) {
 | 
			
		||||
    console.error(`Manifest file '${manifestFile}' not found. Try again.`);
 | 
			
		||||
    process.exit(2);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
if (!fs.existsSync(zipFile)) {
 | 
			
		||||
    console.error(`Zip file '${zipFile}' not found. Try again.`);
 | 
			
		||||
    process.exit(2);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const manifest = JSON.parse(fs.readFileSync(manifestFile));
 | 
			
		||||
 | 
			
		||||
manifest.versions = [{
 | 
			
		||||
    version,
 | 
			
		||||
    executable: "Attorney_Online.exe",
 | 
			
		||||
    full: [
 | 
			
		||||
        {
 | 
			
		||||
            action: "dl",
 | 
			
		||||
            url: "https://s3.wasabisys.com/ao-downloads/" + encodeURIComponent(zipFile),
 | 
			
		||||
            hash: crypto.createHash("sha1").update(fs.readFileSync(zipFile)).digest("hex")
 | 
			
		||||
        }
 | 
			
		||||
    ]
 | 
			
		||||
}, ...manifest.versions];
 | 
			
		||||
 | 
			
		||||
fs.writeFileSync(manifestFile, JSON.stringify(manifest, null, 4));
 | 
			
		||||
							
								
								
									
										73
									
								
								scripts/wasabi.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										73
									
								
								scripts/wasabi.sh
									
									
									
									
									
										Executable file
									
								
							@ -0,0 +1,73 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
# Updates the specified program manifest to a new archive and version
 | 
			
		||||
# and uploads the new archive and manifest to S3/Wasabi.
 | 
			
		||||
#
 | 
			
		||||
# Requires:
 | 
			
		||||
#   MANIFEST: name of the manifest file
 | 
			
		||||
#   S3_ACCESS_KEY, S3_SECRET_KEY: S3 credentials
 | 
			
		||||
#   S3_MANIFESTS, S3_ARCHIVES: S3 paths to manifests and downloads
 | 
			
		||||
#   ARCHIVE_FULL: name of the full archive (if desired)
 | 
			
		||||
#   ARCHIVE_INCR: name of the incremental archive (if desired)
 | 
			
		||||
#   VERSION: name of the new version
 | 
			
		||||
#   EXECUTABLE: name of the executable (if program manifest)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# -E: inherit ERR trap by shell functions
 | 
			
		||||
# -e: stop script on ERR trap
 | 
			
		||||
# -u: stop script on unbound variables
 | 
			
		||||
# -x: print command before running it
 | 
			
		||||
# -o pipefail: fail if any command in a pipeline fails
 | 
			
		||||
set -Eeuxo pipefail
 | 
			
		||||
 | 
			
		||||
aws configure set aws_access_key_id ${S3_ACCESS_KEY}
 | 
			
		||||
aws configure set aws_secret_access_key ${S3_SECRET_KEY}
 | 
			
		||||
aws configure set default.region us-east-1
 | 
			
		||||
 | 
			
		||||
export S3_COPY="aws s3 cp --endpoint-url=https://s3.wasabisys.com"
 | 
			
		||||
 | 
			
		||||
export ARCHIVE_FULL_ARG=""
 | 
			
		||||
export ARCHIVE_INCR_ARG=""
 | 
			
		||||
export EXECUTABLE_ARG=""
 | 
			
		||||
 | 
			
		||||
export LAST_TAGGED_VERSION=$(git rev-list --tags --skip=1 --max-count=1)
 | 
			
		||||
echo "Previous tagged version: ${LAST_TAGGED_VERSION}"
 | 
			
		||||
echo "Current tagged version: ${VERSION}"
 | 
			
		||||
 | 
			
		||||
if [[ -n $ARCHIVE_INCR && -n $LAST_TAGGED_VERSION ]]; then
 | 
			
		||||
    echo "Incremental archive: ${ARCHIVE_INCR}"
 | 
			
		||||
 | 
			
		||||
    # Get all files
 | 
			
		||||
    export CHANGES_FILE="changes.txt"
 | 
			
		||||
    git diff --name-status ${LAST_TAGGED_VERSION}..HEAD > ${CHANGES_FILE}
 | 
			
		||||
 | 
			
		||||
    # Get added/modified files
 | 
			
		||||
    git diff --name-only --diff-filter=dr ${LAST_TAGGED_VERSION}..HEAD | \
 | 
			
		||||
        zip ${ARCHIVE_INCR} -@
 | 
			
		||||
 | 
			
		||||
    export ARCHIVE_INCR_ARG="-i ${ARCHIVE_INCR} ${CHANGES_FILE}"
 | 
			
		||||
elif [[ -n $ARCHIVE_INCR && -z $LAST_TAGGED_VERSION ]]; then
 | 
			
		||||
    echo "Incremental archive was requested, but there is no previous version"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [[ -n $ARCHIVE_FULL ]]; then
 | 
			
		||||
    echo "Full archive: ${ARCHIVE_INCR}"
 | 
			
		||||
    export ARCHIVE_FULL_ARG="-f ${ARCHIVE_FULL}"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [[ -v EXECUTABLE ]]; then
 | 
			
		||||
    export EXECUTABLE_ARG="-e ${EXECUTABLE}"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
${S3_COPY} ${S3_MANIFESTS}/${MANIFEST} .
 | 
			
		||||
node $(dirname $0)/update_manifest.js ${MANIFEST} ${VERSION} \
 | 
			
		||||
    ${ARCHIVE_FULL_ARG} ${ARCHIVE_INCR_ARG} ${EXECUTABLE_ARG}
 | 
			
		||||
 | 
			
		||||
if [[ -n $ARCHIVE_INCR_ARG ]]; then
 | 
			
		||||
    ${S3_COPY} ${ARCHIVE_INCR} ${S3_ARCHIVES}
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [[ -n $ARCHIVE_FULL_ARG ]]; then
 | 
			
		||||
    ${S3_COPY} ${ARCHIVE_FULL} ${S3_ARCHIVES}
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
${S3_COPY} ${MANIFEST} ${S3_MANIFESTS}
 | 
			
		||||
							
								
								
									
										35
									
								
								scripts/wasabi_program.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										35
									
								
								scripts/wasabi_program.sh
									
									
									
									
									
										Executable file
									
								
							@ -0,0 +1,35 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
# Updates the specified program manifest to a new archive and version
 | 
			
		||||
# and uploads the new archive and manifest to S3/Wasabi.
 | 
			
		||||
#
 | 
			
		||||
# Requires:
 | 
			
		||||
#   MANIFEST: name of the manifest file
 | 
			
		||||
#   ARTIFACT_SUFFIX: suffix of the archive to be uploaded (including extension)
 | 
			
		||||
#   S3_ACCESS_KEY and S3_SECRET_KEY
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# -E: inherit ERR trap by shell functions
 | 
			
		||||
# -e: stop script on ERR trap
 | 
			
		||||
# -u: stop script on unbound variables
 | 
			
		||||
# -x: print command before running it
 | 
			
		||||
# -o pipefail: fail if any command in a pipeline fails
 | 
			
		||||
set -Eeuxo pipefail
 | 
			
		||||
 | 
			
		||||
aws configure set aws_access_key_id ${S3_ACCESS_KEY}
 | 
			
		||||
aws configure set aws_secret_access_key ${S3_SECRET_KEY}
 | 
			
		||||
aws configure set default.region us-east-1
 | 
			
		||||
 | 
			
		||||
export S3_COPY="aws s3 cp --endpoint-url=https://s3.wasabisys.com"
 | 
			
		||||
export S3_MANIFESTS="s3://ao-manifests"
 | 
			
		||||
export S3_ARCHIVES="s3://ao-downloads"
 | 
			
		||||
 | 
			
		||||
export VERSION=$(git describe --tags)
 | 
			
		||||
export ARCHIVE="Attorney_Online_${VERSION}_${ARTIFACT_SUFFIX}"
 | 
			
		||||
 | 
			
		||||
${S3_COPY} ${S3_MANIFESTS}/${MANIFEST} .
 | 
			
		||||
node $(dirname $0)/update_manifest.js ${MANIFEST} ${VERSION} \
 | 
			
		||||
    -f ${ARCHIVE} -e Attorney_Online.exe
 | 
			
		||||
${S3_COPY} ${ARCHIVE} ${S3_ARCHIVES}
 | 
			
		||||
${S3_COPY} ${MANIFEST} ${S3_MANIFESTS}
 | 
			
		||||
 | 
			
		||||
rm -f ${MANIFEST}
 | 
			
		||||
							
								
								
									
										17
									
								
								scripts/windows/Dockerfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								scripts/windows/Dockerfile
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,17 @@
 | 
			
		||||
FROM oldmud0/mxe-qt:5.12.1-win32-static-posix
 | 
			
		||||
#FROM fffaraz/qt:windows
 | 
			
		||||
 | 
			
		||||
ENV TARGET_SPEC i686-w64-mingw32.static.posix
 | 
			
		||||
 | 
			
		||||
# Build Discord RPC statically
 | 
			
		||||
RUN git clone https://github.com/discordapp/discord-rpc
 | 
			
		||||
WORKDIR discord-rpc/build
 | 
			
		||||
RUN /opt/mxe/usr/bin/${TARGET_SPEC}-cmake .. -DCMAKE_INSTALL_PREFIX=/opt/mxe/usr/${TARGET_SPEC}
 | 
			
		||||
RUN /opt/mxe/usr/bin/${TARGET_SPEC}-cmake --build . --config Release --target install
 | 
			
		||||
WORKDIR ../..
 | 
			
		||||
 | 
			
		||||
# Build QtApng statically
 | 
			
		||||
RUN git clone https://github.com/Skycoder42/QtApng
 | 
			
		||||
WORKDIR QtApng
 | 
			
		||||
RUN /opt/mxe/usr/${TARGET_SPEC}/qt5/bin/qmake && make qmake_all && make && make install
 | 
			
		||||
WORKDIR ..
 | 
			
		||||
							
								
								
									
										44
									
								
								scripts/windows/Dockerfile-mxe
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								scripts/windows/Dockerfile-mxe
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,44 @@
 | 
			
		||||
FROM ubuntu:18.04
 | 
			
		||||
 | 
			
		||||
RUN apt-get update
 | 
			
		||||
RUN apt-get install -y \
 | 
			
		||||
    autoconf \
 | 
			
		||||
    automake \
 | 
			
		||||
    autopoint \
 | 
			
		||||
    bash \
 | 
			
		||||
    bison \
 | 
			
		||||
    bzip2 \
 | 
			
		||||
    flex \
 | 
			
		||||
    g++ \
 | 
			
		||||
    g++-multilib \
 | 
			
		||||
    gettext \
 | 
			
		||||
    git \
 | 
			
		||||
    gperf \
 | 
			
		||||
    intltool \
 | 
			
		||||
    libc6-dev-i386 \
 | 
			
		||||
    libgdk-pixbuf2.0-dev \
 | 
			
		||||
    libltdl-dev \
 | 
			
		||||
    libssl-dev \
 | 
			
		||||
    libtool-bin \
 | 
			
		||||
    libxml-parser-perl \
 | 
			
		||||
    lzip \
 | 
			
		||||
    make \
 | 
			
		||||
    openssl \
 | 
			
		||||
    p7zip-full \
 | 
			
		||||
    patch \
 | 
			
		||||
    perl \
 | 
			
		||||
    pkg-config \
 | 
			
		||||
    python \
 | 
			
		||||
    ruby \
 | 
			
		||||
    sed \
 | 
			
		||||
    unzip \
 | 
			
		||||
    wget \
 | 
			
		||||
    xz-utils
 | 
			
		||||
 | 
			
		||||
RUN git clone https://github.com/mxe/mxe.git
 | 
			
		||||
RUN mv mxe /opt/mxe
 | 
			
		||||
WORKDIR /opt/mxe
 | 
			
		||||
RUN make -j4 MXE_TARGETS="i686-w64-mingw32.static.posix" qtbase qtmultimedia
 | 
			
		||||
ENV PATH=/opt/mxe/usr/bin:$PATH
 | 
			
		||||
 | 
			
		||||
WORKDIR /
 | 
			
		||||
							
								
								
									
										19
									
								
								scripts/windows/how-to-push.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								scripts/windows/how-to-push.md
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,19 @@
 | 
			
		||||
When you want to build a new version of Qt:
 | 
			
		||||
```docker
 | 
			
		||||
docker build -t mxe-windows-static . -f Dockerfile-mxe
 | 
			
		||||
docker tag mxe-windows-static oldmud0/mxe-qt:5.12.1-win32-static-posix
 | 
			
		||||
docker push oldmud0/mxe-qt:5.12.1-win32-static-posix
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Remember to log into Docker Hub before attempting to push.
 | 
			
		||||
 | 
			
		||||
When you want to build a new version of any dependency required for building AO:
 | 
			
		||||
```docker
 | 
			
		||||
docker build -t mxe-windows-static-ao . -f Dockerfile
 | 
			
		||||
docker tag mxe-windows-static-ao registry.gitlab.com/attorneyonline/ao2-client/builder-windows-i686
 | 
			
		||||
docker push registry.gitlab.com/attorneyonline/ao2-client/builder-windows-i686
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Remember to create an access token in GitLab before attempting to push.
 | 
			
		||||
 | 
			
		||||
GitLab CI depends on `builder-windows-i686` image to be present in the repository's registry in order for the Windows build to succeed. 
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user