2020-01-13 22:11:56 -05:00
|
|
|
version: 2.1
|
|
|
|
workflows:
|
2020-03-31 19:52:36 -04:00
|
|
|
macos:
|
|
|
|
jobs:
|
|
|
|
- build_for_macos:
|
2020-06-24 18:15:25 -04:00
|
|
|
context: scratch-desktop-and-link
|
2020-01-13 22:11:56 -05:00
|
|
|
windows:
|
|
|
|
jobs:
|
|
|
|
- build_for_windows:
|
2020-06-24 18:15:25 -04:00
|
|
|
context: scratch-desktop-and-link
|
2020-01-13 22:11:56 -05:00
|
|
|
orbs:
|
2020-07-10 17:32:47 -04:00
|
|
|
windows: circleci/windows@2.4.0
|
2020-06-25 18:30:21 -04:00
|
|
|
aliases:
|
2020-07-10 17:45:27 -04:00
|
|
|
# condition to indicate whether or not we should sign this build
|
2020-06-25 18:30:21 -04:00
|
|
|
- &should_sign
|
|
|
|
or:
|
|
|
|
- equal: [ develop, << pipeline.git.branch >> ]
|
|
|
|
- equal: [ main, << pipeline.git.branch >> ]
|
|
|
|
- equal: [ master, << pipeline.git.branch >> ]
|
2020-07-10 17:45:27 -04:00
|
|
|
# clear large environment variables from the "scratch-desktop-and-link" context
|
|
|
|
# this helps when a program (like NPM) encounters errors with a large environment
|
|
|
|
- &clear_context
|
|
|
|
CSC_MACOS: ""
|
|
|
|
MAC_PROVISION_PROFILE: ""
|
|
|
|
SDM_CERT: ""
|
|
|
|
SDM_CERT_CA_BUNDLE: ""
|
|
|
|
SDM_CERT_KEY: ""
|
|
|
|
WIN_CSC_LINK: ""
|
2020-03-31 19:52:36 -04:00
|
|
|
jobs:
|
|
|
|
build_for_macos:
|
|
|
|
macos:
|
|
|
|
xcode: 11.1.0 # last version for which CircleCI uses macOS 10.14.x
|
|
|
|
steps:
|
|
|
|
- checkout
|
2020-06-25 18:58:45 -04:00
|
|
|
- npm_install:
|
|
|
|
npmCacheDir: ~/.npm
|
|
|
|
- run:
|
|
|
|
name: Test
|
|
|
|
command: npm run test
|
2020-06-25 18:30:21 -04:00
|
|
|
- when:
|
|
|
|
condition:
|
|
|
|
*should_sign
|
|
|
|
steps:
|
|
|
|
- run:
|
2020-06-25 19:01:48 -04:00
|
|
|
name: Import CI context
|
2020-06-25 18:30:21 -04:00
|
|
|
command: |
|
|
|
|
set -e
|
|
|
|
function decodeToFile () {
|
|
|
|
if [ -z "$1" ]; then
|
|
|
|
echo "Missing or invalid filename"
|
|
|
|
return 1
|
|
|
|
fi
|
|
|
|
if [ -z "$2" ]; then
|
|
|
|
echo "Missing environment variable contents for file: $1"
|
|
|
|
return 2
|
|
|
|
fi
|
|
|
|
echo "$2" | base64 --decode > "$1"
|
|
|
|
}
|
2020-06-25 19:01:48 -04:00
|
|
|
decodeToFile embedded.provisionprofile "${MAC_PROVISION_PROFILE}"
|
2020-07-10 18:53:59 -04:00
|
|
|
decodeToFile mas-dev.provisionprofile "${MAC_DEV_PROVISION_PROFILE}"
|
2020-06-25 18:30:21 -04:00
|
|
|
decodeToFile code-to-learn-macos.p12 "${CSC_MACOS}"
|
|
|
|
security -v create-keychain -p circleci circleci.keychain
|
|
|
|
security -v default-keychain -s circleci.keychain
|
|
|
|
security -v import code-to-learn-macos.p12 -k circleci.keychain -P "" -T /usr/bin/codesign -T /usr/bin/productbuild
|
|
|
|
security -v unlock-keychain -p circleci circleci.keychain
|
|
|
|
# "set-key-partition-list" prints extensive not-so-useful output and adding "-q" (even multiple times) doesn't suppress it.
|
|
|
|
# The "grep -v" at the end of this line suppresses all of that so any errors or warnings might be more visible.
|
|
|
|
security -v set-key-partition-list -S apple-tool:,apple:,codesign: -s -k circleci circleci.keychain | grep -v '^ 0x'
|
|
|
|
security -v set-keychain-settings -lut 600 circleci.keychain
|
|
|
|
security -v find-identity circleci.keychain
|
|
|
|
rm code-to-learn-macos.p12
|
2020-06-24 18:44:46 -04:00
|
|
|
- restore_cache:
|
|
|
|
name: Restore Homebrew cache
|
|
|
|
key: homebrew-cache-v1
|
|
|
|
- run:
|
|
|
|
name: Work around electron-userland/electron-builder#4964
|
|
|
|
command: |
|
|
|
|
brew install go go-bindata
|
|
|
|
git -C ~ clone https://github.com/develar/app-builder.git
|
|
|
|
git -C ~/app-builder checkout b85740334fec875f5dd8dcd22eb1f729599109db
|
|
|
|
make --directory=~/app-builder build
|
|
|
|
ln -sfv ~/app-builder/dist/app-builder_darwin_amd64/app-builder ./node_modules/app-builder-bin/mac/
|
|
|
|
- save_cache:
|
|
|
|
name: Save Homebrew cache
|
|
|
|
paths:
|
|
|
|
- ~/Library/Caches/Homebrew
|
|
|
|
- /usr/local/Homebrew
|
|
|
|
key: homebrew-cache-v1
|
2020-06-25 19:13:39 -04:00
|
|
|
- build
|
2020-03-31 19:52:36 -04:00
|
|
|
- run:
|
2020-06-29 15:23:22 -04:00
|
|
|
name: Move DMG to artifacts directory
|
2020-03-31 19:52:36 -04:00
|
|
|
command: |
|
|
|
|
mkdir -p Artifacts/
|
2020-06-29 15:23:22 -04:00
|
|
|
mv -v dist/Scratch*.dmg Artifacts/
|
|
|
|
- when:
|
|
|
|
condition:
|
|
|
|
*should_sign
|
|
|
|
steps:
|
2020-07-13 16:14:15 -04:00
|
|
|
- run:
|
|
|
|
name: Zip MAS-Dev to artifacts directory
|
|
|
|
# If you use `zip` for this it will throw away some metadata (resource forks?) and
|
|
|
|
# the app will crash on startup with "EXC_CRASH (Code Signature Invalid)".
|
|
|
|
# To preserve that metadata, use `ditto` instead.
|
|
|
|
# See also: https://stackoverflow.com/a/22370486
|
|
|
|
command: |
|
|
|
|
NPM_APP_VERSION="`node -pe "require('./package.json').version"`"
|
|
|
|
cd dist/mas-dev
|
|
|
|
ditto -v -c -k --sequesterRsrc --keepParent --zlibCompressionLevel 9 \
|
|
|
|
"Scratch Desktop.app" ../../Artifacts/mas-dev-${NPM_APP_VERSION}.zip
|
2020-06-29 15:23:22 -04:00
|
|
|
- run:
|
|
|
|
name: Move PKG to artifacts directory
|
|
|
|
command: |
|
|
|
|
mv -v dist/mas/Scratch*.pkg Artifacts/
|
2020-03-31 19:52:36 -04:00
|
|
|
- store_artifacts:
|
|
|
|
path: Artifacts/
|
|
|
|
build_for_windows:
|
2020-07-10 17:32:47 -04:00
|
|
|
executor: windows/default
|
2020-03-31 19:52:36 -04:00
|
|
|
steps:
|
2020-04-03 18:27:25 -04:00
|
|
|
- run:
|
|
|
|
# work around https://github.com/appveyor/ci/issues/2420 which seems to affect CircleCI too
|
|
|
|
# see also https://circleci.com/docs/2.0/env-vars/#using-parameters-and-bash-environment
|
|
|
|
name: Work around git-sh-setup issue
|
2020-07-10 17:32:47 -04:00
|
|
|
shell: bash
|
2020-04-03 18:27:25 -04:00
|
|
|
command: |
|
|
|
|
echo 'Adding libexec/git-core to PATH...'
|
|
|
|
echo 'For more details see https://github.com/appveyor/ci/issues/2420'
|
|
|
|
echo 'export PATH="$PATH:/c/Program Files/Git/mingw64/libexec/git-core"' >> $BASH_ENV
|
2020-03-31 19:52:36 -04:00
|
|
|
- checkout
|
2020-06-25 18:58:45 -04:00
|
|
|
- npm_install:
|
|
|
|
npmCacheDir: "C:/Users/circleci/AppData/Roaming/npm-cache"
|
|
|
|
- run:
|
|
|
|
name: Test
|
|
|
|
command: npm run test
|
2020-07-10 17:45:27 -04:00
|
|
|
environment: *clear_context
|
2020-06-25 18:30:21 -04:00
|
|
|
- when:
|
|
|
|
condition:
|
2020-06-26 12:26:48 -04:00
|
|
|
*should_sign
|
2020-06-25 18:30:21 -04:00
|
|
|
steps:
|
|
|
|
- run:
|
2020-06-26 12:26:48 -04:00
|
|
|
name: Import CI context
|
|
|
|
shell: bash
|
2020-06-25 18:30:21 -04:00
|
|
|
command: |
|
2020-06-26 12:26:48 -04:00
|
|
|
set -e
|
|
|
|
function decodeToFile () {
|
|
|
|
if [ -z "$1" ]; then
|
|
|
|
echo "Missing or invalid filename"
|
|
|
|
return 1
|
|
|
|
fi
|
|
|
|
if [ -z "$2" ]; then
|
|
|
|
echo "Missing environment variable contents for file: $1"
|
|
|
|
return 2
|
|
|
|
fi
|
|
|
|
echo "$2" | base64 --decode > "$1"
|
2020-06-25 18:30:21 -04:00
|
|
|
}
|
2020-06-26 12:26:48 -04:00
|
|
|
decodeToFile ~/codesign.pfx "${WIN_CSC_LINK}"
|
|
|
|
- run:
|
|
|
|
# In theory this should be unnecessary: the electron-builder documentation says that WIN_CSC_LINK can
|
|
|
|
# be a base64-encoded certificate, which is what's in the CI context. In practice that leads to an
|
|
|
|
# signtool.exe finding the certificate but not the key, for reasons I haven't been able to understand.
|
|
|
|
# Also, because of the non-standard user configuration on CircleCI's Windows VM, attempting to import
|
|
|
|
# a certificate into the user's certificate store ("Cert:/LocalUser/My") will fail. Instead, this code
|
|
|
|
# imports the PFX into the machine certificate store. That usually requires Administrator permissions,
|
|
|
|
# but on CircleCI's setup it works just fine. See also: https://github.com/ShabadOS/desktop/issues/265
|
|
|
|
# and https://github.com/ShabadOS/desktop/pull/266
|
|
|
|
name: Add CSC to machine store
|
|
|
|
shell: powershell
|
|
|
|
command: |
|
|
|
|
$securePassword = (ConvertTo-SecureString -String $env:WIN_CSC_KEY_PASSWORD -AsPlainText -Force)
|
|
|
|
Import-PfxCertificate -FilePath ~/codesign.pfx -Password $securePassword -CertStoreLocation "Cert:/LocalMachine/My"
|
2020-06-25 19:13:39 -04:00
|
|
|
- build
|
2020-01-13 22:11:56 -05:00
|
|
|
- run:
|
2020-03-31 19:52:36 -04:00
|
|
|
name: Move Windows build products to artifacts directory
|
2020-07-10 17:32:47 -04:00
|
|
|
shell: bash
|
2020-01-13 22:11:56 -05:00
|
|
|
command: |
|
|
|
|
mkdir -p Artifacts/
|
|
|
|
mv dist/{Scratch*.appx,Scratch*.exe} Artifacts/
|
|
|
|
- store_artifacts:
|
|
|
|
path: Artifacts/
|
2020-04-03 17:06:28 -04:00
|
|
|
commands:
|
2020-06-24 18:44:46 -04:00
|
|
|
npm_install:
|
|
|
|
description: Run 'npm install' with caching
|
2020-04-03 17:38:06 -04:00
|
|
|
parameters:
|
|
|
|
npmCacheDir:
|
|
|
|
type: string
|
|
|
|
description: NPM cache directory (`npm config cache get`) - usually either ~/.npm or %AppData%/npm-cache
|
2020-04-03 17:06:28 -04:00
|
|
|
steps:
|
|
|
|
- restore_cache:
|
|
|
|
keys:
|
|
|
|
- npm-cache-{{ arch }}-{{ checksum "package-lock.json" }}
|
|
|
|
- run:
|
2020-04-03 17:38:06 -04:00
|
|
|
name: Install node_modules
|
2020-07-10 17:32:47 -04:00
|
|
|
shell: bash # harmless on macOS, required on Windows to work around git-sh-setup issue
|
2020-04-03 17:38:06 -04:00
|
|
|
# --prefer-offline "will make npm skip any conditional requests (304 checks) for stale cache data, and only
|
|
|
|
# hit the network if something is missing from the cache"
|
|
|
|
command: npm ci --prefer-offline
|
2020-07-10 17:45:27 -04:00
|
|
|
environment: *clear_context
|
2020-04-03 17:06:28 -04:00
|
|
|
- save_cache:
|
|
|
|
paths:
|
2020-04-03 17:38:06 -04:00
|
|
|
- << parameters.npmCacheDir >>
|
2020-04-03 17:06:28 -04:00
|
|
|
key: npm-cache-{{ arch }}-{{ checksum "package-lock.json" }}
|
2020-06-25 19:13:39 -04:00
|
|
|
build:
|
|
|
|
steps:
|
|
|
|
- when:
|
|
|
|
condition:
|
|
|
|
*should_sign
|
|
|
|
steps:
|
2020-06-26 12:26:48 -04:00
|
|
|
- run:
|
|
|
|
command: npm run dist
|
2020-07-10 18:53:59 -04:00
|
|
|
no_output_timeout: 30m # macOS notarization can take longer than the default 10 minutes
|
2020-06-26 12:26:48 -04:00
|
|
|
environment:
|
2020-07-10 17:45:27 -04:00
|
|
|
<<: *clear_context
|
|
|
|
WIN_CSC_LINK: ~/codesign.pfx
|
2020-06-25 19:13:39 -04:00
|
|
|
- unless:
|
|
|
|
condition:
|
|
|
|
*should_sign
|
|
|
|
steps:
|
2020-07-10 17:45:27 -04:00
|
|
|
- run:
|
|
|
|
command: npm run distDev
|
|
|
|
environment: *clear_context
|