File: /home/marketing.cfbon.ru/public_html/.gitlab-ci.yml
before_script:
- apk add --no-cache openssh-client rsync
- mkdir -p ~/.ssh
- echo "$SSH_PRIVATE_KEY" | tr -d '\r' > ~/.ssh/id_rsa
- chmod 600 ~/.ssh/id_rsa
- ssh-keyscan $DEV_IP >> ~/.ssh/known_hosts
stages:
- deploy
- dependencies
- migration
- post_deploy
- launching
variables:
DEV_PHP_PATH: /usr/local/lsws/lsphp83/bin/php
COMPOSER_PHP_PATH: /usr/bin/composer
PROD_DOCKER_DIR: /www/admin
deploy:
stage: deploy
script:
- echo "Deploying to Staging..."
- rsync -avz --delete --exclude='.git' --exclude='storage' --exclude='vendor' --exclude='node_modules' -e "ssh -o StrictHostKeyChecking=no" ./ $DEV_USER@$DEV_IP:$DEV_DEPLOY_PATH
- echo "Deployed successfully"
rules:
# Запустить, если это MR в ветку dev
- if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "dev"'
when: always
# Запустить, если это пуш в ветку dev
- if: '$CI_COMMIT_BRANCH == "dev"'
when: always
# Во всех остальных случаях не запускать
- when: never
setup_environment:
stage: dependencies
needs: ["deploy"]
script:
- echo "Configuring .env..."
- ssh $DEV_USER@$DEV_IP "cd $DEV_DEPLOY_PATH && [ -f .env.dev ] && [ ! -f .env ] && cp .env.dev .env || true"
- echo ".env ready"
rules:
# Запустить, если это MR в ветку dev
- if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "dev"'
when: always
# Запустить, если это пуш в ветку dev
- if: '$CI_COMMIT_BRANCH == "dev"'
when: always
# Во всех остальных случаях не запускать
- when: never
create_storage_dirs:
stage: dependencies
needs: ["setup_environment" ]
script:
- echo "Creating storage directories..."
- ssh $DEV_USER@$DEV_IP "mkdir -p $DEV_DEPLOY_PATH/storage/framework/cache/data"
- ssh $DEV_USER@$DEV_IP "mkdir -p $DEV_DEPLOY_PATH/storage/framework/sessions"
- ssh $DEV_USER@$DEV_IP "mkdir -p $DEV_DEPLOY_PATH/storage/framework/views"
- echo "Storage directories created"
rules:
# Запустить, если это MR в ветку dev
- if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "dev"'
when: always
# Запустить, если это пуш в ветку dev
- if: '$CI_COMMIT_BRANCH == "dev"'
when: always
# Во всех остальных случаях не запускать
- when: never
install_dependencies:
stage: dependencies
needs: ["create_storage_dirs"]
script:
- echo "Installing dependencies..."
- ssh $DEV_USER@$DEV_IP "cd $DEV_DEPLOY_PATH && $DEV_PHP_PATH $COMPOSER_PHP_PATH install --no-dev --optimize-autoloader"
- echo "Dependencies installed"
rules:
# Запустить, если это MR в ветку dev
- if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "dev"'
when: always
# Запустить, если это пуш в ветку dev
- if: '$CI_COMMIT_BRANCH == "dev"'
when: always
# Во всех остальных случаях не запускать
- when: never
migrations:
stage: migration
needs: ["install_dependencies"]
script:
- echo "Running migrations..."
- ssh $DEV_USER@$DEV_IP "cd $DEV_DEPLOY_PATH && $DEV_PHP_PATH artisan migrate --force"
- echo "Success migrate"
rules:
# Запустить, если это MR в ветку dev
- if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "dev"'
when: always
# Запустить, если это пуш в ветку dev
- if: '$CI_COMMIT_BRANCH == "dev"'
when: always
# Во всех остальных случаях не запускать
- when: never
seeders:
stage: migration
needs: ["migrations"]
script:
- echo "Running seeders..."
- ssh $DEV_USER@$DEV_IP "cd $DEV_DEPLOY_PATH && $DEV_PHP_PATH artisan db:seed"
- echo "Success seeder"
rules:
# Запустить, если это MR в ветку dev
- if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "dev"'
when: always
# Запустить, если это пуш в ветку dev
- if: '$CI_COMMIT_BRANCH == "dev"'
when: always
# Во всех остальных случаях не запускать
- when: never
permissions:
stage: post_deploy
needs: ["seeders"]
script:
- echo "Fixing permissions..."
- ssh $DEV_USER@$DEV_IP "chmod -R 755 $DEV_DEPLOY_PATH/storage"
- ssh $DEV_USER@$DEV_IP "chmod -R 755 $DEV_DEPLOY_PATH/bootstrap/cache"
# - ssh $DEV_USER@$DEV_IP "chown -R www-data:www-data $DEV_DEPLOY_PATH/storage"
# - ssh $DEV_USER@$DEV_IP "chown -R www-data:www-data $DEV_DEPLOY_PATH/bootstrap/cache"
- echo "Permissions fixed"
rules:
# Запустить, если это MR в ветку dev
- if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "dev"'
when: always
# Запустить, если это пуш в ветку dev
- if: '$CI_COMMIT_BRANCH == "dev"'
when: always
# Во всех остальных случаях не запускать
- when: never
post_deploy:
stage: post_deploy
needs: ["permissions"]
script:
- echo "Running post-deploy tasks..."
- ssh $DEV_USER@$DEV_IP "cd $DEV_DEPLOY_PATH && $DEV_PHP_PATH artisan optimize:clear"
- ssh $DEV_USER@$DEV_IP "cd $DEV_DEPLOY_PATH && $DEV_PHP_PATH artisan config:clear"
- ssh $DEV_USER@$DEV_IP "cd $DEV_DEPLOY_PATH && $DEV_PHP_PATH artisan view:clear"
- ssh $DEV_USER@$DEV_IP "cd $DEV_DEPLOY_PATH && $DEV_PHP_PATH artisan optimize"
- ssh $DEV_USER@$DEV_IP "cd $DEV_DEPLOY_PATH && $DEV_PHP_PATH artisan storage:link"
- echo "Post-deploy tasks completed"
rules:
# Запустить, если это MR в ветку dev
- if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "dev"'
when: always
# Запустить, если это пуш в ветку dev
- if: '$CI_COMMIT_BRANCH == "dev"'
when: always
# Во всех остальных случаях не запускать
- when: never
safe_deploy_prod:
stage: deploy
script:
- echo "Deploying to Staging..."
- rsync -avz --dry-run --delete --exclude='.git' --exclude='storage' --exclude='vendor' --exclude='node_modules' -e "ssh -p $PROD_PORT -o StrictHostKeyChecking=no" ./ $PROD_USER@$PROD_IP:$PROD_DEPLOY_PATH
- echo "Deployed successfully"
rules:
# Запустить, если это MR в ветку main
- if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main" && $CI_PIPELINE_SOURCE == "merge_request_event"'
when: always
- when: never
deploy_prod:
stage: deploy
script:
- echo "Deploying to Staging..."
- rsync -avz --delete --exclude='.git' --exclude='storage' --exclude='vendor' --exclude='node_modules' -e "ssh -p $PROD_PORT -o StrictHostKeyChecking=no" ./ $PROD_USER@$PROD_IP:$PROD_DEPLOY_PATH
- echo "Deployed successfully"
rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_COMMIT_BRANCH == "main"'
when: always
- if: '$CI_COMMIT_BRANCH == "main" && $CI_PIPELINE_SOURCE == "push"'
when: always
- when: never
setup_prod_environment:
stage: dependencies
needs: ["deploy_prod"]
script:
- echo "Configuring .env..."
- ssh -p $PROD_PORT -o StrictHostKeyChecking=no $PROD_USER@$PROD_IP "cd $PROD_DEPLOY_PATH && [ -f .env.prod ] && [ ! -f .env ] && cp .env.prod .env || true"
- echo ".env ready"
rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_COMMIT_BRANCH == "main"'
when: always
- if: '$CI_COMMIT_BRANCH == "main" && $CI_PIPELINE_SOURCE == "push"'
when: always
- when: never
install_prod_dependencies:
stage: dependencies
needs: ["setup_prod_environment"]
script:
- echo "Installing dependencies..."
- ssh -p $PROD_PORT -o StrictHostKeyChecking=no $PROD_USER@$PROD_IP "cd $PROD_DOCKER_DIR && docker-compose exec -T php composer install --no-dev --optimize-autoloader"
- echo "Dependencies installed"
rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_COMMIT_BRANCH == "main"'
when: always
- if: '$CI_COMMIT_BRANCH == "main" && $CI_PIPELINE_SOURCE == "push"'
when: always
- when: never
migrations_prod:
stage: migration
needs: ["install_prod_dependencies"]
script:
- echo "Running migrations..."
- ssh -p $PROD_PORT -o StrictHostKeyChecking=no $PROD_USER@$PROD_IP "cd $PROD_DOCKER_DIR && docker-compose exec -T php php artisan migrate --force"
- echo "Success migrate"
rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_COMMIT_BRANCH == "main"'
when: always
- if: '$CI_COMMIT_BRANCH == "main" && $CI_PIPELINE_SOURCE == "push"'
when: always
- when: never
clear_cache:
stage: post_deploy
needs: ["migrations_prod"]
script:
- echo "Clearing.."
- ssh -p $PROD_PORT -o StrictHostKeyChecking=no $PROD_USER@$PROD_IP "cd $PROD_DOCKER_DIR && docker-compose exec -T php php artisan optimize:clear"
- echo "Success cleare cache"
rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_COMMIT_BRANCH == "main"'
when: always
- if: '$CI_COMMIT_BRANCH == "main" && $CI_PIPELINE_SOURCE == "push"'
when: always
- when: never
restart_queue:
stage: post_deploy
needs: ["clear_cache"]
script:
- echo "Restarting.."
- ssh -p $PROD_PORT -o StrictHostKeyChecking=no $PROD_USER@$PROD_IP "cd $PROD_DOCKER_DIR && docker-compose exec -T php supervisorctl restart admin-laravel-worker:*"
- echo "Success restart admin-laravel-worker"
rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_COMMIT_BRANCH == "main"'
when: always
- if: '$CI_COMMIT_BRANCH == "main" && $CI_PIPELINE_SOURCE == "push"'
when: always
- when: never