S3
The S3 target publishes your Make artifacts to an Amazon S3 bucket.
Authentication
It is recommended to follow the Amazon AWS guide and set either a shared credentials guide or the proper environment variables. However, if that is not possible, the publisher config allows the setting of the accessKeyId
and secretAccessKey
configuration options.
Usage
Configuration options are documented in PublisherS3Config
.
{% code title="forge.config.js" %}
module.exports = {
// ...
publishers: [
{
name: '@electron-forge/publisher-s3',
config: {
bucket: 'my-bucket',
public: true
}
}
]
};
{% endcode %}
Key management
By default, the S3 publisher will upload its objects to the {prefix}/{platform}/{arch}/{name}
key, where:
{prefix}
is the value of theconfig.folder
option (defaults to the"name"
field in your package.json).{platform}
is the target platform for the artifact you are publishing.{arch}
is the target architecture for the artifact you are publishing.{name}
is the file name of the artifact you are publishing.
{% hint style="warning" %}
If you run the Publish command multiple times on the same platform for the same version (e.g. simultaneously publishing ia32
and x64
Windows artifacts), your uploads can get overwritten in the S3 bucket.
To avoid this problem, you can use the keyResolver
option to generate the S3 key programmatically.
{% code title="forge.config.js" %}
{
name: '@electron-forge/publisher-s3',
config: {
// ...
keyResolver: (fileName, platform, arch) => {
return `some-prefix/${platform}/${arch}/${filename}`
}
// ...
}
}
{% endcode %} {% endhint %}
Auto updating from S3
You can configure Electron's built-in autoUpdater
module to use the artifacts published by the S3 publisher. This is a two-step process:
First, you must configure @electron-forge/publisher-s3
to publish your files into an auto-updater compatible layout and use @electron-forge/maker-zip
+ @electron-forge/maker-squirrel
to build your application.
{% code title="forge.config.js" %}
module.exports = {
// ...
makers: [
{
name: '@electron-forge/maker-zip',
config: (arch) => ({
// Note that we must provide this S3 URL here
// in order to support smooth version transitions
// especially when using a CDN to front your updates
macUpdateManifestBaseUrl: `https://my-bucket.s3.amazonaws.com/my-app-updates/darwin/${arch}`
})
},
{
name: '@electron-forge/maker-squirrel',
config: (arch) => ({
// Note that we must provide this S3 URL here
// in order to generate delta updates
remoteReleases: `https://my-bucket.s3.amazonaws.com/my-app-updates/win32/${arch}`
})
}
],
publishers: [
{
name: '@electron-forge/publisher-s3',
config: {
bucket: 'my-bucket',
public: true
}
}
]
};
{% endcode %}
With Forge configured correctly, the second step is to configure the autoUpdater
module inside your app's main process. The simplest form is shown below but you might want to hook additional events to show UI to your user or ask them if they want to update your app right now.
{% code title="main.js" %}
const { updateElectronApp, UpdateSourceType } = require('update-electron-app');
updateElectronApp({
updateSource: {
type: UpdateSourceType.StaticStorage,
baseUrl: `https://my-bucket.s3.amazonaws.com/my-app-updates/${process.platform}/${process.arch}`
}
});
{% endcode %}