Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
6d786d4
clenup rg-cleanup.yaml
katerynaZh Jun 30, 2025
9b9af30
Create Key Vault
katerynaZh Jul 8, 2025
e8f6dd0
Fix variable namings
katerynaZh Jul 8, 2025
b64cef7
commented out
katerynaZh Jul 8, 2025
d372dc1
Try fix database exists check
katerynaZh Jul 8, 2025
2de0d21
uncomment fix
katerynaZh Jul 8, 2025
e32fa0b
fix
katerynaZh Jul 8, 2025
0508c8c
fix key vault create
katerynaZh Jul 8, 2025
b8242f0
add echo "check if exists" for key vault
katerynaZh Jul 8, 2025
97450da
fix
katerynaZh Jul 8, 2025
b2fc508
fix
katerynaZh Jul 8, 2025
907cdb8
comment
katerynaZh Jul 8, 2025
4c3eccb
fix
katerynaZh Jul 8, 2025
a0da8a9
refactoring deployment pipeline with Key Vault creation
katerynaZh Jul 11, 2025
da56fa6
Fix role assigment error
katerynaZh Jul 11, 2025
ac39ce7
Assign Key Vault Secrets Officer role to the SPN
katerynaZh Jul 11, 2025
6e863a8
Build docker image and push it to GitHub Container Registry
katerynaZh Jul 11, 2025
284887c
lowercase repository name
katerynaZh Jul 11, 2025
5d96dc1
Fix failed to read dockerfile
katerynaZh Jul 11, 2025
04163cb
Fix error: path ".backend_app" not found
katerynaZh Jul 11, 2025
ddb8b48
try fix docker file naming error
katerynaZh Jul 11, 2025
c570510
rollback fix
katerynaZh Jul 11, 2025
f4ea156
fix docker images naming
katerynaZh Jul 11, 2025
5af9ebd
Try to fix error: denied: installation not allowed to Create organiza…
katerynaZh Jul 11, 2025
7ad4e41
rollback and provide packages permissions
katerynaZh Jul 11, 2025
30428c8
Deploy frontend and backend web apps job
katerynaZh Jul 15, 2025
a2abf71
fix tabs in yaml
katerynaZh Jul 15, 2025
f2d73b0
Fix yaml needs
katerynaZh Jul 15, 2025
51d3a6b
fix needs in yaml
katerynaZh Jul 15, 2025
a31618f
update app service plan SKU from B1 to F1 in deployment workflow
katerynaZh Jul 15, 2025
4b149e0
update app service plan SKU from F1 to B1 and add location parameter
katerynaZh Jul 15, 2025
bc22c6a
fix
katerynaZh Jul 15, 2025
a3d4f0d
update deployment commands to use separate container registry and ima…
katerynaZh Jul 15, 2025
7c13b12
enable logging for container
katerynaZh Jul 15, 2025
e38b815
check for existing App Service Plan before creation
katerynaZh Jul 15, 2025
4310c8e
refactor: update PostgreSQL admin user secrets and improve web app de…
katerynaZh Jul 17, 2025
d2c9333
fix rest-api-backend
katerynaZh Jul 17, 2025
f315e0f
refactor: parameterize PostgreSQL server name in CI/CD workflow
katerynaZh Jul 17, 2025
8096692
fix: use variable for PostgreSQL server name in deployment script
katerynaZh Jul 17, 2025
3a63ba9
feat: add creation of PostgreSQL database in CI/CD workflow
katerynaZh Jul 17, 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
246 changes: 246 additions & 0 deletions .github/workflows/cicd.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,246 @@
name: "[PR] Deploy Pipeline"

on:
push:
branches:
- main
- feature/pipelines # Додано для запуску з гілки feature/pipelines, видалити у фінальній версії

permissions:
id-token: write # ОБОВ'ЯЗКОВО для OIDC логіну
contents: read
packages: write

jobs:
deploy_postgres_and_key_vault:
name: Deploy postgres database and key vault
runs-on: ubuntu-latest
environment: dev
env:
PG_SERVER_NAME: ${{ vars.AZURE_POSTGRESQL_SERVER_NAME }}
PG_ADMIN_USER: ${{ secrets.AZURE_POSTGRESQL_ADMIN_USER }}
PG_ADMIN_PASSWORD: ${{ secrets.AZURE_POSTGRESQL_ADMIN_PASSWORD }}
RESOURCE_GROUP: ${{ secrets.AZURE_RESOURCE_GROUP }}
KEY_VAULT_NAME: ${{ vars.KEY_VAULT_NAME }}
steps:
- name: Log in to Azure with OIDC
uses: azure/login@v1
with:
client-id: ${{ vars.AZURE_CLIENT_ID }}
tenant-id: ${{ vars.AZURE_TENANT_ID }}
subscription-id: ${{ vars.AZURE_SUBSCRIPTION_ID }}

