Skip to content

Commit 9a96979

Browse files
github-actions[bot]mattkrickparabol-release-bot[bot]Dschoordschtianrunhe
authored
chore(release): Test and deploy to Production v8.21.1 (#10721)
Signed-off-by: Matt Krick <matt.krick@gmail.com> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: Matt Krick <matt.krick@gmail.com> Co-authored-by: parabol-release-bot[bot] <150284312+parabol-release-bot[bot]@users.noreply.github.com> Co-authored-by: Georg Bremer <github@dschoordsch.de> Co-authored-by: Bruce Tian <tianrunhe@gmail.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Nick O'Ferrall <nickoferrall@gmail.com> Co-authored-by: Rafa <101704572+rafaelromcar-parabol@users.noreply.github.com> Co-authored-by: Dale Bumblis <135627447+dbumblis-parabol@users.noreply.github.com> Co-authored-by: Terry Acker <ackernaut@gmail.com> Co-authored-by: snyk-bot <snyk-bot@snyk.io> Co-authored-by: GitHub Action <action@github.com> Co-authored-by: Sven Seeberg <sven@geeq.de> Co-authored-by: Smruti Ranjan Badatya <35039502+iamsmruti@users.noreply.github.com> Co-authored-by: Jordan Husney <jordan.husney@gmail.com> Co-authored-by: github-actions <github-actions@github.com>
1 parent a3ff4d7 commit 9a96979

File tree

17 files changed

+69
-36
lines changed

17 files changed

+69
-36
lines changed

.env.example

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ AI_EMBEDDER_WORKERS='1'
4242
# AWS_ACCESS_KEY_ID='key_AWS_ACCESS_KEY_ID'
4343
# AWS_REGION='key_AWS_REGION'
4444
# AWS_SECRET_ACCESS_KEY='key_AWS_SECRET_ACCESS_KEY'
45+
# AWS_S3_BUCKET='key_AWS_BUCKET'
4546

4647
# MONITORING
4748
# SENTRY_DSN='key_SENTRY_DSN'

.release-please-manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
{
2-
".": "8.21.0"
2+
".": "8.21.1"
33
}

CHANGELOG.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,20 @@ This project adheres to [Semantic Versioning](http://semver.org/).
55

66
This CHANGELOG follows conventions [outlined here](http://keepachangelog.com/).
77

8+
## [8.21.1](https://github.com/ParabolInc/parabol/compare/v8.21.0...v8.21.1) (2025-01-22)
9+
10+
11+
### Fixed
12+
13+
* React error on forgot password page ([#10717](https://github.com/ParabolInc/parabol/issues/10717)) ([8c8d600](https://github.com/ParabolInc/parabol/commit/8c8d6003a6e5e65674784f6f41897ab886c540b0))
14+
* S3 bucket name used from the application configuration instead of infered from CDN_URL ([#10661](https://github.com/ParabolInc/parabol/issues/10661)) ([7f3051d](https://github.com/ParabolInc/parabol/commit/7f3051d6d82c44982d31d296875f834e2cad5a95))
15+
* Tab button style ([#10715](https://github.com/ParabolInc/parabol/issues/10715)) ([216eb40](https://github.com/ParabolInc/parabol/commit/216eb40d8baa062a708275aebe933d921b2d3f27))
16+
17+
18+
### Changed
19+
20+
* Add AWS_S3_BUCKET to .env.example ([#10718](https://github.com/ParabolInc/parabol/issues/10718)) ([001cf41](https://github.com/ParabolInc/parabol/commit/001cf41eed554c97c0d719b898258f83643bc2e7))
21+
822
## [8.21.0](https://github.com/ParabolInc/parabol/compare/v8.20.1...v8.21.0) (2025-01-21)
923

1024

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"description": "An open-source app for building smarter, more agile teams.",
44
"author": "Parabol Inc. <love@parabol.co> (http://github.com/ParabolInc)",
55
"license": "AGPL-3.0",
6-
"version": "8.21.0",
6+
"version": "8.21.1",
77
"repository": {
88
"type": "git",
99
"url": "https://github.com/ParabolInc/parabol"

packages/chronos/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "chronos",
3-
"version": "8.21.0",
3+
"version": "8.21.1",
44
"description": "A cron job scheduler",
55
"author": "Matt Krick <matt.krick@gmail.com>",
66
"homepage": "https://github.com/ParabolInc/parabol/tree/master/packages/chronos#readme",
@@ -25,6 +25,6 @@
2525
},
2626
"dependencies": {
2727
"cron": "^2.3.1",
28-
"parabol-server": "8.21.0"
28+
"parabol-server": "8.21.1"
2929
}
3030
}

packages/client/components/GenericAuthentication.tsx

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,16 @@ const GenericAuthentication = (props: Props) => {
7878
const isMicrosoftAuthEnabled = window.__ACTION__.AUTH_MICROSOFT_ENABLED
7979
const isInternalAuthEnabled = window.__ACTION__.AUTH_INTERNAL_ENABLED
8080
const isSSOAuthEnabled = window.__ACTION__.AUTH_SSO_ENABLED
81+
82+
const isCreate = page === 'create-account'
83+
const action = isCreate ? CREATE_ACCOUNT_LABEL : SIGNIN_LABEL
84+
const pageTitle = `${action} | Parabol`
85+
const metaCopy = isCreate
86+
? 'Give structure to your meetings to get your team talking and moving forward faster. Get started in 44 seconds or less.'
87+
: 'Access Parabol to streamline your agile meetings. Collaborate, reflect, and grow with your team in real-time.'
88+
useDocumentTitle(pageTitle, action)
89+
useMetaTagContent(metaCopy)
90+
8191
if (page === 'forgot-password') {
8292
return <ForgotPasswordPage goToPage={goToPage} />
8393
}
@@ -89,17 +99,9 @@ const GenericAuthentication = (props: Props) => {
8999
}
90100
}
91101

92-
const isCreate = page === 'create-account'
93-
const action = isCreate ? CREATE_ACCOUNT_LABEL : SIGNIN_LABEL
94102
const counterAction = isCreate ? SIGNIN_LABEL : CREATE_ACCOUNT_LABEL
95103
const counterActionSlug = isCreate ? SIGNIN_SLUG : CREATE_ACCOUNT_SLUG
96104
const actionCopy = isCreate ? 'Already have an account? ' : 'New to Parabol? '
97-
const pageTitle = `${action} | Parabol`
98-
const metaCopy = isCreate
99-
? 'Give structure to your meetings to get your team talking and moving forward faster. Get started in 44 seconds or less.'
100-
: 'Access Parabol to streamline your agile meetings. Collaborate, reflect, and grow with your team in real-time.'
101-
useDocumentTitle(pageTitle, action)
102-
useMetaTagContent(metaCopy)
103105
const title = teamName ? `${teamName} is waiting` : action
104106
const onForgot = () => {
105107
goToPage('forgot-password', `?email=${emailRef.current?.email()}`)

packages/client/components/InvitationLinkDialog.tsx

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,16 +42,20 @@ const InvitationLinkDialog = (props: Props) => {
4242
return <TeamInvitationErrorNotFound isMassInvite />
4343
}
4444
const {errorType, teamName} = massInvitation
45+
const pageTitle = teamName ? `${teamName} | Parabol` : 'Join | Parabol'
46+
const pageName = teamName ? `Join ${teamName}` : 'Join Parabol'
47+
const metaCopy = teamName
48+
? `Join ${teamName} on Parabol, the essential tool for making meetings efficient or replacing them with structured, asynchronous collaboration.`
49+
: `Join Parabol, the essential tool for making meetings efficient or replacing them with structured, asynchronous collaboration.`
50+
useDocumentTitle(pageTitle, pageName)
51+
useMetaTagContent(metaCopy)
52+
4553
switch (errorType) {
4654
case 'notFound':
4755
return <TeamInvitationErrorNotFound isMassInvite />
4856
case 'expired':
4957
return <InvitationLinkErrorExpired massInvitation={massInvitation} />
5058
}
51-
useDocumentTitle(`${teamName} | Parabol`, `Join ${teamName}`)
52-
useMetaTagContent(
53-
`Join ${teamName} on Parabol,the essential tool for making meetings efficient or replacing them with structured, asynchronous collaboration.`
54-
)
5559
const {authToken} = atmosphere
5660
if (authToken) {
5761
return <TeamInvitationAccept invitationToken={token} />

packages/client/components/Tab/Tab.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ const Tab = forwardRef((props: Props, ref: Ref<HTMLButtonElement>) => {
1313
return (
1414
<button
1515
className={cn(
16-
'flex cursor-default select-none appearance-none items-center justify-center border-0 px-4 py-3 text-sm leading-5 text-grape-600 outline-0',
17-
isActive ? 'text-grape-700' : 'cursor-pointer',
16+
'flex cursor-default select-none appearance-none items-center justify-center border-0 bg-inherit px-4 py-3 text-sm leading-5 outline-0',
17+
isActive ? 'text-grape-700' : 'cursor-pointer text-slate-600',
1818
className
1919
)}
2020
onClick={onClick}

packages/client/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"description": "An open-source app for building smarter, more agile teams.",
44
"author": "Parabol Inc. <love@parabol.co> (http://github.com/ParabolInc)",
55
"license": "AGPL-3.0",
6-
"version": "8.21.0",
6+
"version": "8.21.1",
77
"repository": {
88
"type": "git",
99
"url": "https://github.com/ParabolInc/parabol"

packages/client/tailwindTheme.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ export default {
77
theme: {
88
colors: {
99
transparent: 'transparent',
10+
inherit: 'inherit',
1011
current: 'currentColor',
1112
black: defaultColors.black,
1213
white: defaultColors.white,

packages/embedder/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "parabol-embedder",
3-
"version": "8.21.0",
3+
"version": "8.21.1",
44
"description": "A service that computes embedding vectors from Parabol objects",
55
"author": "Jordan Husney <jordan.husney@gmail.com>",
66
"homepage": "https://github.com/ParabolInc/parabol/tree/master/packages/embedder#readme",

packages/gql-executor/package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "gql-executor",
3-
"version": "8.21.0",
3+
"version": "8.21.1",
44
"description": "A Stateless GraphQL Executor",
55
"author": "Matt Krick <matt.krick@gmail.com>",
66
"homepage": "https://github.com/ParabolInc/parabol/tree/master/packages/gqlExecutor#readme",
@@ -25,8 +25,8 @@
2525
},
2626
"dependencies": {
2727
"dd-trace": "^5.0.0",
28-
"parabol-client": "8.21.0",
29-
"parabol-server": "8.21.0",
28+
"parabol-client": "8.21.1",
29+
"parabol-server": "8.21.1",
3030
"undici": "^5.26.2"
3131
}
3232
}

packages/integration-tests/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "integration-tests",
33
"author": "Parabol Inc. <love@parabol.co> (http://github.com/ParabolInc)",
44
"license": "AGPL-3.0",
5-
"version": "8.21.0",
5+
"version": "8.21.1",
66
"description": "",
77
"main": "index.js",
88
"scripts": {

packages/mattermost-plugin/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "parabol-mattermost-plugin",
3-
"version": "8.21.0",
3+
"version": "8.21.1",
44
"description": "A service that computes embedding vectors from Parabol objects",
55
"author": "Georg Bremer <github@dschoordsch.de>",
66
"homepage": "https://github.com/ParabolInc/parabol/tree/master/packages/mattermost-plugin#readme",
@@ -48,7 +48,7 @@
4848
"ts-node-dev": "^1.0.0-pre.44"
4949
},
5050
"dependencies": {
51-
"parabol-client": "8.21.0",
51+
"parabol-client": "8.21.1",
5252
"@mattermost/compass-icons": "0.1.47",
5353
"@reduxjs/toolkit": "1.9.7",
5454
"@tiptap/core": "^2.9.1",

packages/server/fileStorage/S3FileStoreManager.ts

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,16 @@ export default class S3Manager extends FileStoreManager {
3232
// e.g. development, production
3333
private envSubDir: string
3434

35+
// e.g. action-files.parabol.co
36+
private bucket: string
37+
3538
// e.g. https://action-files.parabol.co
3639
baseUrl: string
3740
private s3: S3Client
3841
constructor() {
3942
super()
40-
const {CDN_BASE_URL, AWS_REGION, AWS_SECRET_ACCESS_KEY, AWS_ACCESS_KEY_ID} = process.env
43+
const {CDN_BASE_URL, AWS_REGION, AWS_SECRET_ACCESS_KEY, AWS_ACCESS_KEY_ID, AWS_S3_BUCKET} =
44+
process.env
4145
if (!CDN_BASE_URL || CDN_BASE_URL === 'key_CDN_BASE_URL') {
4246
throw new Error('CDN_BASE_URL ENV VAR NOT SET')
4347
}
@@ -50,18 +54,24 @@ export default class S3Manager extends FileStoreManager {
5054
if (pathname.endsWith('/'))
5155
throw new Error('CDN_BASE_URL must end with the env, no trailing slash, e.g. /production')
5256

57+
if (!AWS_S3_BUCKET) {
58+
throw new Error('AWS_S3_BUCKET required when using AWS S3 as filestore provider')
59+
}
60+
5361
this.envSubDir = pathname.split('/').at(-1) as string
5462

5563
this.baseUrl = baseUrl.href.slice(0, baseUrl.href.lastIndexOf(this.envSubDir))
64+
this.bucket = AWS_S3_BUCKET
65+
5666
// credentials are optional since the file store could be public & not need a key to write
5767
const credentials =
5868
AWS_ACCESS_KEY_ID && AWS_SECRET_ACCESS_KEY
5969
? {accessKeyId: AWS_ACCESS_KEY_ID, secretAccessKey: AWS_SECRET_ACCESS_KEY}
6070
: undefined
6171
this.s3 = new S3Client({
6272
credentials,
63-
// The bucket is inferred from the CDN_BASE_URL
64-
bucketEndpoint: true,
73+
// Using true fails to work on the checkExist method, it returns a 403
74+
bucketEndpoint: false,
6575
region: AWS_REGION,
6676
followRegionRedirects: true,
6777
retryStrategy: new CloudflareRetry(3)
@@ -75,7 +85,7 @@ export default class S3Manager extends FileStoreManager {
7585
protected async putFile(file: ArrayBufferLike, fullPath: string) {
7686
const s3Params = {
7787
Body: Buffer.from(file),
78-
Bucket: this.baseUrl,
88+
Bucket: this.bucket,
7989
Key: fullPath,
8090
ContentType: mime.lookup(fullPath) || 'application/octet-stream'
8191
}
@@ -98,17 +108,18 @@ export default class S3Manager extends FileStoreManager {
98108
async checkExists(key: string, assetDir?: FileAssetDir) {
99109
const Key = this.prependPath(key, assetDir)
100110
try {
101-
await this.s3.send(new HeadObjectCommand({Bucket: this.baseUrl, Key}))
111+
await this.s3.send(new HeadObjectCommand({Bucket: this.bucket, Key}))
102112
} catch (e) {
103113
if (e instanceof Error && e.name === 'NotFound') return false
114+
Logger.log(`Invalid error ${(e as Error).name}`)
104115
}
105116
return true
106117
}
107118

108119
async presignUrl(url: string) {
109120
// Important to decodeURI so `getSignedUrl` doesn't double encode e.g. local|123/avatars/123.jpg
110121
const key = decodeURI(url.slice(this.baseUrl.length))
111-
const command = new GetObjectCommand({Bucket: this.baseUrl, Key: key})
122+
const command = new GetObjectCommand({Bucket: this.bucket, Key: key})
112123
const encodedUri = await getSignedUrl(this.s3, command, {expiresIn: 604800})
113124
return encodedUri
114125
}

packages/server/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"description": "An open-source app for building smarter, more agile teams.",
44
"author": "Parabol Inc. <love@parabol.co> (http://github.com/ParabolInc)",
55
"license": "AGPL-3.0",
6-
"version": "8.21.0",
6+
"version": "8.21.1",
77
"repository": {
88
"type": "git",
99
"url": "https://github.com/ParabolInc/parabol"
@@ -126,7 +126,7 @@
126126
"oauth-1.0a": "^2.2.6",
127127
"openai": "^4.53.0",
128128
"oy-vey": "^0.12.1",
129-
"parabol-client": "8.21.0",
129+
"parabol-client": "8.21.1",
130130
"pg": "^8.5.1",
131131
"react": "^17.0.2",
132132
"react-dom": "^17.0.2",

scripts/toolboxSrc/pushToCDN.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import fs from 'fs'
22
import getFileStoreManager from 'parabol-server/fileStorage/getFileStoreManager'
3+
import {Logger} from 'parabol-server/utils/Logger'
34
import path from 'path'
45
import getProjectRoot from '../webpack/utils/getProjectRoot'
5-
import {Logger} from 'parabol-server/utils/Logger'
66

77
const PROJECT_ROOT = getProjectRoot()
88

@@ -66,7 +66,7 @@ const pushServerAssetsToCDN = async () => {
6666
// static assets in /dist/images are already hosted at /static/images
6767
if (process.env.FILE_STORE_PROVIDER === 'local') return
6868
const targetObject = `images/${filename}`
69-
const exists = await fileStoreManager.checkExists(targetObject)
69+
const exists = await fileStoreManager.checkExists(targetObject, 'build')
7070
if (exists) return false
7171
const buffer = await fs.promises.readFile(path.join(localServerAssetsDir, filename))
7272
const url = await fileStoreManager.putBuildFile(buffer, targetObject)

0 commit comments

Comments
 (0)