diff --git a/README.md b/README.md index 9d1fb48c..1bccbca5 100644 --- a/README.md +++ b/README.md @@ -107,6 +107,9 @@ You can configure the app by copying `vector/config.sample.json` to valid location on this network. This is used as a hint to the user to indicate when a valid location has been entered so it's not necessary for this to be exactly correct. Optional. +1. `update_base_url` (electron app only): HTTPS URL to a web server to download + updates from. This should be the path to the directory containing `install` + and `update`. Running as a Desktop app ======================== diff --git a/electron/src/electron-main.js b/electron/src/electron-main.js index 3fabd01b..a8bdc7f9 100644 --- a/electron/src/electron-main.js +++ b/electron/src/electron-main.js @@ -99,9 +99,9 @@ function pollForUpdates() { } } -function startAutoUpdate(update_url) { - if (update_url.slice(-1) !== '/') { - update_url = update_url + '/'; +function startAutoUpdate() { + if (process.platform != 'darwin' && process.platform != 'win32') { + return; } try { // Since writing, the electron auto update process has changed from being @@ -111,7 +111,19 @@ function startAutoUpdate(update_url) { // package.json. There is no autoupdate for Linux: it's expected that // the distro will provide it. if (process.platform == 'darwin') { - autoUpdater.setFeedURL(update_base_url + 'update/macos/'); + const update_base_url = vectorConfig.update_base_url; + if (!update_base_url) { + console.log("No update_base_url: disabling auto-update"); + return; + } + if (update_base_url.slice(-1) !== '/') { + update_base_url = update_url + '/'; + } + const update_url = update_base_url + 'update/macos/tmp/'; + console.log("Starting auto update with URL: " + update_url); + autoUpdater.setFeedURL(update_url); + } else { + console.log("Starting auto update with baked-in URL"); } // We check for updates ourselves rather than using 'updater' because we need to // do it in the main process (and we don't really need to check every 10 minutes: @@ -138,12 +150,7 @@ process.on('uncaughtException', function (error) { electron.ipcMain.on('install_update', installUpdate); electron.app.on('ready', () => { - if (vectorConfig.update_url) { - console.log("Starting auto update with URL: " + vectorConfig.update_url); - startAutoUpdate(vectorConfig.update_url); - } else { - console.log("No update_url is defined: auto update is disabled"); - } + startAutoUpdate(); mainWindow = new electron.BrowserWindow({ icon: `${__dirname}/../img/riot.ico`, diff --git a/package.json b/package.json index 0f16ce71..2ffb5773 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "build:compile": "babel --source-maps -d lib src", "build:bundle": "NODE_ENV=production webpack -p --progress", "build:bundle:dev": "webpack --optimize-occurence-order --progress", - "build:electron": "rimraf electron/dist && npm run clean && npm run build && build -wml --ia32 --x64 && scripts/check-electron.sh", + "build:electron": "rimraf electron/dist && npm run clean && npm run build && build -wml --ia32 --x64", "build": "node scripts/babelcheck.js && npm run build:res && npm run build:config && npm run build:emojione && npm run build:css && npm run build:bundle", "build:dev": "node scripts/babelcheck.js && npm run build:res && npm run build:config && npm run build:emojione && npm run build:css && npm run build:bundle:dev", "dist": "scripts/package.sh", diff --git a/scripts/check-electron.sh b/scripts/check-electron.sh deleted file mode 100755 index 82b24a6c..00000000 --- a/scripts/check-electron.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh - -update_url=`jq .update_url webapp/config.json` -echo "***************************************************" -echo -if [ $? = 0 ]; then - echo "Built electron package with update url: $update_url" -else - echo "Built electron package with no update url" - echo "This build will not auto-update." -fi -echo -echo "***************************************************" diff --git a/scripts/electron-dist.sh b/scripts/electron-dist.sh deleted file mode 100755 index 0e8efd56..00000000 --- a/scripts/electron-dist.sh +++ /dev/null @@ -1,54 +0,0 @@ -#!/bin/bash - -set -e -set -x - -if [ $# = 0 ]; then - echo "Usage: $0 " - echo "" - echo "Adds the build in electron/dist/ to a given Riot electron" - echo "download tree. If target directory is empty, create a new" - echo "download tree. This tree can be placed on a web server to" - echo "serve auto-updates (although auto-update for Mac requires" - echo "additional logic)." - exit -fi - -ver=`basename electron/dist/mac/*.dmg | cut -d '-' -f 2 | sed -e 's/\.dmg$//'` -dir=$1 - -echo "Copying files for version $ver to $dir" - -# Install packages: what the user downloads the first time, -# (DMGs for mac, exe installer for windows) -mkdir -p "$dir/install/macos" -cp electron/dist/mac/*.dmg "$dir/install/macos/" -echo "$ver" > "$dir/install/macos/latest" - -mkdir -p "$dir/install/win32/ia32" -cp electron/dist/win-ia32/*.exe "$dir/install/win32/ia32/" - -mkdir -p "$dir/install/win32/x64" -cp electron/dist/win/*.exe "$dir/install/win32/x64/" - - -# Packages for auto-update. It would be nice if squirrel's -# auto update used the installer packages, but it doesn't -# for Reasons. zip for mac, nupkg for windows. -mkdir -p "$dir/update/macos" -cp electron/dist/mac/*.zip "$dir/update/macos/" -echo "$ver" > "$dir/update/macos/latest" - -mkdir -p "$dir/update/win32/ia32" -cp electron/dist/win-ia32/*.nupkg "$dir/update/win32/ia32/" -cat electron/dist/win-ia32/RELEASES >> "$dir/update/win32/ia32/RELEASES" -echo >> "$dir/update/win32/ia32/RELEASES" - -mkdir -p "$dir/update/win32/x64" -cp electron/dist/win/*.nupkg "$dir/update/win32/x64/" -cat electron/dist/win/RELEASES >> "$dir/update/win32/x64/RELEASES" -echo >> "$dir/update/win32/x64/RELEASES" - - -echo "All done!" -echo "$dir can now be copied to your web server." diff --git a/scripts/electron-package.sh b/scripts/electron-package.sh new file mode 100755 index 00000000..8b1ccd4b --- /dev/null +++ b/scripts/electron-package.sh @@ -0,0 +1,133 @@ +#!/bin/bash + +set -e + +usage() { + echo "Usage: $0 -v -c [-n]" + echo + echo "version: commit-ish to check out and build" + echo "config file: a path to a json config file to" + echo "ship with the build. In addition, update_base_url:" + echo "from this file is used to set up auto-update." + echo "-n: build with no config file." + echo + echo "Values may also be passed as environment variables" +} + +conffile= +version= +skipcfg=0 +while getopts "c:v:n" opt; do + case $opt in + c) + conffile=$OPTARG + ;; + v) + version=$OPTARG + ;; + n) + skipcfg=1 + ;; + \?) + echo "Invalid option: -$OPTARG" >&2 + usage + exit + ;; + esac +done + +if [ -z "$version" ]; then + echo "No version supplied" + usage + exit +fi + +if [ -z "$conffile" ] && [ "$skipcfg" = 0 ]; then + echo "No config file given. Use -c to supply a config file or" + echo "-n to build with no config file (and no auto update)." + exit +fi + +if [ -n "$conffile" ]; then + update_base_url=`jq -r .update_base_url $conffile` + + if [ -z "$update_base_url" ]; then + echo "No update URL supplied. Use update_base_url: null if you really" + echo "want a build with no auto-update." + usage + exit + fi + # Make sure the base URL ends in a slash if it doesn't already + update_base_url=`echo $update_base_url | sed -e 's#\([^\/]\)$#\1\/#'` +fi + +if [ ! -f package.json ]; then + echo "No package.json found. This script must be run from" + echo "the vector-web directory." + exit +fi + +echo "Building $version using Update base URL $update_base_url" + +projdir=`pwd` +builddir=`mktemp -d 2>/dev/null || mktemp -d -t 'buildtmp'` +pushd "$builddir" +git clone "$projdir" . +git checkout "$version" + +if [ -n "$conffile" ]; then + popd + cp "$conffile" "$builddir/" + pushd "$builddir" +fi + +if [ "$update_base_url" != "null" ]; then + # Inject a 'publish' configuration into the package.json. This is what + # electron-builder needs for auto-update on windows but we don't want to + # keep it in the package.json as we don't want everyone cloning the source + # and building it for themselves to get our auto-update URL. + update_url=$update_base_url/install/win32/ + jq '.build.publish.provider="generic"' package.json \ + | jq '.build.publish.url="$update_url"' \ + > package.json.tmp + mv package.json.tmp package.json +fi + +npm install +npm run build:electron + +popd + +distdir="$builddir/electron/dist" +pubdir="$projdir/electron/pub" +rm -r "$pubdir" || true +mkdir -p "$pubdir" + +# figure out what version this build is known as +# (since we could be building from a branch or indeed +# any commit-ish, not just a version tag) +vername=`python -c 'import yaml; import sys; print yaml.load(sys.stdin)["version"]' < $builddir/electron/dist/latest.yml` + +# Install packages: what the user downloads the first time, +# (DMGs for mac, exe installer for windows) +mkdir -p "$pubdir/install/macos" +cp $distdir/mac/*.dmg "$pubdir/install/macos/" + +mkdir -p "$pubdir/install/win32/" +cp $distdir/*.exe "$pubdir/install/win32/" +cp $distdir/latest.yml "$pubdir/install/win32/" + +# Packages for auto-update on mac (Windows (NSIS) uses the installer exe) +mkdir -p "$pubdir/update/macos" +cp $distdir/mac/*.zip "$pubdir/update/macos/" +echo "$ver" > "$pubdir/update/macos/latest" + +# Move the debs to the main project dir's dist folder +rm -r "$projdir/electron/dist" || true +mkdir -p "$projdir/electron/dist" +cp $distdir/*.deb "$projdir/electron/dist/" + +rm -rf "$builddir" + +echo "Riot Desktop $vername is ready to go in $pubdir: this directory can be hosted on your web server." +echo "deb archives are in electron/dist/ - these should be added into your debian repository"