Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
2abaa88
PM-6633 - lead intake form updates
vas3a Oct 28, 2026
5b5ed1e
PM-6637 - Engagement Lead Intake Form for wipro direct
vas3a Oct 29, 2026
ad5c2bd
Merge pull request #2576 from topcoder-platform/PM-6633_lead-intake-f…
vas3a Oct 29, 2026
3e79517
PM-6636 - Engagement Leads page changes
vas3a Oct 29, 2026
199ce6d
Merge pull request #2577 from topcoder-platform/PM-6633_lead-intake-f…
vas3a Oct 29, 2026
c9ded72
PM-6655 - Add the Leads tab to work app
vas3a Oct 29, 2026
9e29b27
PM-6682 - copy skills from lead to engagement
vas3a Oct 29, 2026
a988daf
Merge pull request #2578 from topcoder-platform/PM-6633_lead-intake-f…
vas3a Oct 29, 2026
8d784f6
PM-6679 - Keep the Hide Test Projects option selected by default
vas3a Oct 30, 2026
5a28faf
PM-6680 - All Assignment view: Keep the Assigned status selected
vas3a Oct 30, 2026
70b522f
PM-6681 - Engagement portal: Changes to My Assignments
vas3a Oct 30, 2026
c5487d1
PM-6683 - Leads page: Clear filter should not remove the default stat…
vas3a Oct 30, 2026
7be74a1
PM-6684 - Remove the extra fields from the engagement Lead(wipro dire…
vas3a Oct 30, 2026
67eef82
PM-6633 - fixes
vas3a Oct 30, 2026
1287ce7
lint
vas3a Oct 30, 2026
004d4e5
PM-6685 - Showcase customer stories tags
vas3a Oct 30, 2026
562f88e
Merge pull request #2579 from topcoder-platform/dev-fixes
vas3a Oct 30, 2026
58df35a
PM-6688 Add quarterly sales dashboards and sortable period tables
jmgasper Nov 1, 2026
7cf0f86
Merge pull request #2581 from topcoder-platform/PM-6688_quarterly-das…
jmgasper Nov 1, 2026
aa8daa1
PM-6674: Reject appeals when the original score is unchanged
jmgasper Nov 1, 2026
f3c72cd
PM-6657: Allow XML forum attachments
jmgasper Nov 1, 2026
f407798
Merge pull request #2583 from topcoder-platform/PM-6657
jmgasper Nov 1, 2026
88e5b73
Merge pull request #2582 from topcoder-platform/PM-6674
jmgasper Nov 1, 2026
d026801
PM-6684 - fix wipro forms
vas3a Nov 2, 2026
3ad4a92
Merge pull request #2585 from topcoder-platform/PM-6684_wipro-forms
vas3a Nov 2, 2026
6a3b1ea
PM-6689 - show submit button as disabled
vas3a Nov 2, 2026
0d94fff
PM-6693 - allow admin user to use timesheet as normal user
vas3a Nov 2, 2026
bb8d2da
PM-6690 - Allow users to submit timesheet records with 0 hours
vas3a Nov 2, 2026
de65e7c
PM-6694 - Changes on the Approve Timesheet Entries popup
vas3a Nov 2, 2026
1a3682b
PM-6695 - multiple notes for engagement leads
vas3a Nov 2, 2026
6bb42fd
PM-6700 PM-6697 Add Revenue Forecast and FY Closure dashboards
jmgasper Nov 2, 2026
ec15350
PM-6696 - Remove Experience level from wipro consumption form and view
vas3a Nov 2, 2026
ccebd22
PM-6700 Keep forecast card props within lint line limits
jmgasper Nov 2, 2026
5f62beb
Merge pull request #2588 from topcoder-platform/PM-6684_wipro-forms
vas3a Nov 2, 2026
7a953d9
Merge pull request #2587 from topcoder-platform/PM-6700_PM-6697-reven…
jmgasper Nov 2, 2026
b7ed880
PM-6701 - Hide prop in modal
vas3a Nov 3, 2026
5b354e7
Fix font weight
vas3a Nov 3, 2026
eeb3989
PM-6690 - Allow users to submit timesheet records with 0 hours
vas3a Nov 3, 2026
d153c0c
Merge pull request #2589 from topcoder-platform/PM-6684_wipro-forms
vas3a Nov 3, 2026
dea588a
Deploy Platform UI with scoped CircleCI OIDC and production approval
jmgasper Nov 5, 2026
3f35211
Merge pull request #2590 from topcoder-platform/deploy-platform-ui-oidc
jmgasper Nov 5, 2026
b7eeb14
Fix pinned browser config download with AWS CLI streaming arguments
jmgasper Nov 5, 2026
ae084cf
Merge pull request #2591 from topcoder-platform/fix/platform-ui-s3-cl…
jmgasper Nov 5, 2026
6e1ab66
Deploy Platform UI production from master with approval
jmgasper Nov 5, 2026
b0fedf9
Merge pull request #2592 from topcoder-platform/fix/platform-ui-maste…
jmgasper Nov 5, 2026
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
406 changes: 159 additions & 247 deletions .circleci/config.yml

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions .github/workflows/trivy.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ on:
branches:
- main
- master
- prod
- dev
- develop
pull_request:
Expand Down
87 changes: 87 additions & 0 deletions deploy/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
# Platform UI deployment

CircleCI validates every branch. Merges to `dev` build and publish the development
site. Merges to `master` build the production artifact and stop at `approve-prod`;
an operator must approve that workflow before `deploy-prod` can publish it.
Other branches and tags do not deploy. The production environment is named `prod`; its source branch is `master`.

## Authentication and configuration

The jobs use CircleCI OIDC V3 directly with AWS STS. They do not use an Auth0
client ID, a shared deployment role, static AWS keys, or Parameter Store.
Trust is restricted to this CircleCI project, repository, and both the checkout
and configuration branch. Separate empty CircleCI contexts enforce the same
project/branch restrictions and disallow SSH reruns and API-supplied configuration.

`config-dev`/`config-prod` can read only the exact S3 object version pinned in
the corresponding manifest. Its SHA-256 is checked before use. These are reviewed
browser settings: Filestack settings and read-only CMS delivery tokens, including
values that become public in the JavaScript bundle. Preview/admin tokens and
server secrets must never be added. The allowlist in `site.py` rejects other keys.

The build process receives those settings and a minimal environment, without AWS
credentials or OIDC tokens. A separate deploy role can publish only to the site's
S3 bucket and invalidate its CloudFront distribution. Both roles explicitly deny
Parameter Store, Secrets Manager, KMS decryption, role chaining, and object deletion.
IAM templates, permissions boundaries, and installation evidence live in the
private [v6-services-iac repository](https://github.com/topcoder-platform/v6-services-iac/tree/main/services/platform-ui).

Node, the AWS executor, and deployment helpers are pinned. The helpers use
`tc-deploy-scripts` v2.0.8, verified against commit
`75bf839e1b4fa4b8dcd5ce36dad0a4d080e9a73d`. `site.py` adds the static-site flow;
it does not invoke the ECS deployment command.

## Publishing and rollback

The build records the source revision, configuration digest, and every artifact
file's digest. Deployment checks these before assuming its role. It verifies the
CloudFront origin and requires S3 versioning, uploads assets first, and publishes
`asset-manifest.json`, `index.html`, and the `/gigs/index.html` alias last.
Old assets are retained. Hashed files under `static/` have long-lived caching;
entry points and other files require revalidation.

The job waits for CloudFront invalidation and checks that the public HTML matches
the approved artifact. If promotion or verification fails after entry-point
publication begins, it attempts to restore the previous entry points and invalidate
again. S3 versions retain the prior objects for operator recovery. A successful
job stores a deployment receipt with source, prior entry-point versions, and the
verified public HTML digest. Investigate failed rollback/invalidation before
retrying; a failed job is not evidence of a healthy site.

## First rollout

1. Merge this change to `dev` and verify the CircleCI release, login, CMS-backed
pages, and `/gigs` routing at the development site.
2. Open and review a `dev` → `master` PR, including application changes since the
production baseline. Merge it only after dev validation. This replaces the
legacy workflow on `master` with the approved OIDC workflow.
3. The production build stops at `approve-prod`. Approve that job when ready to
publish the reviewed artifact; merging alone does not publish production.
4. Retire shared credentials as part of the coordinated legacy-role removal.
No separate `prod` branch is needed. Production OIDC trust, CircleCI context
restrictions, the manifest and runtime branch validation all require `master`.

The new workflow replaces the old QA, arbitrary branch, and `dev-*` tag deployment
paths; `yarn deploy:dev` is removed. CMS and asset origins now follow
`REACT_APP_HOST_ENV`: production builds use production CMS resources.

To change browser configuration, an operator publishes a new reviewed JSON object
version, updates the build role and its boundary in private IaC, and updates the
manifest's version ID and SHA-256 in a reviewed application PR. CI cannot select
an arbitrary object or fetch server configuration.

## Validation

With the pinned helpers checked out at `/tmp/tc-deploy-scripts`:

```sh
python3 -m unittest discover -s deploy/tests -v
yarn install --frozen-lockfile --non-interactive
yarn lint
CI=true yarn test:no-watch --runInBand --watch=false --runTestsByPath \
src/libs/cms/cms.client.spec.ts src/config/environments/react-env.spec.ts
```

The release build uses `python3 -I deploy/site.py build --manifest deploy/dev.json`
with the verified browser configuration and CircleCI source metadata. Local
application development continues to use the existing `.environments` setup.
21 changes: 21 additions & 0 deletions deploy/dev.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"schemaVersion": 1,
"environment": "dev",
"branch": "dev",
"region": "us-east-1",
"accountId": "811668436784",
"repository": "github.com/topcoder-platform/platform-ui",
"circleciOrgId": "947bef5e-1669-415d-b83c-4fc85155b7df",
"circleciProjectId": "444cff42-4443-4f44-a0df-29da98e46ed3",
"buildRoleArn": "arn:aws:iam::811668436784:role/platform-ui-dev-build",
"deployRoleArn": "arn:aws:iam::811668436784:role/platform-ui-dev-deploy",
"bucket": "platform-mvp.topcoder-dev.com",
"distributionId": "EFA7R1KH3UX5M",
"publicUrl": "https://platform-ui.topcoder-dev.com",
"buildConfig": {
"bucket": "tc-platform-dev",
"key": "deployment/platform-ui/dev-browser-config.json",
"versionId": "p16HdKng2Lf1jl_n0AxpivN_0M4Qx6zy",
"sha256": "98c7aac22cd70c95eda5810364cd38921ccd9f824e206207f22f0b409707ee3f"
}
}
21 changes: 21 additions & 0 deletions deploy/prod.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"schemaVersion": 1,
"environment": "prod",
"branch": "master",
"region": "us-east-1",
"accountId": "409275337247",
"repository": "github.com/topcoder-platform/platform-ui",
"circleciOrgId": "947bef5e-1669-415d-b83c-4fc85155b7df",
"circleciProjectId": "444cff42-4443-4f44-a0df-29da98e46ed3",
"buildRoleArn": "arn:aws:iam::409275337247:role/platform-ui-prod-build",
"deployRoleArn": "arn:aws:iam::409275337247:role/platform-ui-prod-deploy",
"bucket": "platform-mvp.topcoder.com",
"distributionId": "EE83GX7FG0PB8",
"publicUrl": "https://platform-ui.topcoder.com",
"buildConfig": {
"bucket": "tc-platform-prod",
"key": "deployment/platform-ui/prod-browser-config.json",
"versionId": "wlgT.PqjHZIoLvdys_YnHDv8_cP4.qVd",
"sha256": "551ed9d49397a69129ec5fd923427cdd3e3247b4b85dfe8de00c4425e5d5da91"
}
}
Loading
Loading