Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions build/azure-pipelines/alpine/product-build-alpine.yml
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,7 @@ jobs:
ARCHIVE_PATH="$(Build.ArtifactStagingDirectory)/out/server/vscode-server-$TARGET.tar.gz"
DIR_PATH="$(realpath ../vscode-server-$TARGET)"
mkdir -p $(dirname $ARCHIVE_PATH)
tar --owner=0 --group=0 -czf $ARCHIVE_PATH -C .. vscode-server-$TARGET
build/azure-pipelines/common/reproducible-tar.sh "$ARCHIVE_PATH" -C .. vscode-server-$TARGET
echo "##vso[task.setvariable variable=SERVER_DIR_PATH]$DIR_PATH"
echo "##vso[task.setvariable variable=SERVER_PATH]$ARCHIVE_PATH"
env:
Expand All @@ -213,7 +213,7 @@ jobs:
ARCHIVE_PATH="$(Build.ArtifactStagingDirectory)/out/web/vscode-server-$TARGET-web.tar.gz"
DIR_PATH="$(realpath ../vscode-server-$TARGET-web)"
mkdir -p $(dirname $ARCHIVE_PATH)
tar --owner=0 --group=0 -czf $ARCHIVE_PATH -C .. vscode-server-$TARGET-web
build/azure-pipelines/common/reproducible-tar.sh "$ARCHIVE_PATH" -C .. vscode-server-$TARGET-web
echo "##vso[task.setvariable variable=WEB_DIR_PATH]$DIR_PATH"
echo "##vso[task.setvariable variable=WEB_PATH]$ARCHIVE_PATH"
env:
Expand Down
37 changes: 37 additions & 0 deletions build/azure-pipelines/common/reproducible-tar.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
#!/usr/bin/env bash
#---------------------------------------------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See License.txt in the project root for license information.
#---------------------------------------------------------------------------------------------
#
# Create a reproducible .tar.gz archive.
#
# All file mtimes, ownership and entry ordering are normalized; the gzip
# wrapper carries no embedded timestamp or filename. The committer time of
# HEAD is used as the canonical modification time (override via SOURCE_DATE_EPOCH).
#
# Usage: reproducible-tar.sh <archive.tar.gz> [tar args...]
# e.g. reproducible-tar.sh out/server.tar.gz -C .. vscode-server-linux-x64

set -e

if [ "$#" -lt 1 ]; then
echo "Usage: $0 <archive.tar.gz> [tar args...]" >&2
exit 1
fi

ARCHIVE_PATH="$1"
shift

# Exported so gzip (called by tar -z) honors it for its header mtime as well.
# Requires gzip >= 1.10 (2018); CI build images are well past that.
export SOURCE_DATE_EPOCH="${SOURCE_DATE_EPOCH:-$(git log -1 --pretty=%ct)}"

exec tar \
--sort=name \
--mtime="@$SOURCE_DATE_EPOCH" \
--owner=0 \
--group=0 \
--numeric-owner \
-czf "$ARCHIVE_PATH" \
"$@"
54 changes: 54 additions & 0 deletions build/azure-pipelines/common/reproducible-zip.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
#---------------------------------------------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See License.txt in the project root for license information.
#---------------------------------------------------------------------------------------------
#
# Create a reproducible .zip archive using 7-Zip on Windows.
#
# Pre-stamps every file under -TouchDir with the committer time of HEAD
# (override via $env:SOURCE_DATE_EPOCH) so that 7-Zip embeds deterministic
# timestamps in both the DOS time and the NTFS extra field.
#
# Usage:
# reproducible-zip.ps1 <archive.zip> <touch-dir> <7z source args...>
#
# Trailing args are passed verbatim to `7z.exe a -tzip <archive>`.
#
# Note: 7-Zip's DOS-time conversion uses Win32 APIs that follow the system
# time zone (TZ env var is ignored). Azure Pipelines Microsoft-hosted Windows
# agents are UTC by default, which is what this assumes.