- name: Create key vault
run: |
echo "Create Key Vault"
set +e
KEY_VAULT_EXISTS=$(az keyvault show \
--name $KEY_VAULT_NAME \
--resource-group $RESOURCE_GROUP \
--query "name" -o tsv 2>/dev/null)
set -e

echo "before if"
if [ -z "$KEY_VAULT_EXISTS" ]; then
echo "Key Vault $KEY_VAULT_NAME does NOT exist."
az keyvault create \
--name $KEY_VAULT_NAME \
--resource-group $RESOURCE_GROUP \
--location westeurope \
--sku standard
else
echo "Key Vault exists: $KEY_VAULT_EXISTS"
fi

echo "Assign Key Vault Secrets Officer role to the SPN"
az role assignment create \
--assignee ${{ vars.AZURE_CLIENT_ID }} \
--role "Key Vault Secrets Officer" \
--scope "/subscriptions/${{ vars.AZURE_SUBSCRIPTION_ID }}/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.KeyVault/vaults/$KEY_VAULT_NAME"

echo "Assign Key Vault Secrets Officer role to the dev group"
az role assignment create \
--assignee ${{ vars.DEV_GROUP_ID }} \
--role "Key Vault Secrets Officer" \
--scope "/subscriptions/${{ vars.AZURE_SUBSCRIPTION_ID }}/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.KeyVault/vaults/$KEY_VAULT_NAME"

