Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
146 commits
Select commit Hold shift + click to select a range
8b87f3f
feat: add auth service
lcaohoanq Sep 14, 2025
2486e15
Merge pull request #1 from taskgenix/feature/issue-63/implement-authe…
lcaohoanq Sep 14, 2025
25f86ee
Add initial database migration and update model snapshot
DuongNManh Sep 14, 2025
1f1e1a5
Add integration and unit tests for authentication features
lcaohoanq Sep 15, 2025
f163601
chore: update unit test project
lcaohoanq Sep 15, 2025
b149c16
feature: add unittest, integration test
lcaohoanq Sep 15, 2025
2f5efb0
Merge pull request #2 from taskgenix/config-test
lcaohoanq Sep 15, 2025
53082aa
fix: enhance auth route
lcaohoanq Sep 15, 2025
fa7cc07
feat: add common message
lcaohoanq Sep 15, 2025
4c8e270
feat: add jwt config
lcaohoanq Sep 16, 2025
3f92023
feat: implement JWT and OTP services with cleanup functionality
lcaohoanq Sep 16, 2025
1b5791b
fix: fix migration
lcaohoanq Sep 16, 2025
7ad249f
Add JwtToken and OtpCode entities with relationships and properties
DuongNManh Sep 16, 2025
e8fc42b
fix: fix all unit test
lcaohoanq Sep 16, 2025
dfce0e7
Update ci-test.yml
lcaohoanq Sep 16, 2025
7ccbce7
Update ci-test.yml
lcaohoanq Sep 16, 2025
fb673a8
Update ci-test.yml
lcaohoanq Sep 16, 2025
d17916b
Merge pull request #3 from taskgenix/config-test
lcaohoanq Sep 16, 2025
cc77985
feat: init structure
QuocAn108 Sep 18, 2025
04832ca
feat: update API routes and response structures for mobile authentica…
lcaohoanq Sep 18, 2025
641f62d
refactor: clean up whitespace and improve test assertions in AuthCont…
lcaohoanq Sep 18, 2025
f4dee8d
Merge pull request #4 from taskgenix/config-test
lcaohoanq Sep 18, 2025
9a11230
feat: enhance OTP login flow with user creation and token generation
lcaohoanq Sep 18, 2025
8c4cc6d
Merge branch 'config-test' of github.com:taskgenix/TaskGenix-BE into …
lcaohoanq Sep 18, 2025
59cd5b6
Merge pull request #5 from taskgenix/config-test
lcaohoanq Sep 18, 2025
f3d2af2
Chore: re-structure, in progress
QuocAn108 Sep 18, 2025
2d26791
feat: done connect payOS
QuocAn108 Sep 19, 2025
4446098
feat: payment in progress
QuocAn108 Sep 19, 2025
4948df9
feat: init service for userplan in progress
QuocAn108 Sep 19, 2025
05d788d
Feature/no issue/crud api for user (#7)
lcaohoanq Sep 19, 2025
2f537e1
feat: done basic api for user plan
QuocAn108 Sep 19, 2025
30d11eb
feat: add api for cancel payment
QuocAn108 Sep 19, 2025
3191df1
chore: edit route
QuocAn108 Sep 19, 2025
74620a9
Merge pull request #8 from taskgenix/feature/issue-06/implement-crud-…
QuocAn108 Sep 19, 2025
ff203b9
feat: Implement Project Entity
AnPhuoc2410 Sep 19, 2025
fb9c0e0
feat: Project, ProjectMember, Taskgen handle
AnPhuoc2410 Sep 20, 2025
8d75080
feat: Modify the router api for ProjectMember
AnPhuoc2410 Sep 20, 2025
0328bbd
Merge pull request #9 from taskgenix/dev
QuocAn108 Sep 20, 2025
0cb8dc3
feat: response project back
AnPhuoc2410 Sep 20, 2025
9c19551
chore: accecpt https
QuocAn108 Sep 20, 2025
1bf0c9a
feat: Responses good
AnPhuoc2410 Sep 20, 2025
e2bb773
feat: please work it mid night
AnPhuoc2410 Sep 20, 2025
f01f557
feat: add docker compose dev, prod
lcaohoanq Sep 21, 2025
2ca723f
Update ci-test.yml
lcaohoanq Sep 22, 2025
b1cc8b0
feat: Implement Project Entity
AnPhuoc2410 Sep 19, 2025
bdd2095
feat: Project, ProjectMember, Taskgen handle
AnPhuoc2410 Sep 20, 2025
6ade7cf
feat: Modify the router api for ProjectMember
AnPhuoc2410 Sep 20, 2025
269547e
feat: response project back
AnPhuoc2410 Sep 20, 2025
fc1c4d4
feat: Responses good
AnPhuoc2410 Sep 20, 2025
75761d9
feat: please work it mid night
AnPhuoc2410 Sep 20, 2025
6d09697
Merge branch 'feat/CRUD_Workspace' of https://github.com/taskgenix/Ta…
AnPhuoc2410 Sep 23, 2025
9d74583
Merge pull request #10 from taskgenix/feat/CRUD_Workspace
AnPhuoc2410 Sep 23, 2025
adba4fb
config: add static DependencyInjection
AnPhuoc2410 Sep 24, 2025
362c405
Merge pull request #11 from taskgenix/feat/CRUD_Workspace
AnPhuoc2410 Sep 24, 2025
a6cbb92
Feature/issue 37/config be fcm (#12)
lcaohoanq Sep 24, 2025
17c388d
feat: add notification and user device token services to dependency i…
lcaohoanq Sep 24, 2025
201b1f8
feat: implement project progress tracking and related APIs
AnPhuoc2410 Sep 24, 2025
fc48b29
feat: configure Kestrel to listen on localhost with HTTPS support
lcaohoanq Sep 24, 2025
30eafe5
fix: bug redirect https status code 307
AnPhuoc2410 Sep 26, 2025
46d1df7
feat: implement project progress tracking and related APIs
AnPhuoc2410 Sep 24, 2025
62c209b
fix: bug redirect https status code 307
AnPhuoc2410 Sep 26, 2025
abeea15
feat: change the attributer TaskgenReponse
AnPhuoc2410 Sep 27, 2025
58b0506
Merge pull request #13 from taskgenix/feat/CRUD_Workspace
AnPhuoc2410 Sep 27, 2025
d40e65d
Merge pull request #14 from taskgenix/feat/no-issue/change-schema-v8
DuongNManh Sep 27, 2025
581339c
fix: fix register fcm token by user email
lcaohoanq Sep 27, 2025
ad2d2d5
refactor: streamline user email retrieval in device token service
lcaohoanq Sep 27, 2025
128f83c
fix: fix register email field on token
lcaohoanq Sep 27, 2025
69c9ff9
fix: update existing device token registration to handle multiple use…
lcaohoanq Sep 27, 2025
512d7d2
fix: cleanup repo
lcaohoanq Sep 27, 2025
193c4fa
Fix: repo error after format (#15)
DuongNManh Sep 28, 2025
cd3e8ac
Merge branch 'dev' into feature/issue-60/crud-api-for-paymentorder
QuocAn108 Sep 28, 2025
5b80899
Merge pull request #16 from taskgenix/feature/issue-60/crud-api-for-p…
QuocAn108 Sep 28, 2025
6c39a57
chore: fix it to be ok
QuocAn108 Sep 28, 2025
41bc211
re-commit: missing some changes
QuocAn108 Sep 28, 2025
9209233
Feat/issue 18/audio processing (#19)
DuongNManh Sep 28, 2025
dbbfcc9
chore: update README.md with enhanced branding and structured content
AnPhuoc2410 Sep 28, 2025
a9d674d
chore: add missing dependencies
QuocAn108 Sep 29, 2025
17e72d8
Hotfix/no issue/fix user device tokens flow (#20)
lcaohoanq Sep 29, 2025
ca93d06
Add README.md
AnPhuoc2410 Sep 28, 2025
a710618
feat: in progress auth0
QuocAn108 Oct 4, 2025
7420272
feat: handle for login diff google
QuocAn108 Oct 4, 2025
f3760d9
Merge pull request #21 from taskgenix/feature/issue-77/Sync-auth0-wit…
QuocAn108 Oct 4, 2025
655ffd0
Latest Release (#23)
lcaohoanq Oct 5, 2025
3fa5093
chore: update
lcaohoanq Oct 6, 2025
8d04fe5
feat: add prompt templates for summarizing meetings and generating ta…
DuongNManh Oct 8, 2025
b71b5fd
feat: implement task assignment and unassignment methods in TaskGenSe…
AnPhuoc2410 Oct 10, 2025
e99643a
Merge branch 'dev' of https://github.com/taskgenix/TaskGenix-BE into …
AnPhuoc2410 Oct 10, 2025
453b203
feat: Implement soft delete for projects by adding IsActive flag
AnPhuoc2410 Oct 10, 2025
be0531b
Merge pull request #24 from taskgenix/feature/logic_taskgen
AnPhuoc2410 Oct 10, 2025
a7f9db6
feat: Enhance user mapping and response by adding ProfilePicture prop…
AnPhuoc2410 Oct 10, 2025
24f2f2a
Merge pull request #25 from taskgenix/feature/logic_taskgen
AnPhuoc2410 Oct 10, 2025
8219dff
Feat/issue/ai module (#26)
DuongNManh Oct 10, 2025
ec61e71
update the generic repo (#27)
DuongNManh Oct 11, 2025
846ea67
Merge pull request #28 from taskgenix/dev
lcaohoanq Oct 13, 2025
799ec39
feat: add api verify iap
QuocAn108 Oct 13, 2025
e96796f
Merge pull request #29 from taskgenix/feat/implement-iap
QuocAn108 Oct 13, 2025
95b1bc7
Merge branch AI to Dev (#30)
DuongNManh Oct 14, 2025
f0ae9fa
chore: fix enable null in default value return
QuocAn108 Oct 14, 2025
ff96579
feat: enhance project member management with improved error handling …
AnPhuoc2410 Oct 14, 2025
1bd538e
feat: add dto for user plan feature
QuocAn108 Oct 14, 2025
3aab368
feat: basic api for user plan feature
QuocAn108 Oct 14, 2025
4c3ff75
chore: add new field in response
QuocAn108 Oct 14, 2025
5ee92ce
feat: refactor project member service methods for improved transactio…
AnPhuoc2410 Oct 15, 2025
0d7e460
feat: project OrderByDescending
AnPhuoc2410 Oct 15, 2025
b8f8cb4
feat: api update ok
QuocAn108 Oct 15, 2025
f58ac2e
Merge pull request #31 from taskgenix/dev
QuocAn108 Oct 15, 2025
4b2de19
chore: change logic when using feature plan
QuocAn108 Oct 15, 2025
d5a17bd
Merge pull request #32 from taskgenix/feature/issues-78/handle-logic-…
QuocAn108 Oct 15, 2025
e8bd137
feat: Refactor task management and resource handling
AnPhuoc2410 Oct 16, 2025
2cf958e
Merge remote-tracking branch 'origin/dev' into feature/resource-response
AnPhuoc2410 Oct 16, 2025
2b47f3b
Merge pull request #33 from taskgenix/feature/resource-response
AnPhuoc2410 Oct 16, 2025
4cc51cb
feat: Implement task assignment management features
lcaohoanq Oct 16, 2025
642120f
feat: Add TaskAssignment repository and service integration
lcaohoanq Oct 16, 2025
0b806fa
Merge branch 'dev' into feature/crud-task-assignment
lcaohoanq Oct 16, 2025
54a5594
Merge pull request #36 from taskgenix/feature/crud-task-assignment
lcaohoanq Oct 16, 2025
4d15b02
feat: Integrate Scalar.AspNetCore for enhanced API documentation and …
lcaohoanq Oct 16, 2025
11d99b6
Merge pull request #38 from taskgenix/feature/add-scalar
lcaohoanq Oct 16, 2025
335db79
feat: assign available member to task, add scalar
lcaohoanq Oct 16, 2025
cd50c95
Merge pull request #39 from taskgenix/feature/add-scalar
lcaohoanq Oct 16, 2025
12583ce
Fix: update restrict prompting and add resource to database awhen ins…
DuongNManh Oct 16, 2025
a87ac82
feat: in progress dev
QuocAn108 Oct 16, 2025
2d8b8bc
chore: modify model recording, and DI
QuocAn108 Oct 17, 2025
cc4cc13
feat: add reference to ResourceLink
AnPhuoc2410 Oct 17, 2025
6170a17
feat: config r2 and s3 for recording
QuocAn108 Oct 17, 2025
2962bc0
feat: api get and post audio to r2 storage done
QuocAn108 Oct 17, 2025
0ec2280
feat: done api for storage of db server and R2 cloud flare
QuocAn108 Oct 17, 2025
d3f3f45
Merge pull request #40 from taskgenix/feature/issues-93/implement-mod…
QuocAn108 Oct 17, 2025
46a9567
chore: ignore validate file
QuocAn108 Oct 17, 2025
3e4eb28
chore: update email settings
lcaohoanq Oct 18, 2025
71898fc
feat: add greeting email
lcaohoanq Oct 18, 2025
733bc86
feat: improve include logic in services for clarity
AnPhuoc2410 Oct 18, 2025
1d669b7
feat: Updated EmailService to use HTML templates for OTP, login succe…
AnPhuoc2410 Oct 19, 2025
2d3f4b4
feat: Add system status monitoring service and controller
AnPhuoc2410 Oct 19, 2025
6cecd2b
hot-fix: fix update status payment transaction
QuocAn108 Oct 19, 2025
80eaa1a
feat: add get all payment api
lcaohoanq Oct 22, 2025
94a7aca
feat: add get all user plan
lcaohoanq Oct 22, 2025
7756cfa
feat: add endpoint to retrieve projects by owner ID and status
lcaohoanq Oct 23, 2025
d03e06a
Add CI/CD workflow for build and deployment
lcaohoanq Oct 25, 2025
f7ae7e8
Update auto-cd.yml
lcaohoanq Oct 25, 2025
8c28eb7
Fix BaseURL formatting in auto-cd.yml
lcaohoanq Oct 25, 2025
c9ba816
feat: add update swagger server
lcaohoanq Oct 26, 2025
b9e36c8
Update auto-cd.yml
lcaohoanq Oct 26, 2025
36f11b2
Update auto-cd.yml
lcaohoanq Oct 26, 2025
69cf85d
Refactor secrets in auto-cd.yml
lcaohoanq Oct 26, 2025
551352f
chore: email config
AnPhuoc2410 Nov 19, 2025
b601b84
Merge branch 'dev' of https://github.com/taskgenix/TaskGenix-BE into dev
AnPhuoc2410 Nov 19, 2025
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
289 changes: 289 additions & 0 deletions .github/workflows/auto-cd.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,289 @@
name: CD - Build and Deploy on VPS

on:
push:
branches:
- prod
- main
workflow_dispatch: # Allow manual trigger

env:
REGISTRY: docker.io
IMAGE_NAME: ${{ secrets.DOCKER_USERNAME }}/taskgenix-be

jobs:
build-and-push:
runs-on: self-hosted
permissions:
contents: read
packages: write
pull-requests: write

steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Create Firebase service account file
env:
FIREBASE_SERVICE_ACCOUNT: ${{ secrets.FIREBASE_SERVICE_ACCOUNT }}
run: |
echo "$FIREBASE_SERVICE_ACCOUNT" > firebase-service-account.json

# Verify the file is valid JSON
if ! jq . firebase-service-account.json >/dev/null 2>&1; then
echo "❌ Error: firebase-service-account.json is not valid JSON"
cat firebase-service-account.json
exit 1
fi

echo "✅ Firebase service account file created successfully"
ls -lh firebase-service-account.json

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}

- name: Generate image tags
id: tags
run: |
BRANCH_NAME=${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}}
SHORT_SHA=$(git rev-parse --short HEAD)

# Sanitize branch name for Docker tag (replace / with -)
SAFE_BRANCH=$(echo "$BRANCH_NAME" | sed 's/\//-/g')

echo "branch=${SAFE_BRANCH}" >> $GITHUB_OUTPUT
echo "sha=${SHORT_SHA}" >> $GITHUB_OUTPUT

# Build tags
TAGS="${{ env.IMAGE_NAME }}:latest"
TAGS="${TAGS},${{ env.IMAGE_NAME }}:${SAFE_BRANCH}"
TAGS="${TAGS},${{ env.IMAGE_NAME }}:${SAFE_BRANCH}-${SHORT_SHA}"

echo "tags=${TAGS}" >> $GITHUB_OUTPUT

echo "Generated tags:"
echo "$TAGS" | tr ',' '\n'

- name: Build and push Docker image
id: build
uses: docker/build-push-action@v6
with:
context: .
file: ./Dockerfile.prod
# Push only on push event, PR only build
push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.tags.outputs.tags }}
cache-from: type=gha
cache-to: type=gha,mode=max
secret-files: |
firebase_service_account=./firebase-service-account.json

- name: Comment on PR with build info
if: github.event_name == 'pull_request'
uses: marocchino/sticky-pull-request-comment@v2.9.4
with:
header: build-status
message: |
## 🐳 Docker Build Complete

**Image would be tagged as:**
- `${{ env.IMAGE_NAME }}:latest`
- `${{ env.IMAGE_NAME }}:${{ steps.tags.outputs.branch }}`
- `${{ env.IMAGE_NAME }}:${{ steps.tags.outputs.branch }}-${{ steps.tags.outputs.sha }}`

**Tag explanations:**
- latest - Always points to the most recent build
- {branch-name} - Tracks the specific branch
- {branch-name}-{short-sha} - Unique identifier for this exact commit

**Note:** Image is built but not pushed for pull requests.

📦 [View on Docker Hub](https://hub.docker.com/repository/docker/lcaohoanq/taskgenix-be)

- name: Image digest
if: github.event_name != 'pull_request'
run: echo ${{ steps.build.outputs.digest }}

- name: Clean up sensitive files
if: always()
run: |
rm -f firebase-service-account.json
echo "🧹 Cleaned up sensitive files"

deploy:
needs: build-and-push
runs-on: self-hosted
if: github.event_name != 'pull_request' && (github.ref == 'refs/heads/prod' || github.ref == 'refs/heads/main')

steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Set environment
id: env
run: |
if [[ "${{ github.ref }}" == "refs/heads/prod" ]]; then
echo "environment=production" >> $GITHUB_OUTPUT
echo "compose_file=docker-compose.prod.yml" >> $GITHUB_OUTPUT
else
echo "environment=staging" >> $GITHUB_OUTPUT
echo "compose_file=docker-compose.dev.yml" >> $GITHUB_OUTPUT
fi

- name: Create .env file
run: |
cat > .env << EOF
Jwt__SecretKey=${{ secrets.JWT__SECRETKEY }}
Jwt__Issuer=${{ secrets.JWT__ISSUER }}
Jwt__Audience=${{ secrets.JWT__AUDIENCE }}
ConnectionStrings__SupabaseConnection=${{ secrets.CONNECTIONSTRINGS__SUPABASECONNECTION }}
Jwt__RefreshSecretKey=${{ secrets.JWT__REFRESHSECRETKEY }}
Auth0__InternalSyncSecret=${{ secrets.AUTH0__INTERNALSYNCSECRET }}
PayOS__ClientId=${{ secrets.PAYOS__CLIENTID }}
PayOS__ApiKey=${{ secrets.PAYOS__APIKEY }}
PayOS__ChecksumKey=${{ secrets.PAYOS__CHECKSUMKEY }}
B2Storage__ServiceUrl=${{ secrets.B2STORAGE__SERVICEURL }}
B2Storage__BucketName=${{ secrets.B2STORAGE__BUCKETNAME }}
B2Storage__AccessKeyId=${{ secrets.B2STORAGE__ACCESSKEYID }}
B2Storage__SecretAccessKey=${{ secrets.B2STORAGE__SECRETACCESSKEY }}
AI__Gemini__Summarize__APIKey=${{ secrets.AI__GEMINI__SUMMARIZE__APIKEY }}
AI__Gemini__TaskGen__APIKey=${{ secrets.AI__GEMINI__TASKGEN__APIKEY }}
CloudflareR2__AccessKeyId=${{ secrets.CLOUDFLARER2__ACCESSKEYID }}
CloudflareR2__SecretAccessKey=${{ secrets.CLOUDFLARER2__SECRETACCESSKEY }}
CloudflareR2__ServiceUrl=${{ secrets.CLOUDFLARER2__SERVICEURL }}
CloudflareR2__BucketName=${{ secrets.CLOUDFLARER2__BUCKETNAME }}
EOF

- name: Create docker-compose file
run: |
cat > docker-compose.prod.yml << 'EOF'
networks:
taskgenix_network:
driver: bridge

services:
taskgenix-server-prod:
container_name: taskgenix-server
image: lcaohoanq/taskgenix-be:latest
ports:
- "8386:5009"
env_file:
- .env
environment:
- Jwt__ExpirationInMinutes=60
- Jwt__RefreshExpirationInDays=182
- AllowedHosts=*
- ApplyMigrations=false
- "BaseURL=com.app.tgx:"
- AI__Gemini__Summarize__Model=gemini-2.0-flash
- AI__Gemini__TaskGen__Model=gemini-2.0-flash
volumes:
- /home/lcaohoanq/dulieu/taskgenix/firebase-service-account.json:/app/firebase-service-account.json:ro
restart: always
networks:
- taskgenix_network
EOF

- name: Pull latest image
run: |
echo "🔄 Pulling latest Docker image..."
docker pull ${{ env.IMAGE_NAME }}:latest

- name: Stop existing containers
run: |
echo "🛑 Stopping existing containers..."
docker compose -f docker-compose.prod.yml down || true

- name: Deploy application
run: |
echo "🚀 Deploying to ${{ steps.env.outputs.environment }} environment..."
docker compose -f docker-compose.prod.yml up -d --build --remove-orphans

# - name: Wait for container to be healthy
# run: |
# echo "⏳ Waiting for container to be healthy..."
# timeout=60
# elapsed=0

# while [ $elapsed -lt $timeout ]; do
# if docker ps | grep -q taskgenix-server; then
# if [ "$(docker inspect --format='{{.State.Health.Status}}' taskgenix-server 2>/dev/null)" = "healthy" ]; then
# echo "✅ Container is healthy!"
# break
# fi
# fi

# echo "Waiting... ($elapsed/$timeout seconds)"
# sleep 5
# elapsed=$((elapsed + 5))
# done

# if [ $elapsed -ge $timeout ]; then
# echo "❌ Container failed to become healthy within $timeout seconds"
# docker logs taskgenix-server --tail 50
# exit 1
# fi

- name: Verify deployment
run: |
echo "🔍 Verifying deployment..."
docker ps -a | grep taskgenix-server

echo "📋 Container logs (last 20 lines):"
docker logs taskgenix-server --tail 20

- name: Clean up old images
run: |
echo "🧹 Cleaning up old Docker images..."
docker image prune -af --filter "until=24h" || true

notify:
needs: [build-and-push, deploy]
runs-on: ubuntu-latest
if: always()
permissions:
pull-requests: write

steps:
- name: Comment on PR - Success
if: github.event_name == 'pull_request' && needs.build-and-push.result == 'success'
uses: marocchino/sticky-pull-request-comment@v2.9.4
with:
header: build-result
message: |
## ✅ Build Successful!

Your changes have been built successfully.

📦 [View on Docker Hub](https://hub.docker.com/repository/docker/lcaohoanq/taskgenix-be)

- name: Comment on PR - Failure
if: github.event_name == 'pull_request' && needs.build-and-push.result == 'failure'
uses: marocchino/sticky-pull-request-comment@v2.9.4
with:
header: build-result
message: |
## ❌ Build Failed!

Please check the [workflow logs](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}) for details.

- name: Notify deployment success
if: github.event_name == 'push' && needs.deploy.result == 'success'
run: |
echo "✅ Deployment successful!"
echo "Environment: ${{ needs.deploy.outputs.environment }}"
echo "Image: ${{ env.IMAGE_NAME }}:latest"
# Add notification logic here (Slack, Discord, Email, etc.)

- name: Notify deployment failure
if: github.event_name == 'push' && needs.deploy.result == 'failure'
run: |
echo "❌ Deployment failed!"
echo "Check the logs for details"
# Add failure notification logic here
Loading
Loading