[CmdletBinding()]
param(
[Parameter(Mandatory = $true, Position = 0)]
[string] $ArchivePath,

[Parameter(Mandatory = $true, Position = 1)]
[string] $TouchDir,

[Parameter(ValueFromRemainingArguments = $true)]
[string[]] $ZipArgs
)

$ErrorActionPreference = 'Stop'

if (-not $env:SOURCE_DATE_EPOCH) {
$env:SOURCE_DATE_EPOCH = (& git log -1 --pretty=%ct).Trim()
}
$sourceDate = [DateTimeOffset]::FromUnixTimeSeconds([int64] $env:SOURCE_DATE_EPOCH).UtcDateTime

function Set-Timestamps($item) {
try {
$item.LastWriteTimeUtc = $sourceDate
$item.CreationTimeUtc = $sourceDate
$item.LastAccessTimeUtc = $sourceDate
} catch {
# Skip entries we cannot stamp (locked files, reparse points, etc.)
}
}

Set-Timestamps (Get-Item -LiteralPath $TouchDir -Force)
Get-ChildItem -LiteralPath $TouchDir -Recurse -Force | ForEach-Object { Set-Timestamps $_ }

& 7z.exe a -tzip $ArchivePath @ZipArgs
exit $LASTEXITCODE
74 changes: 74 additions & 0 deletions build/azure-pipelines/common/reproducible-zip.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
#!/usr/bin/env bash
#---------------------------------------------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See License.txt in the project root for license information.
#---------------------------------------------------------------------------------------------
#
# Create a reproducible .zip archive.
#
# Pre-touches every entry with the committer time of HEAD (override via
# SOURCE_DATE_EPOCH) and feeds a byte-sorted file list to zip so the archive
# is deterministic. The `-X` flag strips per-entry extra attributes (uid/gid,
# extended attributes); `-y` preserves symlinks as symlinks.
#
# Usage: reproducible-zip.sh <archive.zip> <cwd> <pattern>
#
# The script `cd`s into <cwd> and then runs `find <pattern> -print` to build
# the entry list. <pattern> is shell-expanded by the caller's shell, so:
# - pass '*' (unquoted by the caller) to include top-level entries flat,
# producing entries like 'Visual Studio Code.app/Contents/...'
# (matches the old `cd src && zip -Xry archive *` darwin-client pattern)
# - pass a literal directory name to include that directory and its
# subtree, producing entries like 'vscode-server-darwin-x64/bin/...'
# (matches the old `cd .. && zip -Xry archive name` darwin-server pattern)

set -e

# BSD `date -r`, `touch -t` and Info-ZIP `zip` all read TZ via localtime();
# force UTC so the DOS time written into the zip central directory does not
# depend on the build agent's timezone.
export TZ=UTC0

if [ "$#" -lt 3 ]; then
echo "Usage: $0 <archive.zip> <cwd> <pattern>" >&2
exit 1
fi

ARCHIVE_PATH="$1"
CWD="$2"
shift 2