- name: Deploy PG Flexible Server
run: |
IP=$(curl -s https://ifconfig.me)
echo "Runner Public IP: $IP"

echo "Create PostgreSQL Flexible Server"

set +e
PGDB_EXISTS=$(az postgres flexible-server show \
--name "$PG_SERVER_NAME" \
--resource-group "$RESOURCE_GROUP" \
--query "name" -o tsv 2>/dev/null)
set -e

if [ -z "$PGDB_EXISTS" ]; then
echo "PostgresSQL PG_SERVER_NAME does NOT exist."
az postgres flexible-server create \
--resource-group $RESOURCE_GROUP \
--name $PG_SERVER_NAME \
--location westeurope \
--admin-user $PG_ADMIN_USER \
--admin-password $PG_ADMIN_PASSWORD \
--tier Burstable \
--sku-name Standard_B1ms \
--storage-size 32 \
--version 16 \
--public-access $IP
else
echo "PostgresSQL exists: $PGDB_EXISTS"
fi

echo "Check PostgreSQL server status"
az postgres flexible-server show \
--name $PG_SERVER_NAME \
--resource-group $RESOURCE_GROUP

echo "Create PostgreSQL database"
az postgres flexible-server db create \
--resource-group "$RESOURCE_GROUP" \
--server-name "$PG_SERVER_NAME" \
--database-name tasks_db

echo "Add PostgreSQL secrets in key vault."
az keyvault secret set \
--vault-name $KEY_VAULT_NAME \
--name "pg-admin-user" \
--value $PG_ADMIN_USER

az keyvault secret set \
--vault-name $KEY_VAULT_NAME \
--name "pg-admin-password" \
--value $PG_ADMIN_PASSWORD

build_docker_image:
name: Build docker image and save in Github Container Registry
runs-on: ubuntu-latest
environment: dev
env:
PG_ADMIN_USER: ${{ secrets.AZURE_POSTGRESQL_ADMIN_USER }}
PG_ADMIN_PASSWORD: ${{ secrets.AZURE_POSTGRESQL_ADMIN_PASSWORD }}
RESOURCE_GROUP: ${{ secrets.AZURE_RESOURCE_GROUP }}
KEY_VAULT_NAME: ${{ vars.KEY_VAULT_NAME }}
steps:
- name: Checkout code
uses: actions/checkout@v2

- name: Build docker images and push it to GitHub Container Registry
run: |
echo "Log in to GitHub Container Registry"
echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin

REPO_OWNER_LOWER=$(echo "${{ github.repository_owner }}" | tr '[:upper:]' '[:lower:]')

echo "Build BE docker image"
docker build -t ghcr.io/$REPO_OWNER_LOWER/rest-api-backend:latest backend_app
echo "Docker image built successfully"

echo "Push BE docker image to GitHub Container Registry"
docker push ghcr.io/$REPO_OWNER_LOWER/rest-api-backend:latest

echo "Build FE docker image"
docker build -t ghcr.io/$REPO_OWNER_LOWER/rest-api-frontend:latest frontend_app
echo "Docker image built successfully"

echo "Push FE docker image to GitHub Container Registry"
docker push ghcr.io/$REPO_OWNER_LOWER/rest-api-frontend:latest

deploy_web_apps:
name: Deploy frontend and backend web apps
runs-on: ubuntu-latest
environment: dev
needs: [deploy_postgres_and_key_vault, build_docker_image]
env:
PG_ADMIN_USER: ${{ secrets.AZURE_POSTGRESQL_ADMIN_USER }}
PG_ADMIN_PASSWORD: ${{ secrets.AZURE_POSTGRESQL_ADMIN_PASSWORD }}
RESOURCE_GROUP: ${{ secrets.AZURE_RESOURCE_GROUP }}
KEY_VAULT_NAME: ${{ vars.KEY_VAULT_NAME }}
steps:
- name: Log in to Azure with OIDC
uses: azure/login@v1
with:
client-id: ${{ vars.AZURE_CLIENT_ID }}
tenant-id: ${{ vars.AZURE_TENANT_ID }}
subscription-id: ${{ vars.AZURE_SUBSCRIPTION_ID }}

- name: Deploy frontend and backend web apps
run: |
echo "Check if App Service Plan exists"
set +e
PLAN_EXISTS=$(az appservice plan show \
--resource-group $RESOURCE_GROUP \
--name rest-api-plan \
--query "name" -o tsv 2>/dev/null)
set -e

if [ -z "$PLAN_EXISTS" ]; then
echo "Create App Service Plan"
az appservice plan create \
--resource-group $RESOURCE_GROUP \
--name rest-api-plan \
--sku B1 \
--is-linux \
--location westeurope
else
echo "App Service Plan exists: $PLAN_EXISTS"
fi

BACKEND_WEBAPP_NAME="rest-api-${{ vars.WEBAPP_BACKEND_NAME }}"
PG_SERVER_NAME="${{ vars.AZURE_POSTGRESQL_SERVER_NAME }}.postgres.database.azure.com"
REPO_OWNER_LOWER=$(echo "${{ github.repository_owner }}" | tr '[:upper:]' '[:lower:]')

echo "Deploy backend web app"
az webapp create \
--resource-group $RESOURCE_GROUP \
--name $BACKEND_WEBAPP_NAME \
--plan rest-api-plan \
--container-registry-url ghcr.io \
--container-image-name $REPO_OWNER_LOWER/rest-api-backend:latest

echo "Set environment variables for backend web app"
az webapp config appsettings set \
--resource-group $RESOURCE_GROUP \
--name $BACKEND_WEBAPP_NAME \
--settings \
POSTGRES_HOST=$PG_SERVER_NAME \
POSTGRES_USER=$PG_ADMIN_USER \
POSTGRES_PASSWORD=$PG_ADMIN_PASSWORD

echo "Enable logging for backend web app"
az webapp log config \
--resource-group $RESOURCE_GROUP \
--name $BACKEND_WEBAPP_NAME \
--docker-container-logging filesystem
echo "Enable logging for backend web app"
az webapp log config \
--resource-group $RESOURCE_GROUP \
--name $BACKEND_WEBAPP_NAME \
--docker-container-logging filesystem

FRONTEND_WEBAPP_NAME="rest-api-${{ vars.WEBAPP_FRONTEND_NAME }}"

echo "Deploy frontend web app"
az webapp create \
--resource-group $RESOURCE_GROUP \
--name $FRONTEND_WEBAPP_NAME \
--plan rest-api-plan \
--container-registry-url ghcr.io \
--container-image-name $REPO_OWNER_LOWER/rest-api-frontend:latest

echo "Set environment variables for frontend web app"
az webapp config appsettings set \
--resource-group $RESOURCE_GROUP \
--name $FRONTEND_WEBAPP_NAME \
--settings KEY_VAULT_NAME=$KEY_VAULT_NAME

echo "Enable logging for frontend web app"
az webapp log config \
--resource-group $RESOURCE_GROUP \
--name $FRONTEND_WEBAPP_NAME \
--docker-container-logging filesystem
52 changes: 0 additions & 52 deletions .github/workflows/pgdb-create.yaml

This file was deleted.

6 changes: 1 addition & 5 deletions .github/workflows/rg-cleanup.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,6 @@ jobs:
runs-on: ubuntu-latest
environment: dev
env:
PG_ADMIN_USER: ${{ secrets.PG_ADMIN_USER }}
PG_ADMIN_PASSWORD: ${{ secrets.PG_ADMIN_PASSWORD }}
RESOURCE_GROUP: ${{ secrets.AZURE_RESOURCE_GROUP }}
steps:
- name: Log in to Azure with OIDC
Expand All @@ -27,6 +25,4 @@ jobs:
subscription-id: ${{ vars.AZURE_SUBSCRIPTION_ID }}

- name: Delete all resources in the resource group
run: |
echo "Generate Random PostgreSQL Server Name"
az resource list --resource-group $RESOURCE_GROUP --query "[].id" -o tsv | xargs -I {} az resource delete --ids {}
run: az resource list --resource-group $RESOURCE_GROUP --query "[].id" -o tsv | xargs -I {} az resource delete --ids {}
16 changes: 16 additions & 0 deletions frontend_app/src/components/index.tsx
Original file line number Diff line number Diff line change
@@ -1,3 +1,19 @@
import TaskManager from './TaskManager';

export { TaskManager };


const optimize = (
fn: (input: any) => any,
): any => {
const cache = {};

return (input) => {
if (cache[input]) {
return cache[input];
}
const result = fn(input);
cache[input] = result;
return result;
}
}