From 9a53e1f2d4aa3d8720eecca981ae9820fda51517 Mon Sep 17 00:00:00 2001 From: Atithi Singh Date: Sat, 7 Feb 2026 05:21:47 +0530 Subject: [PATCH 1/6] update(workers): Updated Admin Action Integration --- .github/README.md | 34 ++++++++++++++++++-------- .github/workflows/code-quality.yml | 3 +++ .github/workflows/issue-assignment.yml | 2 +- .github/workflows/pr-review.yml | 8 ++++-- .github/workflows/protect-main.yml | 3 +++ 5 files changed, 37 insertions(+), 13 deletions(-) diff --git a/.github/README.md b/.github/README.md index f69b0ae..00ae8f1 100644 --- a/.github/README.md +++ b/.github/README.md @@ -36,24 +36,28 @@ The GitHub automation system provides: - ✅ `perf/issue-202-optimization` ### 2. `issue-assignment.yml` -**Purpose:** Manage issue assignment via `/assign` command +**Purpose:** Manage issue assignment via `/assign` command (maintainers only) **Triggers:** `issue_comment` (created, edited) **Jobs:** - `assign-issue` - Processes `/assign @username` commands in issue comments - - Validates GitHub user exists + - **Validates authorization** (only maintainers can assign) - Assigns issue to mentioned user - Adds 'assigned' label - Posts confirmation comment - `prevent-auto-assignment` - Removes any auto-assignments when issue is created - - Explains `/assign` command requirement + - Prevents accidental assignments + - Directs contributors to request assignment -**Usage:** +**Usage (Maintainers Only):** ``` /assign @github-username ``` +**For Contributors:** +Comment expressing interest on an issue, then wait for a maintainer to use the `/assign` command. + ### 3. `auto-manage-labels.yml` **Purpose:** Automatically create and manage repository labels @@ -169,13 +173,23 @@ Templates for different issue types: ## Getting Started as a Contributor -### Step 1: Assignment -Create an issue (or find an existing one) and request assignment: +### Step 1: Request Assignment +Find an issue you want to work on and comment expressing interest: +``` +I'd like to work on this issue +``` + +**Wait for maintainer to assign it to you.** + +### Step 2: Official Assignment +The maintainer will review your request and use: ``` /assign @your-github-username ``` -### Step 2: Branch Creation +**Once assigned (you'll see the 'assigned' label), you're ready to start!** + +### Step 3: Branch Creation Create a branch following the naming convention: ```bash git checkout -b feature/issue-123-brief-description @@ -183,14 +197,14 @@ git checkout -b feature/issue-123-brief-description git checkout -b fix/issue-456-bug-fix-description ``` -### Step 3: Development +### Step 4: Development Make your changes and commit with proper message format: ```bash git commit -m "feat(issue-123): add new feature" git commit -m "fix(issue-456): fix the bug" ``` -### Step 4: Push & Create PR +### Step 5: Push & Create PR ```bash git push origin feature/issue-123-brief-description ``` @@ -201,7 +215,7 @@ GitHub Actions will automatically: - ✅ Run security audits - ✅ Verify metadata and formatting -### Step 5: Review +### Step 6: Review Respond to feedback and update your PR as needed. The workflows will re-run automatically. ## Viewing Workflow Status diff --git a/.github/workflows/code-quality.yml b/.github/workflows/code-quality.yml index dc18af9..f345c3a 100644 --- a/.github/workflows/code-quality.yml +++ b/.github/workflows/code-quality.yml @@ -14,6 +14,7 @@ jobs: permissions: contents: read pull-requests: write + if: github.actor != 'atithi4dev' strategy: matrix: @@ -99,6 +100,7 @@ jobs: permissions: contents: read pull-requests: write + if: github.actor != 'atithi4dev' steps: - name: Checkout code @@ -160,6 +162,7 @@ jobs: permissions: contents: read pull-requests: write + if: github.actor != 'atithi4dev' steps: - name: Checkout code diff --git a/.github/workflows/issue-assignment.yml b/.github/workflows/issue-assignment.yml index 2063aac..5e26cbc 100644 --- a/.github/workflows/issue-assignment.yml +++ b/.github/workflows/issue-assignment.yml @@ -43,7 +43,7 @@ jobs: issue_number: issue.number, owner: context.repo.owner, repo: context.repo.repo, - body: `🚫 **Unauthorized Assignment Attempt**\n\n@${commenter}, you don't have permission to assign issues.\n\n**Only the following can assign issues:**\n- Repository owner (@${repoOwner})\n- Maintainers: ${AUTHORIZED_ASSIGNERS.map(m => '@' + m).join(', ')}\n\nIf you'd like to work on this issue, please ask a maintainer to assign it to you.` + body: `🚫 **Unauthorized Assignment Attempt**\n\n@${commenter}, only maintainers can use the \`/assign\` command.\n\n**To get assigned to an issue:**\n1. Comment expressing interest: "I'd like to work on this issue"\n2. Wait for a maintainer to review your request\n3. Maintainer will use \`/assign @username\` to officially assign it\n\n**Authorized to assign issues:**\n- Repository owner (@${repoOwner})\n- Maintainers: ${AUTHORIZED_ASSIGNERS.map(m => '@' + m).join(', ')}\n\nSee [CONTRIBUTING.md](../../Docs/CONTRIBUTING.md#step-2-request-assignment) for details.` }); return; } diff --git a/.github/workflows/pr-review.yml b/.github/workflows/pr-review.yml index d49436b..b1d728b 100644 --- a/.github/workflows/pr-review.yml +++ b/.github/workflows/pr-review.yml @@ -12,6 +12,7 @@ jobs: permissions: contents: read pull-requests: write + if: github.actor != 'atithi4dev' steps: - name: Checkout code @@ -80,6 +81,7 @@ jobs: permissions: contents: read pull-requests: write + if: github.actor != 'atithi4dev' steps: - name: Validate PR Description @@ -129,6 +131,7 @@ jobs: permissions: contents: read pull-requests: write + if: github.actor != 'atithi4dev' steps: - name: Check Target Branch @@ -168,6 +171,7 @@ jobs: permissions: contents: read pull-requests: write + if: github.actor != 'atithi4dev' steps: - name: Check Related Issues @@ -203,14 +207,14 @@ jobs: issue_number: pr.number, owner: context.repo.owner, repo: context.repo.repo, - body: `⚠️ **Issue Not Assigned:** Issue #${issueNum} is referenced but not assigned to anyone.\n\nPlease ensure the issue is assigned using \`/assign @username\` in the issue discussion.\n\nSee [CONTRIBUTING.md](../../CONTRIBUTING.md) for assignment workflow.` + body: `⚠️ **Issue Not Assigned:** Issue #${issueNum} is referenced but not assigned to anyone.\n\n**Action required:**\nOpen issue #${issueNum} and comment expressing interest: "I'd like to work on this"\n\nA maintainer will review and assign it to you using the \`/assign @username\` command.\n\nSee [CONTRIBUTING.md](../../Docs/CONTRIBUTING.md#step-2-request-assignment) for details.` }); } else { github.rest.issues.createComment({ issue_number: pr.number, owner: context.repo.owner, repo: context.repo.repo, - body: `✅ **Issue Assignment Verified:** PR correctly references assigned issue #${issueNum} (@${issue.assignee.login}).` + body: `✅ **Issue Assignment Verified:** PR correctly references assigned issue #${issueNum} (assigned to @${issue.assignee.login}).` }); } } catch (error) { diff --git a/.github/workflows/protect-main.yml b/.github/workflows/protect-main.yml index 1668954..961f048 100644 --- a/.github/workflows/protect-main.yml +++ b/.github/workflows/protect-main.yml @@ -8,6 +8,7 @@ jobs: protect-main: runs-on: ubuntu-latest name: Enforce PR Target Branch + if: github.actor != 'atithi4dev' steps: - name: Check PR Target Branch @@ -68,6 +69,7 @@ jobs: validate-pr-content: runs-on: ubuntu-latest name: Validate PR Content + if: github.actor != 'atithi4dev' steps: - uses: actions/checkout@v4 @@ -105,6 +107,7 @@ jobs: assign-check: runs-on: ubuntu-latest name: Verify Assignment through /assign Command + if: github.actor != 'atithi4dev' steps: - name: Check if PR is assigned From 8b0775a877f0898f282085dd7defdcbefe5f691c Mon Sep 17 00:00:00 2001 From: Atithi Singh Date: Sat, 7 Feb 2026 05:41:15 +0530 Subject: [PATCH 2/6] update(workers): Updated Admin Action Integration --- .github/workflows/code-quality.yml | 2 +- .github/workflows/issue-assignment.yml | 6 +++--- .github/workflows/maintenance.yml | 2 +- .github/workflows/pr-review.yml | 4 ++-- .github/workflows/protect-main.yml | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/code-quality.yml b/.github/workflows/code-quality.yml index f345c3a..7b008a9 100644 --- a/.github/workflows/code-quality.yml +++ b/.github/workflows/code-quality.yml @@ -153,7 +153,7 @@ jobs: issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, - body: '🔒 **Security Audit:** Dependencies have been checked for known vulnerabilities. Address any critical or high-severity issues before merge. See [SECURITY.md](../SECURITY.md) for guidelines.' + body: `🔒 **Security Audit:** Dependencies have been checked for known vulnerabilities. Address any critical or high-severity issues before merge. See [SECURITY.md](https://github.com/${context.repo.owner}/${context.repo.repo}/blob/main/.github/SECURITY.md) for guidelines.` }); build-check: diff --git a/.github/workflows/issue-assignment.yml b/.github/workflows/issue-assignment.yml index 5e26cbc..22426e0 100644 --- a/.github/workflows/issue-assignment.yml +++ b/.github/workflows/issue-assignment.yml @@ -43,7 +43,7 @@ jobs: issue_number: issue.number, owner: context.repo.owner, repo: context.repo.repo, - body: `🚫 **Unauthorized Assignment Attempt**\n\n@${commenter}, only maintainers can use the \`/assign\` command.\n\n**To get assigned to an issue:**\n1. Comment expressing interest: "I'd like to work on this issue"\n2. Wait for a maintainer to review your request\n3. Maintainer will use \`/assign @username\` to officially assign it\n\n**Authorized to assign issues:**\n- Repository owner (@${repoOwner})\n- Maintainers: ${AUTHORIZED_ASSIGNERS.map(m => '@' + m).join(', ')}\n\nSee [CONTRIBUTING.md](../../Docs/CONTRIBUTING.md#step-2-request-assignment) for details.` + body: `🚫 **Unauthorized Assignment Attempt**\n\n@${commenter}, only maintainers can use the \`/assign\` command.\n\n**To get assigned to an issue:**\n1. Comment expressing interest: "I'd like to work on this issue"\n2. Wait for a maintainer to review your request\n3. Maintainer will use \`/assign @username\` to officially assign it\n\n**Authorized to assign issues:**\n- Repository owner (@${repoOwner})\n- Maintainers: ${AUTHORIZED_ASSIGNERS.map(m => '@' + m).join(', ')}\n\nSee [CONTRIBUTING.md](https://github.com/${context.repo.owner}/${context.repo.repo}/blob/main/Docs/CONTRIBUTING.md#step-2-request-assignment) for details.` }); return; } @@ -106,7 +106,7 @@ jobs: issue_number: issue.number, owner: context.repo.owner, repo: context.repo.repo, - body: `✅ Issue assigned to @${assignee}. Please follow the [CONTRIBUTING.md](../../Docs/CONTRIBUTING.md) guidelines.` + body: `✅ Issue assigned to @${assignee}. Please follow the [CONTRIBUTING.md](https://github.com/${context.repo.owner}/${context.repo.repo}/blob/main/Docs/CONTRIBUTING.md) guidelines.` }); } catch (error) { github.rest.issues.createComment({ @@ -183,7 +183,7 @@ jobs: issue_number: issue.number, owner: context.repo.owner, repo: context.repo.repo, - body: `🚫 **Unauthorized assignment detected and removed!**\n\n**This issue cannot be assigned without authorization.**\n\nIssues can only be assigned by:\n- Repository owner (@${repoOwner})\n- Maintainers: ${AUTHORIZED_ASSIGNERS.map(m => '@' + m).join(', ')}\n\n**To request assignment:**\nAsk a maintainer to use: \`/assign @username\`\n\n**Why this rule exists:**\nThis ensures proper tracking and prevents unauthorized assignments. See [CONTRIBUTING.md](../../Docs/CONTRIBUTING.md) for details.` + body: `🚫 **Unauthorized assignment detected and removed!**\n\n**This issue cannot be assigned without authorization.**\n\nIssues can only be assigned by:\n- Repository owner (@${repoOwner})\n- Maintainers: ${AUTHORIZED_ASSIGNERS.map(m => '@' + m).join(', ')}\n\n**To request assignment:**\nAsk a maintainer to use: \`/assign @username\`\n\n**Why this rule exists:**\nThis ensures proper tracking and prevents unauthorized assignments. See [CONTRIBUTING.md](https://github.com/${context.repo.owner}/${context.repo.repo}/blob/main/Docs/CONTRIBUTING.md) for details.` }); console.log(`Removed unauthorized assignment for issue #${issue.number}`); diff --git a/.github/workflows/maintenance.yml b/.github/workflows/maintenance.yml index b34aa6c..8cb40b6 100644 --- a/.github/workflows/maintenance.yml +++ b/.github/workflows/maintenance.yml @@ -234,6 +234,6 @@ jobs: owner: context.repo.owner, repo: context.repo.repo, title: '🔒 Security: Dependency Vulnerabilities Detected', - body: '⚠️ **Automated Security Alert**\n\nDependency vulnerabilities have been detected in the latest scan.\n\n**Action Required:**\n1. Run `npm audit` to see details\n2. Run `npm audit fix` for automatic fixes\n3. Review high/critical vulnerabilities\n4. Create PR to fix issues\n\nSee [SECURITY.md](../SECURITY.md) for guidelines.', + body: `⚠️ **Automated Security Alert**\n\nDependency vulnerabilities have been detected in the latest scan.\n\n**Action Required:**\n1. Run \`npm audit\` to see details\n2. Run \`npm audit fix\` for automatic fixes\n3. Review high/critical vulnerabilities\n4. Create PR to fix issues\n\nSee [SECURITY.md](https://github.com/${context.repo.owner}/${context.repo.repo}/blob/main/.github/SECURITY.md) for guidelines.`, labels: ['security', 'priority-high'] }); diff --git a/.github/workflows/pr-review.yml b/.github/workflows/pr-review.yml index b1d728b..196f078 100644 --- a/.github/workflows/pr-review.yml +++ b/.github/workflows/pr-review.yml @@ -58,7 +58,7 @@ jobs: comment += '\n**Valid Types:** feat, fix, docs, style, refactor, perf, test, chore\n'; comment += '**Example:** `feat(issue-45): add new authentication endpoint`\n'; - comment += '\nPlease see [CONTRIBUTING.md](../../CONTRIBUTING.md#commit-guidelines) for detailed guidelines.'; + comment += `\nPlease see [CONTRIBUTING.md](https://github.com/${context.repo.owner}/${context.repo.repo}/blob/main/Docs/CONTRIBUTING.md#commit-guidelines) for detailed guidelines.`; github.rest.issues.createComment({ issue_number: context.issue.number, @@ -161,7 +161,7 @@ jobs: issue_number: pr.number, owner: context.repo.owner, repo: context.repo.repo, - body: `🚫 **Branch Protection:** This PR targets \`main\`. All changes must go through the \`test\` branch first.\n\n**Action Required:**\n1. Close this PR\n2. Create a new PR targeting the \`test\` branch\n3. Once merged to \`test\`, create a release PR from \`test\` to \`main\`\n\n**Note:** Only authorized admins can create PRs to \`main\`.\n\nSee [CONTRIBUTING.md](../../Docs/CONTRIBUTING.md) for details.` + body: `🚫 **Branch Protection:** This PR targets \`main\`. All changes must go through the \`test\` branch first.\n\n**Action Required:**\n1. Close this PR\n2. Create a new PR targeting the \`test\` branch\n3. Once merged to \`test\`, create a release PR from \`test\` to \`main\`\n\n**Note:** Only authorized admins can create PRs to \`main\`.\n\nSee [CONTRIBUTING.md](https://github.com/${context.repo.owner}/${context.repo.repo}/blob/main/Docs/CONTRIBUTING.md) for details.` }); } diff --git a/.github/workflows/protect-main.yml b/.github/workflows/protect-main.yml index 961f048..3a11fd3 100644 --- a/.github/workflows/protect-main.yml +++ b/.github/workflows/protect-main.yml @@ -43,7 +43,7 @@ jobs: issue_number: pr.number, owner: context.repo.owner, repo: context.repo.repo, - body: `🚫 **Branch Protection:** This PR targets \`main\`. All changes must go through the \`test\` branch first.\n\n**Action Required:**\n1. Close this PR\n2. Create a new PR targeting the \`test\` branch\n3. Once merged to \`test\`, create a release PR from \`test\` to \`main\`\n\n**Note:** Only authorized admins can create PRs directly to \`main\`.\n\nSee [CONTRIBUTING.md](../../Docs/CONTRIBUTING.md) for details.` + body: `🚫 **Branch Protection:** This PR targets \`main\`. All changes must go through the \`test\` branch first.\n\n**Action Required:**\n1. Close this PR\n2. Create a new PR targeting the \`test\` branch\n3. Once merged to \`test\`, create a release PR from \`test\` to \`main\`\n\n**Note:** Only authorized admins can create PRs directly to \`main\`.\n\nSee [CONTRIBUTING.md](https://github.com/${context.repo.owner}/${context.repo.repo}/blob/main/Docs/CONTRIBUTING.md) for details.` }); core.setFailed('Unauthorized PR to main branch'); process.exit(1); From eb257d691351ca11a6cc261771994b172d081d16 Mon Sep 17 00:00:00 2001 From: Atithi Singh Date: Sat, 7 Feb 2026 06:09:24 +0530 Subject: [PATCH 3/6] update(workers): Updated Admin Action Integration >< README.md --- Docs/BUILDER_IMAGES_MAPPING.md | 269 +++++++++++++++++++++++++++++++++ README.md | 21 ++- 2 files changed, 278 insertions(+), 12 deletions(-) create mode 100644 Docs/BUILDER_IMAGES_MAPPING.md diff --git a/Docs/BUILDER_IMAGES_MAPPING.md b/Docs/BUILDER_IMAGES_MAPPING.md new file mode 100644 index 0000000..ae48182 --- /dev/null +++ b/Docs/BUILDER_IMAGES_MAPPING.md @@ -0,0 +1,269 @@ +# Builder Images & ECS Task Mapping + +This document outlines the relationship between Workers, ECS Tasks, and Builder Images in the Veren deployment pipeline. + +## Architecture Overview + +``` +WORKERS/build-worker + └─> Triggers ECS Tasks (via AWS ECS API) + └─> ECS Tasks run containers from ECR + └─> ECR containers built from BUILDER_IMAGES/ +``` + +--- + +## Worker → ECS Task → Builder Image Flow + +### 1. Frontend Build Pipeline + +**Worker Path:** `WORKERS/build-worker/src/services/distributionHandler/buildFrontend.ts` + +#### Node.js 18 Projects +- **ECS Config:** `frontendConfig18` in `WORKERS/build-worker/src/config/ECSconfig.ts` +- **ECS Task Definition:** `arn:aws:ecs:ap-south-1:account_id:task-definition/frontend-builder-18:4` +- **ECS Cluster:** `arn:aws:ecs:ap-south-1:account_id:cluster/builder` +- **Container Name:** `frontend-builder-18` (from `FRONTEND18CONTAINER` env var) +- **Builder Image Source:** `BUILDER_IMAGES/builder-image-frontend/` +- **Dockerfile:** `BUILDER_IMAGES/builder-image-frontend/dockerfiles/Dockerfile.18x.dev` +- **Base Image:** `ubuntu:focal` with Node.js 18 +- **Image in ECR:** `{account_id}.dkr.ecr.ap-south-1.amazonaws.com/frontend-builder-18` + +**What it does:** +- Clones user's repository +- Navigates to frontend directory +- Runs `npm install` (or custom install command) +- Runs `npm run build` (or custom build command) +- Uploads build artifacts to S3 bucket `veren-v2/__outputs/{PROJECT_ID}/` + +#### Node.js 20 Projects +- **ECS Config:** `frontendConfig20` in `WORKERS/build-worker/src/config/ECSconfig.ts` +- **ECS Task Definition:** `arn:aws:ecs:ap-south-1:account_id:task-definition/builder-task-20:5` +- **ECS Cluster:** `arn:aws:ecs:ap-south-1:account_id:cluster/builder` +- **Container Name:** `builder-task-20-image` (from `FRONTEND20CONTAINER` env var) +- **Builder Image Source:** `BUILDER_IMAGES/builder-image-frontend/` +- **Dockerfile:** `BUILDER_IMAGES/builder-image-frontend/dockerfiles/Dockerfile.20x.dev` +- **Base Image:** `ubuntu:focal` with Node.js 20 +- **Image in ECR:** `{account_id}.dkr.ecr.ap-south-1.amazonaws.com/builder-task-20-image` + +**What it does:** +- Same as Node 18 pipeline but with Node.js 20 runtime + +--- + +### 2. Backend Build Pipeline + +**Worker Path:** `WORKERS/build-worker/src/services/distributionHandler/buildBackend.ts` + +- **ECS Config:** `backendECSConfig` in `WORKERS/build-worker/src/config/ECSconfig.ts` +- **ECS Task Definition:** `arn:aws:ecs:ap-south-1:account_id:task-definition/backend-build-worker:1` +- **ECS Cluster:** `arn:aws:ecs:ap-south-1:account_id:cluster/backend-builder` +- **Container Name:** `backend-build-worker` (from `BACKEND_CONTAINER` env var) +- **Builder Image Source:** `BUILDER_IMAGES/build-image-backend/` +- **Dockerfile:** `BUILDER_IMAGES/build-image-backend/Dockerfile` +- **Base Image:** `node:20-bullseye` + Kaniko executor +- **Image in ECR:** `{account_id}.dkr.ecr.ap-south-1.amazonaws.com/backend-build-worker` + +**What it does:** +- Clones user's repository +- Navigates to backend directory +- Copies appropriate Dockerfile based on Node version (18 or 20): + - Node 18: `BUILDER_IMAGES/build-image-backend/dockerbackend/Dockerfile_node18/Dockerfile` + - Node 20: `BUILDER_IMAGES/build-image-backend/dockerbackend/Dockerfile_node20/Dockerfile` +- Uses Kaniko to build Docker image for user's backend +- Pushes built image to ECR with tag: `{ECR_URI}:{PROJECT_ID}-{DEPLOYMENTID}` + +--- + +## Builder Images Detailed Breakdown + +### Frontend Builder Images + +Located in: `BUILDER_IMAGES/builder-image-frontend/` + +| Component | Purpose | +|-----------|---------| +| `main.sh` | Entry point: clones git repo and executes `script.js` | +| `script.js` | Main build logic: installs deps, runs build, uploads to S3 | +| `publisher.js` | Kafka event publisher for build status updates | +| `utils/` | Helper utilities (e.g., recursive directory reading) | +| `kafka.pem` | Kafka SSL certificate for secure connections | +| `dockerfiles/Dockerfile.18x.dev` | Node.js 18 builder image | +| `dockerfiles/Dockerfile.20x.dev` | Node.js 20 builder image | + +**Environment Variables Required:** +- `GIT_REPOSITORY__URL` - Repository to clone +- `PROJECT_ID` - Unique project identifier +- `DEPLOYMENTID` - Deployment instance ID +- `FRONTENDPATH` - Path to frontend directory +- `BUILDCOMMAND` - Build command (default: `npm run build`) +- `INSTALLCOMMAND` - Install command (default: `npm install`) +- `AWS_ACCESS_KEY_ID` - AWS credentials for S3 upload +- `AWS_SECRET_ACCESS_KEY` - AWS credentials for S3 upload +- `KAFKA_*` - Kafka connection details + +--- + +### Backend Builder Image + +Located in: `BUILDER_IMAGES/build-image-backend/` + +| Component | Purpose | +|-----------|---------| +| `Dockerfile` | Main builder image with Kaniko + Node.js 20 | +| `main.sh` | Entry point: clones git repo and executes `script.js` | +| `script.js` | Main build logic: copies Dockerfile, builds with Kaniko, pushes to ECR | +| `publisher.js` | Kafka event publisher for build status updates | +| `dockerbackend/Dockerfile_node18/` | Template Dockerfile for Node.js 18 backends | +| `dockerbackend/Dockerfile_node20/` | Template Dockerfile for Node.js 20 backends | +| `kafka.pem` | Kafka SSL certificate | + +**Environment Variables Required:** +- `GIT_REPOSITORY__URL` - Repository to clone +- `PROJECT_ID` - Unique project identifier +- `DEPLOYMENTID` - Deployment instance ID +- `BACKEND_PATH` - Path to backend directory +- `NODE_VERSION` - Node.js version (18 or 20) +- `ECR_URI` - ECR repository URI for pushing images +- `AWS_ACCESS_KEY_ID` - AWS credentials for ECR push +- `AWS_SECRET_ACCESS_KEY` - AWS credentials for ECR push +- `AWS_REGION` - AWS region +- `KAFKA_*` - Kafka connection details + +--- + +## Configuration Files + +### ECS Configuration +File: `WORKERS/build-worker/src/config/ECSconfig.ts` + +```typescript +export const frontendConfig18 = { + CLUSTER: process.env.AWS_FRONTEND_CLUSTER, + TASK: process.env.TASK18, + CONTAINERNAME: process.env.FRONTEND18CONTAINER +} + +export const frontendConfig20 = { + CLUSTER: process.env.AWS_FRONTEND_CLUSTER, + TASK: process.env.TASK20, + CONTAINERNAME: process.env.FRONTEND20CONTAINER +} + +export const backendECSConfig = { + CLUSTER: process.env.AWS_BACKEND_CLUSTER, + TASK: process.env.TASKBACKEND, + CONTAINERNAME: process.env.BACKEND_CONTAINER +} +``` + +### Environment Variables (Build Worker) +File: `WORKERS/build-worker/.env` + +```env +# ECS Task Definitions +TASK18=arn:aws:ecs:ap-south-1:account_id:task-definition/frontend-builder-18:4 +TASK20=arn:aws:ecs:ap-south-1:account_id:task-definition/builder-task-20:5 +TASKBACKEND=arn:aws:ecs:ap-south-1:account_id:task-definition/backend-build-worker:1 + +# ECS Clusters +AWS_FRONTEND_CLUSTER=arn:aws:ecs:ap-south-1:account_id:cluster/builder +AWS_BACKEND_CLUSTER=arn:aws:ecs:ap-south-1:account_id:cluster/backend-builder + +# ECR Configuration +ECR_URI=account_id.dkr.ecr.ap-south-1.amazonaws.com/my-backend +FRONTEND18CONTAINER=frontend-builder-18 +FRONTEND20CONTAINER=builder-task-20-image +BACKEND_CONTAINER=backend-build-worker +``` + +--- + +## Build Flow Sequence + +### Frontend Build Flow +1. **User submits project** → API Gateway receives request +2. **Clone Worker** → Analyzes project, detects Node.js version (18 or 20) +3. **Build Worker** (`WORKERS/build-worker/src/workers/build.ts`) → Receives job from queue +4. **Build Worker** calls `buildFrontend()` → Selects appropriate ECS config based on Node version +5. **ECS Task starts** → Runs container from ECR (frontend-builder-18 or builder-task-20-image) +6. **Container executes:** + - Clones repository + - Installs dependencies + - Runs build command + - Uploads to S3 +7. **Kafka events published** → Status updates sent to API Gateway +8. **Success/Failure** → User notified via WebSocket + +### Backend Build Flow +1. **User submits project** → API Gateway receives request +2. **Clone Worker** → Analyzes project, detects Node.js version (18 or 20) +3. **Build Worker** receives job, calls `buildBackend()` +4. **ECS Task starts** → Runs backend-build-worker container from ECR +5. **Container executes:** + - Clones repository + - Copies appropriate Dockerfile (Node 18 or 20) + - Builds Docker image with Kaniko + - Pushes image to ECR with tag `{PROJECT_ID}-{DEPLOYMENTID}` +6. **Kafka events published** → Status updates sent +7. **Success/Failure** → User notified + +--- + +## ECR Repositories Summary + +| ECR Repository | Source Builder Image | Node Version | Purpose | +|----------------|---------------------|--------------|---------| +| `frontend-builder-18` | `BUILDER_IMAGES/builder-image-frontend/` (Dockerfile.18x.dev) | 18 | Build frontend projects using Node.js 18 | +| `builder-task-20-image` | `BUILDER_IMAGES/builder-image-frontend/` (Dockerfile.20x.dev) | 20 | Build frontend projects using Node.js 20 | +| `backend-build-worker` | `BUILDER_IMAGES/build-image-backend/` (Dockerfile) | 20 (runtime) | Build backend Docker images using Kaniko | +| `{PROJECT_ID}-{DEPLOYMENTID}` | User's backend code | 18 or 20 | User's deployed backend application | + +--- + +## Key Technologies + +- **Kaniko:** Builds Docker images inside containers without Docker daemon (used in backend builder) +- **AWS ECS Fargate:** Serverless container execution +- **AWS ECR:** Container registry for storing builder images and user application images +- **AWS S3:** Storage for frontend build artifacts +- **Kafka:** Event streaming for build status updates +- **Redis:** Build job queue and pub/sub for logs + +--- + +## Notes + +1. **Frontend builders** are lightweight - they only need Node.js to install deps and run build commands +2. **Backend builder** is heavier - includes Kaniko for building Docker images +3. **Node version detection** happens in Clone Worker (`WORKERS/clone-worker/src/services/detector/detectProjectType.ts`) +4. **Build artifacts:** + - Frontend: Static files in S3 (`veren-v2/__outputs/{PROJECT_ID}/`) + - Backend: Docker images in ECR (`{ECR_URI}:{PROJECT_ID}-{DEPLOYMENTID}`) +5. **Container name mismatch:** There's a typo in `ECSconfig.ts` - `frontendConfig20` uses `FRONTEND18CONTAINER` instead of `FRONTEND20CONTAINER` + +--- + +## Contributing Guidelines + +**⚠️ IMPORTANT for Issue Reporters:** + +When creating issues or reporting bugs related to this build pipeline, you **MUST** specify the exact file paths you are referring to. This repository has a complex structure with multiple services, workers, and builder images. + +**Good Examples:** +- ✅ "Bug in `WORKERS/build-worker/src/services/distributionHandler/buildFrontend.ts` line 105" +- ✅ "Environment variable missing in `BUILDER_IMAGES/build-image-backend/script.js`" +- ✅ "Update needed in `WORKERS/build-worker/src/config/ECSconfig.ts`" + +**Bad Examples:** +- ❌ "Bug in the build worker" +- ❌ "Frontend builder is broken" +- ❌ "Fix the Dockerfile" + +**Why this matters:** +- We have multiple workers: `build-worker`, `clone-worker`, `repo-analyzer` +- We have multiple builder images with similar names +- We have multiple Dockerfiles in different directories +- Ambiguous references slow down issue resolution and can lead to fixes in the wrong place + +Please use the file paths shown in this document as reference when reporting issues. diff --git a/README.md b/README.md index d137ce2..167a002 100644 --- a/README.md +++ b/README.md @@ -3,13 +3,12 @@ ### Veren is a backend driven deployment system that automates building and deploying application from source repositories using a service-oriented architecture. ## Guides - -[~ Documentation](https://main.veren.site/docs) +[~ Documentation]() -[~ API Walkthrough](https://main.veren.site/api-walkthrough) - -[~ Fast Setups?](#project-setup) - -[~ Buy me a Coffee](https://main.veren.site/cofee) +[~ API Walkthrough](https://github.com/atithi4dev/veren/blob/main/Docs/API_DOCUMENTATION.md) +[~ Contribution Guidelines](https://github.com/atithi4dev/veren/blob/main/Docs/CONTRIBUTING.md) +[~ For Contributers](https://github.com/atithi4dev/veren/blob/main/Docs/GITHUB_SETUP.md) +[~ ECR IMAGES FOR USE CASE](https://github.com/atithi4dev/veren/blob/main/Docs/BUILDER_IMAGES_MAPPING.md) ## Project Setup - @@ -20,13 +19,13 @@ git clone cd veren ``` -We assume you have already gone through the required configuration and added the necessary files as described in [@essentials](https://github.com/atithi4dev/veren/tree/test/api-gateway) before starting the project. +We assume you have already gone through the required configuration and added the necessary files as described in [@essentials](https://github.com/atithi4dev/veren/blob/main/Docs/GITHUB_SETUP.md) before starting the project. **Start the services using Docker Compose:** ```bash docker compose up --build ``` -Now you are ready to visit [api-guidelines](https://main.veren.site/docs) to access the differnt routes and supported features. +Now you are ready to visit [api-guidelines](https://github.com/atithi4dev/veren/blob/main/Docs/API_DOCUMENTATION.md) to access the differnt routes and supported features. ## Architecture Overview - @@ -51,7 +50,7 @@ As an aspiring developer, there may be design gaps, edge cases, or implementatio Reasonable changes and improvements will be reviewed and merged when possible, keeping in mind academic and development commitments. -Please follow the [contribution guidelines](#contribution-guidelines) below when opening issues or submitting PRs. +Please follow the [contribution guidelines](https://github.com/atithi4dev/veren/blob/main/Docs/CONTRIBUTING.md) below when opening issues or submitting PRs. ## Contribution Guidelines - This project is open to help and suggestions rather than strict contributions. @@ -79,6 +78,4 @@ Reach out via [email](atithisingh.dev@gmail.com) or project discussion.


