diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 34b38e1cae5..b8fc6139420 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -85,7 +85,7 @@ jobs: docker run -v $(Build.SourcesDirectory):/src -v /tmp/local/.cache:/.cache -v /tmp/local/.yarn:/.yarn -v /tmp/local/.node-gyp:/.node-gyp -v /tmp/local/.local:/.local -w /src - shiftkey/desktop:snapcraft-node-yarn sh -c "yarn run package" + shiftkey/desktop:packaging-node-yarn sh -c "yarn run package" displayName: 'Package in Container' - task: CopyFiles@2 inputs: @@ -93,7 +93,6 @@ jobs: dist/*.AppImage dist/*.deb dist/*.rpm - dist/*.snap dist/*.txt targetFolder: $(Build.ArtifactStagingDirectory) flattenFolders: true diff --git a/package.json b/package.json index 13cda7e3756..d9ab054811b 100644 --- a/package.json +++ b/package.json @@ -177,6 +177,7 @@ "electron-winstaller": "4.0.0" }, "optionalDependencies": { - "electron-installer-debian": "3.0.0" + "electron-installer-debian": "3.0.0", + "electron-installer-redhat": "3.0.0" } } diff --git a/script/electron-builder-linux.yml b/script/electron-builder-linux.yml index 13c6eacff7a..96e2de74ad2 100644 --- a/script/electron-builder-linux.yml +++ b/script/electron-builder-linux.yml @@ -7,7 +7,6 @@ linux: - x-scheme-handler/x-github-client - x-scheme-handler/x-github-desktop-auth target: - - rpm - AppImage maintainer: 'GitHub, Inc ' rpm: diff --git a/script/package-electron-builder.ts b/script/package-electron-builder.ts index daba1973377..7b26f48b2b5 100644 --- a/script/package-electron-builder.ts +++ b/script/package-electron-builder.ts @@ -40,7 +40,7 @@ export async function packageElectronBuilder(): Promise> { const appImageInstaller = `${distRoot}/GitHubDesktop-linux-*.AppImage` - let files = await globPromise(appImageInstaller) + const files = await globPromise(appImageInstaller) if (files.length !== 1) { return Promise.reject( `Expected one AppImage installer but instead found '${files.join( @@ -51,18 +51,5 @@ export async function packageElectronBuilder(): Promise> { const appImageInstallerPath = files[0] - const rpmInstaller = `${distRoot}/GitHubDesktop-linux-*.rpm` - - files = await globPromise(rpmInstaller) - if (files.length !== 1) { - return Promise.reject( - `Expected one RPM installer but instead found '${files.join( - ', ' - )}' - exiting...` - ) - } - - const rpmInstallerPath = files[0] - - return Promise.resolve([appImageInstallerPath, rpmInstallerPath]) + return Promise.resolve([appImageInstallerPath]) } diff --git a/script/package-redhat.ts b/script/package-redhat.ts new file mode 100644 index 00000000000..4903be3811d --- /dev/null +++ b/script/package-redhat.ts @@ -0,0 +1,102 @@ +import { promisify } from 'util' +import { join } from 'path' + +import glob = require('glob') +const globPromise = promisify(glob) + +import { rename } from 'fs-extra' + +import { getVersion } from '../app/package-info' +import { getDistPath, getDistRoot } from './dist-info' + +const distRoot = getDistRoot() + +// best guess based on documentation +type RedhatOptions = { + // required + src: string + dest: string + arch: 'x86_64' + // optional + description?: string + productDescription?: string + categories?: Array + icon?: any + scripts?: { + pre?: string + post?: string + preun?: string + postun?: string + } + homepage?: string + mimeType?: Array + requires?: Array +} + +const options: RedhatOptions = { + src: getDistPath(), + dest: distRoot, + arch: 'x86_64', + description: 'Simple collaboration from your desktop', + productDescription: + 'This is the unofficial port of GitHub Desktop for Linux distributions', + categories: ['GNOME', 'GTK', 'Development'], + requires: [ + // default Electron dependencies + 'libXScrnSaver', + 'libappindicator', + 'libX11-xcb', + 'alsa-lib', + // dugite-native dependencies + 'libcurl', + // keytar dependencies + 'libsecret', + 'gnome-keyring', + ], + icon: { + '256x256': 'app/static/logos/256x256.png', + '512x512': 'app/static/logos/512x512.png', + '1024x1024': 'app/static/logos/1024x1024.png', + }, + scripts: { + post: 'script/resources/rpm/post.sh', + preun: 'script/resources/rpm/preun.sh', + }, + homepage: 'https://github.com/shiftkey/desktop', + mimeType: [ + 'x-scheme-handler/x-github-client', + 'x-scheme-handler/x-github-desktop-auth', + // workaround for handling OAuth flow until we figure out what we're doing + // with the development OAuth details + // + // see https://github.com/shiftkey/desktop/issues/72 for more details + 'x-scheme-handler/x-github-desktop-dev-auth', + ], +} + +export async function packageRedhat(): Promise { + if (process.platform === 'win32') { + return Promise.reject('Windows is not supported') + } + + const installer = require('electron-installer-redhat') + + await installer(options) + const installersPath = `${distRoot}/github-desktop*.rpm` + + const files = await globPromise(installersPath) + + if (files.length !== 1) { + return Promise.reject( + `Expected one file but instead found '${files.join(', ')}' - exiting...` + ) + } + + const oldPath = files[0] + + const newFileName = `GitHubDesktop-linux-${getVersion()}.rpm` + const newPath = join(distRoot, newFileName) + await rename(oldPath, newPath) + + return Promise.resolve(newPath) +} diff --git a/script/package.ts b/script/package.ts index b7ed5c283d7..18f7e448885 100644 --- a/script/package.ts +++ b/script/package.ts @@ -22,6 +22,7 @@ import { isAppveyor, isGitHubActions } from './build-platforms' import { packageElectronBuilder } from './package-electron-builder' import { packageDebian } from './package-debian' +import { packageRedhat } from './package-redhat' const distPath = getDistPath() const productName = getProductName() @@ -178,16 +179,21 @@ async function packageLinux() { console.log('Updating file mode for chrome-sandbox…') fs.chmodSync(helperPath, 0o4755) } + try { + const files = await packageElectronBuilder() + const debianPackage = await packageDebian() + const redhatPackage = await packageRedhat() - const files = await packageElectronBuilder() - const debianPackage = await packageDebian() + const installers = [...files, debianPackage, redhatPackage] - const installers = [...files, debianPackage] + console.log(`Installers created:`) + for (const installer of installers) { + console.log(` - ${installer}`) + } - console.log(`Installers created:`) - for (const installer of installers) { - console.log(` - ${installer}`) + generateChecksums(installers) + } catch (err) { + console.error('A problem occurred with the packaging step', err) + process.exit(1) } - - generateChecksums(installers) } diff --git a/script/resources/rpm/post.sh b/script/resources/rpm/post.sh new file mode 100755 index 00000000000..092c75b9d26 --- /dev/null +++ b/script/resources/rpm/post.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +INSTALL_DIR="/usr/lib/github-desktop" +CLI_DIR="$INSTALL_DIR/resources/app/static" + +# add executable permissions for CLI interface +chmod +x "$CLI_DIR"/github || : + +# create symbolic links to /usr/bin directory +ln -f -s "$CLI_DIR"/github /usr/bin || : + +exit 0 diff --git a/script/resources/rpm/preun.sh b/script/resources/rpm/preun.sh new file mode 100755 index 00000000000..fdb0a748a34 --- /dev/null +++ b/script/resources/rpm/preun.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +BASE_FILE="/usr/bin/github" + +# remove symbolic links in /usr/bin directory +test -f ${BASE_FILE} && unlink ${BASE_FILE} + +exit 0 diff --git a/yarn.lock b/yarn.lock index 989d15e23fd..307044d744c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3653,6 +3653,18 @@ electron-installer-debian@3.0.0: word-wrap "^1.2.3" yargs "^15.0.1" +electron-installer-redhat@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/electron-installer-redhat/-/electron-installer-redhat-3.0.0.tgz#0a066eb9f9b3e691d58c2b41eea1055e8d5ffa92" + integrity sha512-BtYh174AOIGq0iDges4/fihqJYw8WsWXRKuRpKvUlkqrwfeGMWqln28+kKV5IW6GPfHjRFeCO5dcMUioUDBo1A== + dependencies: + debug "^4.1.1" + electron-installer-common "^0.10.0" + fs-extra "^8.1.0" + lodash "^4.17.15" + word-wrap "^1.2.3" + yargs "^15.1.0" + electron-notarize@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/electron-notarize/-/electron-notarize-0.1.1.tgz#c3563d70c5e7b3315f44e8495b30050a8c408b91" @@ -11840,7 +11852,7 @@ yargs@^15.0.1: y18n "^4.0.0" yargs-parser "^18.1.1" -yargs@^15.3.1: +yargs@^15.1.0, yargs@^15.3.1: version "15.4.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==