-
Notifications
You must be signed in to change notification settings - Fork 3
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Deploy with riff-raff #1693
Deploy with riff-raff #1693
Changes from 7 commits
4174cf0
61990a6
1daeeaa
c7a3db8
9ce33b1
37e8266
521bf6f
b008cb1
e5533f2
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -4,6 +4,7 @@ dist | |
.changeset | ||
README.md | ||
CHANGELOG.md | ||
riff-raff.yaml | ||
.vscode/settings.json | ||
playwright-report/ | ||
pnpm-lock.yaml |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
regions: [eu-west-1] | ||
stacks: [frontend] | ||
allowedStages: | ||
- CODE | ||
- PROD | ||
deployments: | ||
frontend-static/commercial: | ||
type: aws-s3 | ||
parameters: | ||
bucketSsmKey: /account/services/dotcom-static.bucket | ||
cacheControl: public, max-age=315360000, immutable | ||
prefixStack: false | ||
publicReadAcl: false | ||
commercial-bundle-path: | ||
type: cloud-formation | ||
parameters: | ||
templateStagePaths: | ||
CODE: code.json | ||
PROD: prod.json | ||
dependencies: | ||
- frontend-static/commercial |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -7,11 +7,14 @@ const decideAssetsPath = () => { | |
if (process.env.OVERRIDE_BUNDLE_PATH) { | ||
return process.env.OVERRIDE_BUNDLE_PATH; | ||
} | ||
|
||
const assetsPath = frontendAssetsFullURL ?? page.assetsPath; | ||
return `${assetsPath}javascripts/commercial/`; | ||
}; | ||
|
||
__webpack_public_path__ = decideAssetsPath(); | ||
if (!process.env.RIFFRAFF_DEPLOY) { | ||
__webpack_public_path__ = decideAssetsPath(); | ||
} | ||
Comment on lines
+15
to
+17
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. From my understanding, this code sets Could you confirm if this understanding is correct and provide any additional context? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Both By setting to Often we are overriding the bundle location completely locally so not a huge issue, but it's nice to have ads working even if not overriding the bundle location. |
||
|
||
/** | ||
* Choose whether to launch Googletag or Opt Out tag (ootag) based on consent state | ||
|
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -39,6 +39,7 @@ export default merge(config, { | |||||||||||||||||||||
new DefinePlugin({ | ||||||||||||||||||||||
'process.env.NODE_ENV': JSON.stringify('production'), | ||||||||||||||||||||||
'process.env.OVERRIDE_BUNDLE_PATH': JSON.stringify(false), | ||||||||||||||||||||||
'process.env.RIFFRAFF_DEPLOY': JSON.stringify(false), | ||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Are we setting the global There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We use As an example you see how we configure commercial/webpack.config.dev.mjs Lines 28 to 31 in 1273e6d
commercial/webpack.config.prod.mjs Lines 39 to 44 in b008cb1
|
||||||||||||||||||||||
...gitCommitSHA(), | ||||||||||||||||||||||
}), | ||||||||||||||||||||||
], | ||||||||||||||||||||||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,119 @@ | ||
import { execSync } from 'child_process'; | ||
import { join } from 'path'; | ||
import TerserPlugin from 'terser-webpack-plugin'; | ||
import webpack from 'webpack'; | ||
import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer'; | ||
import { merge } from 'webpack-merge'; | ||
import config from './webpack.config.mjs'; | ||
|
||
const { DefinePlugin } = webpack; | ||
|
||
class GenerateCloudformation { | ||
apply = (compiler) => { | ||
compiler.hooks.afterEmit.tap('AfterEmitPlugin', (compilation) => { | ||
const entry = compilation.entrypoints.get('commercial-standalone'); | ||
|
||
const hashedFilePath = entry?.getFiles()[0]; | ||
|
||
if (!hashedFilePath) { | ||
throw new Error( | ||
'Could not find hashed file for commercial-standalone', | ||
); | ||
} | ||
|
||
const stages = ['code', 'prod']; | ||
stages.forEach((stage) => { | ||
/** | ||
* This small bit of cloudformation will update the SSM parameter that frontend | ||
* reads to get the bundle path. | ||
*/ | ||
const cloudformation = { | ||
Resources: { | ||
BundlePath: { | ||
Type: 'AWS::SSM::Parameter', | ||
Properties: { | ||
Name: `/frontend/${stage}/commercial.bundlePath`, | ||
Type: 'String', | ||
Value: hashedFilePath, | ||
}, | ||
}, | ||
}, | ||
}; | ||
|
||
// If we're in prod, we also want to update the dev bundle path | ||
if (stage === 'prod') { | ||
cloudformation.Resources.DevBundlePath = { | ||
Type: 'AWS::SSM::Parameter', | ||
Properties: { | ||
Name: '/frontend/dev/commercial.bundlePath', | ||
Type: 'String', | ||
Value: hashedFilePath, | ||
}, | ||
}; | ||
} | ||
|
||
const output = JSON.stringify(cloudformation, null, 2); | ||
const outputPath = join( | ||
import.meta.dirname, | ||
'dist', | ||
'riff-raff', | ||
'cloudformation', | ||
`${stage}.json`, | ||
); | ||
compiler.outputFileSystem.mkdirSync( | ||
join( | ||
import.meta.dirname, | ||
'dist', | ||
'riff-raff', | ||
'cloudformation', | ||
), | ||
{ recursive: true }, | ||
); | ||
compiler.outputFileSystem.writeFileSync(outputPath, output); | ||
}); | ||
}); | ||
}; | ||
} | ||
|
||
const gitCommitSHA = () => { | ||
try { | ||
const commitSHA = execSync('git rev-parse HEAD').toString().trim(); | ||
return { 'process.env.COMMIT_SHA': JSON.stringify(commitSHA) }; | ||
} catch (_) { | ||
return {}; | ||
} | ||
}; | ||
|
||
const prefix = process.env.BUNDLE_PREFIX ?? '[chunkhash]/'; | ||
|
||
// eslint-disable-next-line import/no-default-export -- webpack config | ||
export default merge(config, { | ||
mode: 'production', | ||
output: { | ||
filename: `commercial/${prefix}graun.standalone.commercial.js`, | ||
chunkFilename: `commercial/${prefix}graun.[name].commercial.js`, | ||
path: join(import.meta.dirname, 'dist', 'riff-raff', 'js'), | ||
publicPath: 'auto', | ||
clean: true, | ||
}, | ||
devtool: 'source-map', | ||
plugins: [ | ||
// eslint-disable-next-line @typescript-eslint/no-unsafe-call -- circular-dependency-plugin is not typed | ||
new BundleAnalyzerPlugin({ | ||
reportFilename: './commercial-bundle-analyzer-report.html', | ||
analyzerMode: 'static', | ||
openAnalyzer: false, | ||
}), | ||
new DefinePlugin({ | ||
'process.env.NODE_ENV': JSON.stringify('production'), | ||
'process.env.OVERRIDE_BUNDLE_PATH': JSON.stringify(false), | ||
'process.env.RIFFRAFF_DEPLOY': JSON.stringify(true), | ||
...gitCommitSHA(), | ||
}), | ||
new GenerateCloudformation(), | ||
], | ||
optimization: { | ||
minimize: true, | ||
minimizer: [new TerserPlugin()], | ||
}, | ||
}); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
From my understanding, the
build:prod script
setsprocess.env.RIFFRAFF_DEPLOY
tofalse
to exclude Riff-Raff-specific code from the production build.The
build:riff-raff
script setsprocess.env.RIFFRAFF_DEPLOY
totrue
and includes additional steps for Riff-Raff deployment. Could you please clarify if this understanding is correct? which specific scenarios where each build would be used?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
process.env.RIFFRAFF_DEPLOY
is set by the webpack config used by each build task. The comment below onDefinePlugin
might help.