-
- - +
\ No newline at end of file From f67e98f1c570670270340a32abb81885cd086fe4 Mon Sep 17 00:00:00 2001 From: Atithi Singh Date: Sat, 7 Feb 2026 06:13:37 +0530 Subject: [PATCH 4/6] >< README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 167a002..682773d 100644 --- a/README.md +++ b/README.md @@ -68,7 +68,7 @@ Any help or feedback is appreciated ## Support - Open an [issue](https://github.com/atithi4dev/veren/issues) on the GitHub repository. - +Tag on [Discord](https://discord.gg/tACgSEYz) Reach out via [email](atithisingh.dev@gmail.com) or project discussion. From 2f115842e35c0dcb1c9bf1c51f7ad7c48ce27a9e Mon Sep 17 00:00:00 2001 From: Atithi Singh Date: Sat, 7 Feb 2026 06:27:47 +0530 Subject: [PATCH 5/6] Publisher naming convention changed. --- BUILDER_IMAGES/build-image-backend/publisher.js | 8 ++++---- BUILDER_IMAGES/build-image-backend/script.js | 8 ++++---- .../builder-image-frontend/publisher.js | 4 ++-- BUILDER_IMAGES/builder-image-frontend/script.js | 16 ++++++++-------- .../services/distributionHandler/buildBackend.ts | 4 ++-- .../distributionHandler/buildFrontend.ts | 6 +++--- WORKERS/build-worker/src/workers/build.ts | 12 ++++++------ WORKERS/clone-worker/src/workers/clone.ts | 8 ++++---- .../src/controllers/deployment.controller.ts | 4 ++-- packages/domain/src/index.ts | 2 +- packages/domain/src/publisher.ts | 2 +- 11 files changed, 37 insertions(+), 37 deletions(-) diff --git a/BUILDER_IMAGES/build-image-backend/publisher.js b/BUILDER_IMAGES/build-image-backend/publisher.js index 64f318f..2770a85 100644 --- a/BUILDER_IMAGES/build-image-backend/publisher.js +++ b/BUILDER_IMAGES/build-image-backend/publisher.js @@ -10,7 +10,7 @@ const sns = new SNSClient({ const TOPIC_ARN = process.env.DOMAIN_EVENTS_TOPIC_ARN; -async function publilishEvent(type, projectId, deploymentId, payload) { +async function publishEvent(type, projectId, deploymentId, payload) { await sns.send( new PublishCommand({ TopicArn: TOPIC_ARN, @@ -27,9 +27,9 @@ async function publilishEvent(type, projectId, deploymentId, payload) { ); } -module.exports = { publilishEvent }; +module.exports = { publishEvent }; -console.log("publilishEvent type:", typeof publilishEvent); +console.log("publishEvent type:", typeof publishEvent); -module.exports = { publilishEvent }; \ No newline at end of file +module.exports = { publishEvent }; \ No newline at end of file diff --git a/BUILDER_IMAGES/build-image-backend/script.js b/BUILDER_IMAGES/build-image-backend/script.js index ea733d1..8abbd8e 100644 --- a/BUILDER_IMAGES/build-image-backend/script.js +++ b/BUILDER_IMAGES/build-image-backend/script.js @@ -2,7 +2,7 @@ const { spawn } = require("child_process") const path = require("path"); const fs = require("fs") const { Kafka } = require("kafkajs"); -const { publilishEvent } = require("./publisher"); +const { publishEvent } = require("./publisher"); const PROJECT_ID = process.env.PROJECT_ID; const ECR_URI = process.env.ECR_URI; @@ -85,7 +85,7 @@ async function init() { throw new Error(`Build context path does not exist: ${buildContext}`); } - publilishEvent("BACKEND_PROCESSING", PROJECT_ID, DEPLOYMENTID, { backendDir: BACKEND_DIR }) + publishEvent("BACKEND_PROCESSING", PROJECT_ID, DEPLOYMENTID, { backendDir: BACKEND_DIR }) if (!NODE_VERSION) { @@ -154,7 +154,7 @@ async function init() { "BUILD", `Image build failed with code: ${code}` ); - publilishEvent("BACKEND_BUILD_FAILED", PROJECT_ID, DEPLOYMENTID, { msg: "Image build failed with code: ${code}" }) + publishEvent("BACKEND_BUILD_FAILED", PROJECT_ID, DEPLOYMENTID, { msg: "Image build failed with code: ${code}" }) await safeExit(code, "Build failed"); } }); @@ -163,7 +163,7 @@ async function init() { init().catch(err => { console.log("INIT ERROR ", err); publishLog("FAILURE", "INIT", err.message) - publilishEvent("BACKEND_BUILD_FAILED", PROJECT_ID, DEPLOYMENTID, { msg: err.message }) + publishEvent("BACKEND_BUILD_FAILED", PROJECT_ID, DEPLOYMENTID, { msg: err.message }) .finally(() => safeExit(1, "Build Init Failed")); });; diff --git a/BUILDER_IMAGES/builder-image-frontend/publisher.js b/BUILDER_IMAGES/builder-image-frontend/publisher.js index ed235ad..9365000 100644 --- a/BUILDER_IMAGES/builder-image-frontend/publisher.js +++ b/BUILDER_IMAGES/builder-image-frontend/publisher.js @@ -9,7 +9,7 @@ const sns = new SNSClient({ const TOPIC_ARN = process.env.DOMAIN_EVENTS_TOPIC_ARN; -async function publilishEvent(type, projectId, deploymentId, payload) { +async function publishEvent(type, projectId, deploymentId, payload) { await sns.send( new PublishCommand({ TopicArn: TOPIC_ARN, @@ -23,4 +23,4 @@ async function publilishEvent(type, projectId, deploymentId, payload) { ) } -module.exports = { publilishEvent }; \ No newline at end of file +module.exports = { publishEvent }; \ No newline at end of file diff --git a/BUILDER_IMAGES/builder-image-frontend/script.js b/BUILDER_IMAGES/builder-image-frontend/script.js index 6192488..3602b31 100644 --- a/BUILDER_IMAGES/builder-image-frontend/script.js +++ b/BUILDER_IMAGES/builder-image-frontend/script.js @@ -5,7 +5,7 @@ const mime = require("mime-types"); const readDirRecursive = require("./utils/readDirRecursive"); const { S3Client, PutObjectCommand } = require("@aws-sdk/client-s3"); const { Kafka } = require("kafkajs"); -const { publilishEvent } = require("./publisher"); +const { publishEvent } = require("./publisher"); /* ---------------- ENV ---------------- */ @@ -104,7 +104,7 @@ process.on("SIGTERM", () => safeExit(143, "SIGTERM")); async function init() { await producer.connect(); - await publilishEvent( + await publishEvent( "FRONTEND_PROCESSING", PROJECT_ID, DEPLOYMENTID, @@ -117,7 +117,7 @@ async function init() { const frontendPath = path.join(outputDir, FRONTENDPATH || "."); if (!fs.existsSync(frontendPath)) { - await publilishEvent( + await publishEvent( "FRONTEND_BUILT_FAILED", PROJECT_ID, DEPLOYMENTID, @@ -138,7 +138,7 @@ async function init() { build.on("close", async (code) => { if (code !== 0) { - await publilishEvent( + await publishEvent( "FRONTEND_BUILT_FAILED", PROJECT_ID, DEPLOYMENTID, @@ -168,7 +168,7 @@ async function init() { })); } - await publilishEvent( + await publishEvent( "FRONTEND_BUILT_SUCCESS", PROJECT_ID, DEPLOYMENTID, @@ -179,7 +179,7 @@ async function init() { await safeExit(0, "Success"); } catch (err) { - await publilishEvent( + await publishEvent( "FRONTEND_BUILT_FAILED", PROJECT_ID, DEPLOYMENTID, @@ -191,7 +191,7 @@ async function init() { } init().catch(async (err) => { - await publilishEvent( + await publishEvent( "FRONTEND_BUILT_FAILED", PROJECT_ID, DEPLOYMENTID, @@ -203,7 +203,7 @@ init().catch(async (err) => { /* ---------------- TIMEOUT ---------------- */ setTimeout(async () => { - await publilishEvent( + await publishEvent( "FRONTEND_BUILT_FAILED", PROJECT_ID, DEPLOYMENTID, diff --git a/WORKERS/build-worker/src/services/distributionHandler/buildBackend.ts b/WORKERS/build-worker/src/services/distributionHandler/buildBackend.ts index 03da9b1..89d2d85 100644 --- a/WORKERS/build-worker/src/services/distributionHandler/buildBackend.ts +++ b/WORKERS/build-worker/src/services/distributionHandler/buildBackend.ts @@ -3,7 +3,7 @@ import dotenv from 'dotenv'; import { AwsCredentialIdentity } from "@aws-sdk/types"; import { ECSClient, RunTaskCommand } from "@aws-sdk/client-ecs"; import { backendECSConfig } from "../../config/ECSconfig.js" -import { DeploymentStatus, publilishEvent } from "@veren/domain"; +import { DeploymentStatus, publishEvent } from "@veren/domain"; dotenv.config({ path: '../../../.env' @@ -90,7 +90,7 @@ export async function buildBackend( const resp = await ecsClient.send(backendCommand) if (resp.failures && resp.failures.length > 0) { - publilishEvent({ + publishEvent({ type: DeploymentStatus.INTERNAL_ERROR, projectId, deploymentId, diff --git a/WORKERS/build-worker/src/services/distributionHandler/buildFrontend.ts b/WORKERS/build-worker/src/services/distributionHandler/buildFrontend.ts index e58721b..20fe024 100644 --- a/WORKERS/build-worker/src/services/distributionHandler/buildFrontend.ts +++ b/WORKERS/build-worker/src/services/distributionHandler/buildFrontend.ts @@ -4,7 +4,7 @@ import { AwsCredentialIdentity } from "@aws-sdk/types"; import dotenv from "dotenv"; import logger from "../../logger/logger.js"; -import { DeploymentStatus, publilishEvent } from '@veren/domain'; +import { DeploymentStatus, publishEvent } from '@veren/domain'; dotenv.config({ path: '../../../.env' @@ -119,7 +119,7 @@ export async function buildFrontend( const resp = await ecsClient.send(command18) if (resp.failures && resp.failures.length > 0) { - publilishEvent({ + publishEvent({ type: DeploymentStatus.INTERNAL_ERROR, projectId, deploymentId, @@ -161,7 +161,7 @@ export async function buildFrontend( const resp = await ecsClient.send(command20) if (resp.failures && resp.failures.length > 0) { - publilishEvent({ + publishEvent({ type: DeploymentStatus.INTERNAL_ERROR, projectId, deploymentId, diff --git a/WORKERS/build-worker/src/workers/build.ts b/WORKERS/build-worker/src/workers/build.ts index 61838e7..0c3224e 100644 --- a/WORKERS/build-worker/src/workers/build.ts +++ b/WORKERS/build-worker/src/workers/build.ts @@ -7,7 +7,7 @@ import { buildFrontend } from "../services/distributionHandler/buildFrontend.js" import { buildBackend } from "../services/distributionHandler/buildBackend.js" import { safeExecute } from "../types/index.js"; -import { DeploymentStatus, publilishEvent } from '@veren/domain' +import { DeploymentStatus, publishEvent } from '@veren/domain' import { BuildJobError } from "../utils/buildError.js"; dotenv.config({ path: "../../.env" }); @@ -129,7 +129,7 @@ const worker = new Worker('buildQueue', worker.on('completed', async (job, result) => { const { projectId, deploymentId, FrontendtaskArn, BackendtaskArn } = result; - publilishEvent({ + publishEvent({ type: DeploymentStatus.BUILD_QUEUE_SUCCESS, projectId: result.projectId, deploymentId: result.deploymentId, @@ -147,21 +147,21 @@ worker.on('failed', async (job: any, err: any) => { }); if (err instanceof BuildJobError) { if (err.message == "BACKEND_BUILT_FAILED") { - publilishEvent({ + publishEvent({ type: DeploymentStatus.BACKEND_QUEUE_FAILED, projectId: job?.data?.projectId!, deploymentId: job?.data?.deploymentId!, payload: err.payload, }); } else if (err.message == "FRONTEND_BUILT_FAILED") { - publilishEvent({ + publishEvent({ type: DeploymentStatus.FRONTEND_QUEUE_FAILED, projectId: job?.data?.projectId!, deploymentId: job?.data?.deploymentId!, payload: err.payload, }); } else { - publilishEvent({ + publishEvent({ type: DeploymentStatus.BUILD_UNKNOWN_FAILURE, projectId: job?.data?.projectId!, deploymentId: job?.data?.deploymentId!, @@ -169,7 +169,7 @@ worker.on('failed', async (job: any, err: any) => { }); } } else { - publilishEvent({ + publishEvent({ type: DeploymentStatus.INTERNAL_ERROR, projectId: job?.data?.projectId!, deploymentId: job?.data?.deploymentId!, diff --git a/WORKERS/clone-worker/src/workers/clone.ts b/WORKERS/clone-worker/src/workers/clone.ts index da32e85..42ff728 100644 --- a/WORKERS/clone-worker/src/workers/clone.ts +++ b/WORKERS/clone-worker/src/workers/clone.ts @@ -5,7 +5,7 @@ import fs from "fs/promises"; import logger from "../logger/logger.js"; import { cloneRepo } from "../GitHandler/gitHandler.js"; import repoConfigGenerator, { IBuild } from "../services/repoConfigGenerator.js"; -import { DeploymentStatus, publilishEvent } from "@veren/domain"; +import { DeploymentStatus, publishEvent } from "@veren/domain"; import { CloneJobError } from "../utils/JobError.js"; /* ---------------- TYPES ---------------- */ @@ -154,7 +154,7 @@ worker.on("completed", async (job, result) => { deploymentId: result.deploymentId, }); - publilishEvent({ + publishEvent({ type: DeploymentStatus.REPO_ANALYSIS_SUCCESS, projectId: result.projectId, deploymentId: result.deploymentId, @@ -173,14 +173,14 @@ worker.on("failed", async (job, err) => { }); if (err instanceof CloneJobError) { - publilishEvent({ + publishEvent({ type: DeploymentStatus.REPO_ANALYSIS_FAILED, projectId: job?.data?.projectId!, deploymentId: job?.data?.deploymentId!, payload: err.payload, }); } else { - publilishEvent({ + publishEvent({ type: DeploymentStatus.INTERNAL_ERROR, projectId: job?.data?.projectId!, deploymentId: job?.data?.deploymentId!, diff --git a/api-gateway/src/controllers/deployment.controller.ts b/api-gateway/src/controllers/deployment.controller.ts index ef6bed7..fc19cb4 100644 --- a/api-gateway/src/controllers/deployment.controller.ts +++ b/api-gateway/src/controllers/deployment.controller.ts @@ -7,7 +7,7 @@ import { cloneQueue } from "../Queue/clone-queue.js"; import logger from "../logger/logger.js"; -import { Project, DeploymentStatus, publilishEvent } from "@veren/domain"; +import { Project, DeploymentStatus, publishEvent } from "@veren/domain"; import { Deployment } from "@veren/domain"; @@ -84,7 +84,7 @@ const deployProject = asyncHandler(async (req: Request, res: Response) => { logger.info(`Clone job added for project ${projectId}`); - publilishEvent({ + publishEvent({ type: DeploymentStatus.CREATED, projectId: projectId, deploymentId: newDeployment._id.toString(), diff --git a/packages/domain/src/index.ts b/packages/domain/src/index.ts index d1defb3..9434313 100644 --- a/packages/domain/src/index.ts +++ b/packages/domain/src/index.ts @@ -5,4 +5,4 @@ export { Project } from "./project.model.js" export type { IProject } from "./types/project.js"; export { DeploymentStatus } from './enums.js' -export { publilishEvent } from './publisher.js' \ No newline at end of file +export { publishEvent } from './publisher.js' \ No newline at end of file diff --git a/packages/domain/src/publisher.ts b/packages/domain/src/publisher.ts index e3510db..e6b3e67 100644 --- a/packages/domain/src/publisher.ts +++ b/packages/domain/src/publisher.ts @@ -10,7 +10,7 @@ const sns = new SNSClient({ const TOPIC_ARN = process.env.DOMAIN_EVENTS_TOPIC_ARN!; -export async function publilishEvent(event: { +export async function publishEvent(event: { type: DeploymentStatusI; projectId: string; deploymentId: string; From a10e03a3777cb8dd8d30295107ef8b45f2362aff Mon Sep 17 00:00:00 2001 From: Atithi Singh Date: Sat, 7 Feb 2026 07:18:27 +0530 Subject: [PATCH 6/6] update(workers): Updated Admin Action Integration >< README.md --- .github/README.md | 6 +++--- Docs/CONTRIBUTING.md | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/README.md b/.github/README.md index 00ae8f1..ab2aa89 100644 --- a/.github/README.md +++ b/.github/README.md @@ -228,12 +228,12 @@ Respond to feedback and update your PR as needed. The workflows will re-run auto ## Troubleshooting Common Issues ### "PR targets main branch" -❌ **Problem:** You opened a PR to `main` instead of `test` +❌ **Problem:** You opened a PR to `main` instead of `develop` ✅ **Solution:** 1. Close this PR -2. Create a new PR to the `test` branch -3. Follow the workflow for releases from `test` → `main` +2. Create a new PR to the `develop` branch +3. Follow the workflow for releases from `develop` → `main` ### "Commit message doesn't match format" ❌ **Problem:** Commit message like `"fixed bug"` or `"Update stuff"` diff --git a/Docs/CONTRIBUTING.md b/Docs/CONTRIBUTING.md index c5e14a1..2e7b2d0 100644 --- a/Docs/CONTRIBUTING.md +++ b/Docs/CONTRIBUTING.md @@ -86,10 +86,10 @@ Veren is a **backend-driven deployment system** that automates building and depl - Create a **feature branch** from `main` (e.g., `feature/issue-123-brief-description`) - Make commits with **conventional commit messages** - Push to your fork or branch - - Create a **Pull Request** with clear description linking the issue + - Create a **Pull Request** to the `develop` branch with clear description linking the issue - Wait for **at least 1 code review** - ❌ **DO NOT** force push or directly merge to main - - ❌ **DO NOT** make PRs to main before discussion in the issue + - ❌ **DO NOT** make PRs to main; use `develop` for contributor PRs #### 6. **Communication Guidelines** - Be **respectful and professional**