A complete solution to package and build a ready for distribution Electron app for MacOS, Windows and Linux with auto update support out of the box
—
Quality
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Pending
The risk profile of this skill
Artifact publishing to various distribution platforms including GitHub Releases, S3, and custom servers with integrated auto-update support. The publishing system handles secure upload, update channel management, and cross-platform distribution.
Main publishing functions for uploading built artifacts to distribution platforms.
/**
* Publish artifacts with specified files and configuration
* @param args - Publishing arguments including files and policy
* @returns Promise resolving when publishing completes
*/
function publish(args: {
/** Array of file paths to publish */
files: string[];
/** Application version for release matching */
version: string | undefined;
/** Path to configuration file */
configurationFilePath: string | undefined;
/** Publishing policy */
policy: PublishPolicy;
}): Promise<any>;
/**
* Publish artifacts with advanced options and custom configuration
* @param uploadOptions - File and architecture specifications
* @param buildVersion - Override build version
* @param configurationFilePath - Custom config file path
* @param publishConfiguration - Inline publish configuration
* @param publishOptions - Publishing behavior options
* @returns Promise resolving to upload tasks or null on failure
*/
function publishArtifactsWithOptions(
uploadOptions: Array<{file: string; arch: string | null}>,
buildVersion?: string,
configurationFilePath?: string,
publishConfiguration?: PublishConfiguration,
publishOptions?: PublishOptions
): Promise<Array<UploadTask> | null>;
/**
* Publishing policy determining when to publish
*/
type PublishPolicy = "onTag" | "onTagOrDraft" | "always" | "never";Usage Examples:
import { publish, publishArtifactsWithOptions } from "electron-builder";
// Basic publishing
await publish({
files: ["dist/MyApp-1.0.0.dmg", "dist/MyApp Setup 1.0.0.exe"],
version: "1.0.0",
configurationFilePath: undefined,
policy: "onTagOrDraft"
});
// Advanced publishing with specific architecture
await publishArtifactsWithOptions([
{ file: "dist/MyApp-1.0.0-x64.dmg", arch: "x64" },
{ file: "dist/MyApp-1.0.0-arm64.dmg", arch: "arm64" }
], "1.0.0");Central manager coordinating artifact uploads across multiple publish providers.
/**
* Manager coordinating artifact publishing across providers
*/
class PublishManager {
constructor(packager: Packager, options: PublishOptions, cancellationToken?: CancellationToken);
/** Whether publishing is enabled */
readonly isPublish: boolean;
/** Get global publish configurations from build config */
getGlobalPublishConfigurations(): Promise<Array<PublishConfiguration> | null>;
/** Schedule upload task for specific publish configuration */
scheduleUpload(
publishConfig: PublishConfiguration,
uploadTask: UploadTask,
appInfo: AppInfo
): Promise<any>;
/** Wait for all scheduled uploads to complete */
awaitTasks(): Promise<Array<string>>;
/** Cancel all pending upload tasks */
cancelTasks(): void;
}
/**
* Publishing behavior options
*/
interface PublishOptions {
/** Publishing policy */
publish?: PublishPolicy | null;
/** Publisher-specific options */
publisherOptions?: any;
}Individual file upload specifications with metadata.
/**
* Individual file upload task
*/
interface UploadTask {
/** Path to file being uploaded */
file: string;
/** Target architecture for the file */
arch: Arch | null;
/** Safe filename for publishing (no special characters) */
safeArtifactName?: string;
/** Update information for auto-updater */
updateInfo?: any;
}Configuration interfaces for different publishing providers.
/**
* Base publish configuration
*/
interface PublishConfiguration {
/** Publisher provider name */
provider: string;
/** Update channel name */
channel?: string | null;
/** Additional provider-specific options */
[key: string]: any;
}
/**
* GitHub Releases publisher configuration
*/
interface GithubOptions extends PublishConfiguration {
provider: "github";
/** Repository owner */
owner?: string;
/** Repository name */
repo?: string;
/** GitHub token (usually from environment) */
token?: string;
/** Use v-prefixed tags */
vPrefixedTagName?: boolean;
/** Release as draft */
draft?: boolean;
/** Release as prerelease */
prerelease?: boolean;
/** Private repository */
private?: boolean;
/** GitHub API URL for enterprise */
host?: string;
/** Release name template */
releaseName?: string;
/** Release body/notes */
releaseNotes?: string;
}
/**
* AWS S3 publisher configuration
*/
interface S3Options extends PublishConfiguration {
provider: "s3";
/** S3 bucket name */
bucket: string;
/** AWS region */
region?: string;
/** S3 ACL */
acl?: "private" | "public-read" | "public-read-write" | "authenticated-read";
/** S3 object key prefix */
path?: string;
/** Custom endpoint URL */
endpoint?: string;
/** Access key ID */
accessKeyId?: string;
/** Secret access key */
secretAccessKey?: string;
/** Session token */
sessionToken?: string;
}
/**
* DigitalOcean Spaces publisher configuration
*/
interface SpacesOptions extends PublishConfiguration {
provider: "spaces";
/** Spaces name */
name: string;
/** Spaces region */
region: string;
/** Spaces ACL */
acl?: "private" | "public-read";
/** Object key prefix */
path?: string;
/** Access key ID */
accessKeyId?: string;
/** Secret access key */
secretAccessKey?: string;
}
/**
* Generic HTTP publisher configuration
*/
interface GenericServerOptions extends PublishConfiguration {
provider: "generic";
/** Base URL for downloads */
url: string;
/** Update channel */
channel?: string;
/** Whether to use multiple range requests */
useMultipleRangeRequest?: boolean;
}Usage Examples:
import { Configuration, GithubOptions, S3Options } from "electron-builder";
const config: Configuration = {
// Multiple publish providers
publish: [
{
provider: "github",
owner: "myorg",
repo: "myapp",
draft: false,
prerelease: false
} as GithubOptions,
{
provider: "s3",
bucket: "myapp-releases",
region: "us-east-1",
acl: "public-read",
path: "releases/"
} as S3Options
]
};Abstract publisher system with concrete implementations for each provider.
/**
* Abstract base class for all publishers
*/
abstract class Publisher {
constructor(context: PublishContext, version: string);
/** Upload single file */
abstract upload(task: UploadTask): Promise<any>;
/** Upload multiple files */
uploadMultiple(tasks: Array<UploadTask>): Promise<any>;
/** Get upload URL for file */
abstract toString(): string;
}
/**
* GitHub Releases publisher
*/
class GitHubPublisher extends Publisher {
constructor(context: PublishContext, options: GithubOptions, version: string, isPublishOptionGuessed?: boolean);
/** Upload artifact to GitHub release */
upload(task: UploadTask): Promise<any>;
/** Delete release tag */
deleteRelease(): Promise<any>;
/** Get release info */
getRelease(): Promise<any>;
/** Create or update release */
createOrUpdateRelease(): Promise<any>;
}
/**
* S3 publisher for AWS S3
*/
class S3Publisher extends Publisher {
constructor(context: PublishContext, options: S3Options);
/** Upload artifact to S3 bucket */
upload(task: UploadTask): Promise<any>;
}
/**
* DigitalOcean Spaces publisher
*/
class SpacesPublisher extends Publisher {
constructor(context: PublishContext, options: SpacesOptions);
/** Upload artifact to Spaces */
upload(task: UploadTask): Promise<any>;
}Context information passed to publishers during upload process.
/**
* Publishing execution context
*/
interface PublishContext {
/** Cancellation token */
cancellationToken: CancellationToken;
/** Progress callback for upload tracking */
progress?: ProgressCallback | null;
}
/**
* Upload progress callback
*/
type ProgressCallback = (transferred: number, total: number) => void;
/**
* Progress information during uploads
*/
interface ProgressInfo {
/** Total bytes to transfer */
total: number;
/** Bytes transferred in this update */
delta: number;
/** Total bytes transferred so far */
transferred: number;
/** Completion percentage (0-100) */
percent: number;
/** Transfer rate in bytes per second */
bytesPerSecond: number;
}Auto-updater integration with update metadata generation.
/**
* Update information for auto-updater
*/
interface UpdateInfo {
/** Application version */
version: string;
/** Release notes */
releaseNotes?: string | Array<ReleaseNoteInfo> | null;
/** Release name */
releaseName?: string | null;
/** Release date */
releaseDate: string;
/** Update files */
files: Array<UpdateFileInfo>;
/** Download path */
path: string;
/** File hash for integrity */
sha256: string;
/** File hash (deprecated, use sha256) */
sha512?: string;
}
/**
* Update file information
*/
interface UpdateFileInfo {
/** File URL */
url: string;
/** File size in bytes */
size: number;
/** File SHA-256 hash */
sha256: string;
/** File SHA-512 hash (deprecated) */
sha512?: string;
}
/**
* Release note information
*/
interface ReleaseNoteInfo {
/** Version for this release note */
version: string;
/** Release note content */
note: string | null;
}Common environment variables for publisher authentication:
GH_TOKEN, GITHUB_TOKENAWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKENDO_KEY_ID, DO_SECRET_KEYUsage Examples:
// Publishing with environment-based authentication
const config = {
publish: {
provider: "github",
// Token automatically read from GH_TOKEN or GITHUB_TOKEN
owner: "myorg",
repo: "myapp"
}
};
// CI/CD integration
if (process.env.CI && process.env.GITHUB_REF?.startsWith('refs/tags/')) {
await build({
config,
publish: "onTag"
});
}Publishing-specific error handling and retry logic.
/**
* HTTP error during publishing
*/
class HttpError extends Error {
readonly statusCode: number;
readonly statusMessage?: string;
readonly headers?: any;
}
/**
* Cancellation error for interrupted uploads
*/
class CancellationError extends Error {
readonly name: "CancellationError";
}The publishing system provides robust, multi-provider artifact distribution with comprehensive error handling, progress tracking, and auto-updater integration for professional software deployment workflows.
Install with Tessl CLI
npx tessl i tessl/npm-electron-builder