-
Notifications
You must be signed in to change notification settings - Fork 327
94 lines (80 loc) · 3.31 KB
/
Copy pathcd.yml
File metadata and controls
94 lines (80 loc) · 3.31 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
name: CD - Deploy & DAST
on:
workflow_call:
permissions:
id-token: write # Required for OIDC
contents: read
jobs:
# ============================================================
# GATE 8: DEPLOY
# ============================================================
deploy:
name: Deploy to EC2 via SSH
runs-on: ubuntu-latest
steps:
- name: Checkout Code
uses: actions/checkout@v4
- name: Create Deployment Directory
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USER }}
key: ${{ secrets.EC2_SSH_KEY }}
script: mkdir -p ~/bankapp
- name: Copy app-tier.yml to EC2
uses: appleboy/scp-action@master
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USER }}
key: ${{ secrets.EC2_SSH_KEY }}
source: "app-tier.yml"
target: "~/bankapp"
- name: Deploy via SSH
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USER }}
key: ${{ secrets.EC2_SSH_KEY }}
script: |
# Login to ECR
aws ecr get-login-password --region ${{ secrets.AWS_REGION }} | docker login --username AWS --password-stdin ${{ secrets.AWS_ACCOUNT_ID }}.dkr.ecr.${{ secrets.AWS_REGION }}.amazonaws.com
cd ~/bankapp
# Fetch secrets from Secrets Manager and create .env
aws secretsmanager get-secret-value --secret-id bankapp/prod-secrets --query SecretString --output text > secrets.json
# Extract variables and write to .env
echo "DB_HOST=$(jq -r .DB_HOST secrets.json)" > .env
echo "DB_PORT=$(jq -r .DB_PORT secrets.json)" >> .env
echo "DB_NAME=$(jq -r .DB_NAME secrets.json)" >> .env
echo "DB_USER=$(jq -r .DB_USER secrets.json)" >> .env
echo "DB_PASSWORD=$(jq -r .DB_PASSWORD secrets.json)" >> .env
echo "OLLAMA_URL=$(jq -r .OLLAMA_URL secrets.json)" >> .env
echo "ECR_REGISTRY=${{ secrets.AWS_ACCOUNT_ID }}.dkr.ecr.${{ secrets.AWS_REGION }}.amazonaws.com" >> .env
echo "ECR_REPOSITORY=${{ secrets.ECR_REPOSITORY }}" >> .env
echo "IMAGE_TAG=${{ github.sha }}" >> .env
# Clean up
rm secrets.json
# Pull and Deploy using the app-tier.yml transferred via SCP
docker compose -f app-tier.yml pull
docker compose -f app-tier.yml up -d --build
# ============================================================
# GATE 9: DAST - Dynamic Application Security Testing
# ============================================================
dast:
name: DAST - OWASP ZAP Baseline Scan
runs-on: ubuntu-latest
needs: deploy
steps:
- name: Run OWASP ZAP Baseline Scan
uses: zaproxy/action-baseline@v0.15.0
continue-on-error: true # Workaround for ZAP's internal artifact upload bug
with:
target: 'http://${{ secrets.EC2_HOST }}:8080'
artifact_name: zapreport
fail_action: false
allow_issue_writing: false
- name: Upload ZAP Report
uses: actions/upload-artifact@v4
if: always()
with:
name: zap-dast-report
path: report_html.html