# Resolve to an absolute path so the subshell `cd` below does not break it.
case "$ARCHIVE_PATH" in
/*) ;;
*) ARCHIVE_PATH="$(pwd)/$ARCHIVE_PATH" ;;
esac

SOURCE_DATE_EPOCH="${SOURCE_DATE_EPOCH:-$(git log -1 --pretty=%ct)}"
TOUCH_DATE=$(date -r "$SOURCE_DATE_EPOCH" "+%Y%m%d%H%M.%S")

(
cd "$CWD"
# Re-expand globs now that we are in <cwd>. Callers pass patterns quoted
# (e.g. '*') so they survive the outer shell unscathed; here we eval them
# into an array so e.g. 'Visual Studio Code.app' is one element, not three.
patterns=()
for arg in "$@"; do
eval "matches=( $arg )"
patterns+=( "${matches[@]}" )
done
if [ "${#patterns[@]}" -eq 0 ]; then
echo "Error: no entries matched in $CWD" >&2
exit 1
fi
# Verify each top-level entry actually exists (catches unmatched literal
# globs that fell through to the literal pattern, e.g. '*' with no match).
for entry in "${patterns[@]}"; do
if [ ! -e "$entry" ] && [ ! -L "$entry" ]; then
echo "Error: '$entry' does not exist in $CWD" >&2
exit 1
fi
done
find "${patterns[@]}" -exec touch -h -t "$TOUCH_DATE" {} +
find "${patterns[@]}" -print | LC_ALL=C sort | zip -X -y "$ARCHIVE_PATH" -@
)
Comment on lines +50 to +74
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,8 @@ jobs:
- script: |
set -e
mkdir -p $(Pipeline.Workspace)/vscode_client_darwin_$(VSCODE_ARCH)_archive
pushd $(agent.builddirectory)/VSCode-darwin-$(VSCODE_ARCH) && zip -r -X -y $(Pipeline.Workspace)/vscode_client_darwin_$(VSCODE_ARCH)_archive/VSCode-darwin-$(VSCODE_ARCH).zip * && popd
ARCHIVE_PATH="$(Pipeline.Workspace)/vscode_client_darwin_$(VSCODE_ARCH)_archive/VSCode-darwin-$(VSCODE_ARCH).zip"
build/azure-pipelines/common/reproducible-zip.sh "$ARCHIVE_PATH" "$(agent.builddirectory)/VSCode-darwin-$(VSCODE_ARCH)" '*'
displayName: Archive build

- task: UseDotNet@2
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,7 @@ steps:
set -e
ARCHIVE_PATH="$(Pipeline.Workspace)/unsigned_vscode_client_darwin_$(VSCODE_ARCH)_archive/VSCode-darwin-$(VSCODE_ARCH).zip"
mkdir -p $(dirname $ARCHIVE_PATH)
(cd ../VSCode-darwin-$(VSCODE_ARCH) && zip -Xry $ARCHIVE_PATH *)
build/azure-pipelines/common/reproducible-zip.sh "$ARCHIVE_PATH" "../VSCode-darwin-$(VSCODE_ARCH)" '*'
echo "##vso[task.setvariable variable=CLIENT_PATH]$ARCHIVE_PATH"
condition: eq(variables['BUILT_CLIENT'], 'true')
displayName: Package client
Expand Down Expand Up @@ -280,7 +280,7 @@ steps:
set -e
ARCHIVE_PATH="$(Pipeline.Workspace)/vscode_client_darwin_$(VSCODE_ARCH)_archive/VSCode-darwin-$(VSCODE_ARCH).zip"
mkdir -p $(dirname $ARCHIVE_PATH)
(cd ../VSCode-darwin-$(VSCODE_ARCH) && zip -Xry $ARCHIVE_PATH *)
build/azure-pipelines/common/reproducible-zip.sh "$ARCHIVE_PATH" "../VSCode-darwin-$(VSCODE_ARCH)" '*'
echo "##vso[task.setvariable variable=CLIENT_PATH]$ARCHIVE_PATH"
condition: eq(variables['BUILT_CLIENT'], 'true')
displayName: Re-package client after entitlement
Expand All @@ -289,15 +289,15 @@ steps:
set -e
ARCHIVE_PATH=".build/darwin/server/vscode-server-darwin-$(VSCODE_ARCH).zip"
mkdir -p $(dirname $ARCHIVE_PATH)
(cd .. && zip -Xry $(Build.SourcesDirectory)/$ARCHIVE_PATH vscode-server-darwin-$(VSCODE_ARCH))
build/azure-pipelines/common/reproducible-zip.sh "$(Build.SourcesDirectory)/$ARCHIVE_PATH" ".." "vscode-server-darwin-$(VSCODE_ARCH)"
echo "##vso[task.setvariable variable=SERVER_PATH]$ARCHIVE_PATH"
displayName: Package server

- script: |
set -e
ARCHIVE_PATH=".build/darwin/server/vscode-server-darwin-$(VSCODE_ARCH)-web.zip"
mkdir -p $(dirname $ARCHIVE_PATH)
(cd .. && zip -Xry $(Build.SourcesDirectory)/$ARCHIVE_PATH vscode-server-darwin-$(VSCODE_ARCH)-web)
build/azure-pipelines/common/reproducible-zip.sh "$(Build.SourcesDirectory)/$ARCHIVE_PATH" ".." "vscode-server-darwin-$(VSCODE_ARCH)-web"
echo "##vso[task.setvariable variable=WEB_PATH]$ARCHIVE_PATH"
displayName: Package server (web)

Expand Down
4 changes: 3 additions & 1 deletion build/azure-pipelines/linux/build-snap.sh
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,9 @@ sudo apt-get install -y curl apt-transport-https ca-certificates
SNAP_ROOT="$(pwd)/.build/linux/snap/$VSCODE_ARCH"

# Create snap package
BUILD_VERSION="$(date +%s)"
# SOURCE_DATE_EPOCH is provided by the outer pipeline (where git is available);
# the snapcraft container does not include git.
BUILD_VERSION="${SOURCE_DATE_EPOCH:-$(date +%s)}"
SNAP_FILENAME="code-$VSCODE_QUALITY-$VSCODE_ARCH-$BUILD_VERSION.snap"
SNAP_PATH="$SNAP_ROOT/$SNAP_FILENAME"
case $VSCODE_ARCH in
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -238,7 +238,7 @@ steps:

- script: |
set -e
tar -czf $CLIENT_PATH -C .. VSCode-linux-$(VSCODE_ARCH)
build/azure-pipelines/common/reproducible-tar.sh "$CLIENT_PATH" -C .. VSCode-linux-$(VSCODE_ARCH)
env:
GITHUB_TOKEN: "$(github-distro-mixin-password)"
displayName: Archive client
Expand All @@ -250,7 +250,7 @@ steps:
ARCHIVE_PATH=".build/linux/server/vscode-server-linux-$(VSCODE_ARCH).tar.gz"
UNARCHIVE_PATH="`pwd`/../vscode-server-linux-$(VSCODE_ARCH)"
mkdir -p $(dirname $ARCHIVE_PATH)
tar --owner=0 --group=0 -czf $ARCHIVE_PATH -C .. vscode-server-linux-$(VSCODE_ARCH)
build/azure-pipelines/common/reproducible-tar.sh "$ARCHIVE_PATH" -C .. vscode-server-linux-$(VSCODE_ARCH)
echo "##vso[task.setvariable variable=SERVER_PATH]$ARCHIVE_PATH"
echo "##vso[task.setvariable variable=SERVER_UNARCHIVE_PATH]$UNARCHIVE_PATH"
env:
Expand All @@ -263,7 +263,7 @@ steps:
mv ../vscode-reh-web-linux-$(VSCODE_ARCH) ../vscode-server-linux-$(VSCODE_ARCH)-web # TODO@joaomoreno
ARCHIVE_PATH=".build/linux/web/vscode-server-linux-$(VSCODE_ARCH)-web.tar.gz"
mkdir -p $(dirname $ARCHIVE_PATH)
tar --owner=0 --group=0 -czf $ARCHIVE_PATH -C .. vscode-server-linux-$(VSCODE_ARCH)-web
build/azure-pipelines/common/reproducible-tar.sh "$ARCHIVE_PATH" -C .. vscode-server-linux-$(VSCODE_ARCH)-web
echo "##vso[task.setvariable variable=WEB_PATH]$ARCHIVE_PATH"
env:
GITHUB_TOKEN: "$(github-distro-mixin-password)"
Expand Down Expand Up @@ -357,7 +357,8 @@ steps:
- script: |
set -e
npm run gulp "vscode-linux-$(VSCODE_ARCH)-prepare-snap"
sudo -E docker run -e VSCODE_ARCH -e VSCODE_QUALITY -v $(pwd):/work -w /work vscodehub.azurecr.io/vscode-linux-build-agent:snapcraft-x64@sha256:ab4a88c4d85e0d7a85acabba59543f7143f575bab2c0b2b07f5b77d4a7e491ff /bin/bash -c "./build/azure-pipelines/linux/build-snap.sh"
export SOURCE_DATE_EPOCH="$(git log -1 --pretty=%ct)"
sudo -E docker run -e VSCODE_ARCH -e VSCODE_QUALITY -e SOURCE_DATE_EPOCH -v $(pwd):/work -w /work vscodehub.azurecr.io/vscode-linux-build-agent:snapcraft-x64@sha256:ab4a88c4d85e0d7a85acabba59543f7143f575bab2c0b2b07f5b77d4a7e491ff /bin/bash -c "./build/azure-pipelines/linux/build-snap.sh"

SNAP_ROOT="$(pwd)/.build/linux/snap/$(VSCODE_ARCH)"
SNAP_EXTRACTED_PATH=$(find $SNAP_ROOT -maxdepth 1 -type d -name 'code-*')
Expand Down
2 changes: 1 addition & 1 deletion build/azure-pipelines/web/product-build-web.yml
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ jobs:
npm run gulp vscode-web-min-ci
ARCHIVE_PATH="$(Build.ArtifactStagingDirectory)/out/web/vscode-web.tar.gz"
mkdir -p $(dirname $ARCHIVE_PATH)
tar --owner=0 --group=0 -czf $ARCHIVE_PATH -C .. vscode-web
build/azure-pipelines/common/reproducible-tar.sh "$ARCHIVE_PATH" -C .. vscode-web
echo "##vso[task.setvariable variable=WEB_PATH]$ARCHIVE_PATH"
env:
GITHUB_TOKEN: "$(github-distro-mixin-password)"
Expand Down
6 changes: 3 additions & 3 deletions build/azure-pipelines/win32/codesign.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,23 +45,23 @@ async function main() {
if (process.env['BUILT_CLIENT']) {
printBanner('Package client');
const clientArchivePath = `.build/win32-${arch}/VSCode-win32-${arch}.zip`;
await $`7z.exe a -tzip ${clientArchivePath} ../VSCode-win32-${arch}/* "-xr!CodeSignSummary*.md"`.pipe(process.stdout);
await $`build/azure-pipelines/common/reproducible-zip.ps1 ${clientArchivePath} ../VSCode-win32-${arch} ../VSCode-win32-${arch}/* "-xr!CodeSignSummary*.md"`.pipe(process.stdout);
await $`7z.exe l ${clientArchivePath}`.pipe(process.stdout);
}

// Package server
if (process.env['BUILT_SERVER']) {
printBanner('Package server');
const serverArchivePath = `.build/win32-${arch}/vscode-server-win32-${arch}.zip`;
await $`7z.exe a -tzip ${serverArchivePath} ../vscode-server-win32-${arch}`.pipe(process.stdout);
await $`build/azure-pipelines/common/reproducible-zip.ps1 ${serverArchivePath} ../vscode-server-win32-${arch} ../vscode-server-win32-${arch}`.pipe(process.stdout);
await $`7z.exe l ${serverArchivePath}`.pipe(process.stdout);
}

// Package server (web)
if (process.env['BUILT_WEB']) {
printBanner('Package server (web)');
const webArchivePath = `.build/win32-${arch}/vscode-server-win32-${arch}-web.zip`;
await $`7z.exe a -tzip ${webArchivePath} ../vscode-server-win32-${arch}-web`.pipe(process.stdout);
await $`build/azure-pipelines/common/reproducible-zip.ps1 ${webArchivePath} ../vscode-server-win32-${arch}-web ../vscode-server-win32-${arch}-web`.pipe(process.stdout);
await $`7z.exe l ${webArchivePath}`.pipe(process.stdout);
}

Expand Down
9 changes: 6 additions & 3 deletions build/gulpfile.vscode.linux.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,13 @@ import { recommendedDeps as rpmRecommendedDependencies } from './linux/rpm/dep-l
import * as path from 'path';
import * as cp from 'child_process';
import { promisify } from 'util';
import { getSourceDateEpoch } from './lib/sourceDateEpoch.ts';

const exec = promisify(cp.exec);
const root = path.dirname(import.meta.dirname);
const commit = getVersion(root);

const linuxPackageRevision = Math.floor(new Date().getTime() / 1000);
const linuxPackageRevision = getSourceDateEpoch();

Comment on lines 23 to 27
function getDebPackageArch(arch: string): string {
switch (arch) {
Expand Down Expand Up @@ -126,7 +127,8 @@ function buildDebPackage(arch: string) {
return async () => {
await exec(`chmod 755 ${product.applicationName}-${debArch}/DEBIAN/postinst ${product.applicationName}-${debArch}/DEBIAN/prerm ${product.applicationName}-${debArch}/DEBIAN/postrm`, { cwd });
await exec('mkdir -p deb', { cwd });
await exec(`fakeroot dpkg-deb -Zxz -b ${product.applicationName}-${debArch} deb`, { cwd });
const env = { ...process.env, SOURCE_DATE_EPOCH: String(linuxPackageRevision) };
await exec(`fakeroot dpkg-deb -Zxz -b ${product.applicationName}-${debArch} deb`, { cwd, env });
};
}

Expand Down Expand Up @@ -222,7 +224,8 @@ function buildRpmPackage(arch: string) {

return async () => {
await exec(`mkdir -p ${destination}`);
await exec(`HOME="$(pwd)/${destination}" rpmbuild -bb ${rpmBuildPath}/SPECS/${product.applicationName}.spec --target=${rpmArch}`);
const env = { ...process.env, SOURCE_DATE_EPOCH: String(linuxPackageRevision) };
await exec(`HOME="$(pwd)/${destination}" rpmbuild -bb ${rpmBuildPath}/SPECS/${product.applicationName}.spec --target=${rpmArch}`, { env });
await exec(`cp "${rpmOut}/$(ls ${rpmOut})" ${destination}/`);
};
}
Expand Down
21 changes: 20 additions & 1 deletion build/lib/asar.ts
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ export function createAsar(folderPath: string, unpackGlobs: string[], skipGlobs:
const finish = () => {
{
const headerPickle = pickle.createEmpty();
headerPickle.writeString(JSON.stringify(filesystem.header));
headerPickle.writeString(JSON.stringify(sortAsarHeader(filesystem.header)));
const headerBuf = headerPickle.toBuffer();

const sizePickle = pickle.createEmpty();
Expand Down Expand Up @@ -164,3 +164,22 @@ export function createAsar(folderPath: string, unpackGlobs: string[], skipGlobs:
}
});
}

// Recursively sorts directory entries in an asar filesystem header so that
// serialization order does not depend on the order in which files arrived in
// the input stream (which is filesystem-dependent via readdir).
function sortAsarHeader<T>(node: T): T {
if (!node || typeof node !== 'object') {
return node;
}
const obj = node as Record<string, unknown>;
const files = obj['files'];
if (files && typeof files === 'object') {
const sorted: Record<string, unknown> = {};
for (const key of Object.keys(files as Record<string, unknown>).sort()) {
sorted[key] = sortAsarHeader((files as Record<string, unknown>)[key]);
}
obj['files'] = sorted;
}
return node;
}
3 changes: 2 additions & 1 deletion build/lib/electron.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import vfs from 'vinyl-fs';
import { filter, jsonEditor } from './gulp/facade.ts';
import * as util from './util.ts';
import { getVersion } from './getVersion.ts';
import { getSourceDate } from './sourceDateEpoch.ts';
import electron from '@vscode/gulp-electron';

type DarwinDocumentSuffix = 'document' | 'script' | 'file' | 'source code';
Expand Down Expand Up @@ -198,7 +199,7 @@ export const config = {
urlSchemes: [product.urlProtocol]
}],
darwinForceDarkModeSupport: true,
darwinCredits: darwinCreditsTemplate ? Buffer.from(darwinCreditsTemplate({ commit: commit, date: new Date().toISOString() })) : undefined,
darwinCredits: darwinCreditsTemplate ? Buffer.from(darwinCreditsTemplate({ commit: commit, date: getSourceDate().toISOString() })) : undefined,
linuxExecutableName: product.applicationName,
winIcon: 'resources/win32/code.ico',
token: process.env['GITHUB_TOKEN'],
Expand Down
Loading
Loading