Skip to content

refactor: #dev envs update #9

refactor: #dev envs update

refactor: #dev envs update #9

name: DEV - KodemyBackend deploy
on:
push:
branches: [ "dev" ]
paths-ignore:
- '.gitignore'
- 'docker-compose.deploy.yml'
- 'docker-compose.yml'
- 'README.md'
- 'config'
env:
# WORKING_DIRECTORY: ${{ env.WORKING_DIRECTORY }}
# NETWORK_NAME: ${{ env.NETWORK_NAME }}
# DATASOURCE_CONTAINER: ${{ env.DATASOURCE_CONTAINER }}
DATASOURCE_USERNAME: ${{ secrets.DATASOURCE_USERNAME }}
DATASOURCE_PASSWORD: ${{ secrets.DATASOURCE_PASSWORD }}
# DATASOURCE_DB: ${{ env.DATASOURCE_DB }}
# RABBITMQ_HOST: ${{ env.RABBITMQ_HOST }}
# RABBITMQ_PORT: ${{ env.RABBITMQ_PORT }}
RABBITMQ_USERNAME: ${{ secrets.RABBITMQ_USERNAME }}
RABBITMQ_PASSWORD: ${{ secrets.RABBITMQ_PASSWORD }}
# ELASTICSEARCH_HOSTS: ${{ env.RABBITMQ_PASSWORD }}
ELASTICSEARCH_USERNAME: ${{ secrets.ELASTICSEARCH_USERNAME }}
ELASTICSEARCH_PASSWORD: ${{ secrets.ELASTICSEARCH_PASSWORD }}
# EUREKA_URL: ${{ env.EUREKA_URL }}
# FRONTEND_PUBLIC_HOST: ${{ env.FRONTEND_PUBLIC_HOST }}
# GATEWAY_PUBLIC_HOST: ${{ env.GATEWAY_PUBLIC_HOST }}
jobs:
prepare:
name: Prepare
runs-on: self-hosted
steps:
- name: Check environments
run: |
REQUIRED_VARS=\
(
"WORKING_DIRECTORY"
"NETWORK_NAME"
"DATASOURCE_CONTAINER"
"DATASOURCE_USERNAME"
"DATASOURCE_PASSWORD"
"DATASOURCE_DB"
"RABBITMQ_HOST"
"RABBITMQ_PORT"
"RABBITMQ_USERNAME"
"RABBITMQ_PASSWORD"
"RABBITMQ_PASSWORD"
"ELASTICSEARCH_USERNAME"
"ELASTICSEARCH_PASSWORD"
"EUREKA_URL"
"FRONTEND_PUBLIC_HOST"
"GATEWAY_PUBLIC_HOST"
)
EXIT=0
for VAR in "${REQUIRED_VARS[@]}"; do
[ -z "${!VAR}" ] && echo "Environment variable $VAR is missing." && EXIT=1
done
exit $EXIT
update-branch:
name: Update branch
needs: [ prepare ]
runs-on: self-hosted
environment: dev
steps:
- name: Update ${{ github.ref_name }}
uses: appleboy/ssh-action@master
env:
BRANCH: ${{ github.ref_name }}
with:
host: ${{ secrets.REMOTE_HOST }}
username: ${{ secrets.REMOTE_USER }}
port: ${{ secrets.REMOTE_PORT }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
envs: WORKING_DIRECTORY,BRANCH
script: |
cd $WORKING_DIRECTORY
git checkout $BRANCH || exit 1
git pull origin $BRANCH || exit 1
validate:
name: Validate services
runs-on: self-hosted
needs: [ update-branch ]
environment: dev
steps:
- name: Validate services
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.REMOTE_HOST }}
username: ${{ secrets.REMOTE_USER }}
port: ${{ secrets.REMOTE_PORT }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
envs: WORKING_DIRECTORY,NETWORK_NAME,DATASOURCE_CONTAINER,DATASOURCE_USERNAME,DATASOURCE_DB
script: |
echo "Validate network"
docker network inspect $NETWORK_NAME > /dev/null 2>&1 \
|| { echo "Network $NETWORK_NAME is not available."; exit 1; }
echo "Validate database - container"
docker exec -t $DATASOURCE_CONTAINER pg_isready \
|| { echo "PostgreSQL is not running."; exit 1; }
echo "Validate database - database"
docker exec -t $DATASOURCE_CONTAINER psql -lqt -U $DATASOURCE_USERNAME | grep -q $DATASOURCE_DB \
|| { echo "Database $DATASOURCE_DB does not exist."; exit 1; }
echo "Validate database - schemas"
DATASOURCE_SCHEMAS=("kodemy-auth" "kodemy-backend" "kodemy-notification")
for SCHEMA in "${DATASOURCE_SCHEMAS[@]}"
do
docker exec -t $DATASOURCE_CONTAINER psql \
-U $DATASOURCE_USERNAME \
-d $DATASOURCE_DB \
-tAc "SELECT 1 FROM information_schema.schemata WHERE schema_name = '$SCHEMA'" \
| grep -q 1 || { echo "Schema $SCHEMA does not exist."; exit 1; }
done
build-and-deploy:
name: Build, Test, Deploy
runs-on: self-hosted
needs: [ validate ]
environment: dev
steps:
- name: Build, Test, Deploy
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.REMOTE_HOST }}
username: ${{ secrets.REMOTE_USER }}
port: ${{ secrets.REMOTE_PORT }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
envs: |
WORKING_DIRECTORY,
DATASOURCE_CONTAINER,DATASOURCE_USERNAME,DATASOURCE_PASSWORD,DATASOURCE_DB,
RABBITMQ_HOST,RABBITMQ_PORT,RABBITMQ_USERNAME,RABBITMQ_PASSWORD,
ELASTICSEARCH_HOSTS,ELASTICSEARCH_USERNAME,ELASTICSEARCH_PASSWORD,
EUREKA_URL,
FRONTEND_PUBLIC_HOST,
GATEWAY_PUBLIC_HOST
script: |
cd $WORKING_DIRECTORY/commons
./gradlew clean assemble
cd $WORKING_DIRECTORY/kodemy-api-gateway
./gradlew clean assemble -x test
cd $WORKING_DIRECTORY/kodemy-auth
./gradlew clean assemble -x test
cd $WORKING_DIRECTORY/kodemy-backend
./gradlew clean assemble -x test
cd $WORKING_DIRECTORY/kodemy-notification
./gradlew clean assemble -x test
cd $WORKING_DIRECTORY/kodemy-search
./gradlew clean assemble -x test
cd $WORKING_DIRECTORY/kodemy-service-registry
./gradlew clean assemble -x test
export DATASOURCE_URL=jdbc:postgresql://$DATASOURCE_CONTAINER/$DATASOURCE_DB
cd $WORKING_DIRECTORY
docker compose -f docker-compose.app.yml up --build -d
- name: Cleanup
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.REMOTE_HOST }}
username: ${{ secrets.REMOTE_USER }}
port: ${{ secrets.REMOTE_PORT }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
docker system prune -f