kind: pipeline type: kubernetes name: deploy-frontend # Триггеры: запускать на push в ветки main и develop trigger: branch: - master - develop event: - push steps: # --- Шаг 1: Сборка и отправка образа в Harbor --- # Этот шаг выполняется для любой из веток (main или develop) - name: build-and-push image: plugins/docker settings: # Укажите ваш домен Harbor registry: registry.vigdorov.ru # Имя репозитория в Harbor (например, в проекте library) repo: registry.vigdorov.ru/library/examples-for-kids-app # Тег будет равен первым 7 символам хеша коммита (например, a1b2c3d) tags: - ${DRONE_COMMIT_SHA:0:7} # Используем секреты, которые мы создали в Drone username: from_secret: HARBOR_USER password: from_secret: HARBOR_PASSWORD # --- Шаг 2: Развертывание в DEV-окружение --- - name: deploy-dev image: alpine/k8s:1.28.2 # Образ с kubectl и другими утилитами # Запускать этот шаг ТОЛЬКО для ветки 'develop' when: branch: - develop environment: # Используем секрет с kubeconfig KUBECONFIG: from_secret: KUBE_CONFIG commands: # Готовим переменные для dev-окружения - 'export APP_NAMESPACE="dev-ns"' # Будем деплоить в отдельный неймспейс - 'export HOSTNAME="dev_examples-for-kids.vigdorov.ru"' - 'export IMAGE_TAG="${DRONE_COMMIT_SHA:0:7}"' - 'export IMAGE_NAME="ci.vigdorov.ru/library/examples-for-kids-app"' - 'export SECRET_NAME="wildcard-cert"' # Создаем неймспейс, если его нет - 'kubectl create namespace $APP_NAMESPACE --dry-run=client -o yaml | kubectl apply -f -' # Заменяем метки в шаблонах на реальные значения и применяем - 'sed -e "s|__IMAGE__|$IMAGE_NAME:$IMAGE_TAG|g" k8s/deployment.yaml | kubectl apply -n $APP_NAMESPACE -f -' - 'kubectl apply -n $APP_NAMESPACE -f k8s/service.yaml' - 'sed -e "s|__HOSTNAME__|$HOSTNAME|g" -e "s|__SECRET_NAME__|$SECRET_NAME|g" k8s/ingress.yaml | kubectl apply -n $APP_NAMESPACE -f -' - 'echo "Deployed to DEV: https://$HOSTNAME"' # --- Шаг 3: Развертывание в PROD-окружение --- - name: deploy-prod image: alpine/k8s:1.28.2 # Запускать этот шаг ТОЛЬКО для ветки 'main' when: branch: - master environment: KUBE_CONFIG_CONTENT: from_secret: KUBE_CONFIG commands: # Создаем kubeconfig файл из секрета - 'mkdir -p ~/.kube' - 'echo "$KUBE_CONFIG_CONTENT" > ~/.kube/config' - 'chmod 600 ~/.kube/config' # Заменяем localhost на внешний IP сервера - 'sed -i "s|https://127.0.0.1:6443|https://10.10.10.100:6443|g" ~/.kube/config' # Готовим переменные для prod-окружения - 'export APP_NAMESPACE="prod-ns"' - 'export HOSTNAME="examples-for-kids.vigdorov.ru"' - 'export IMAGE_TAG="${DRONE_COMMIT_SHA:0:7}"' - 'export IMAGE_NAME="registry.vigdorov.ru/library/examples-for-kids-app"' - 'export SECRET_NAME="wildcard-cert"' # Проверяем подключение к кластеру - 'kubectl cluster-info' # Создаем неймспейс - 'kubectl create namespace $APP_NAMESPACE --dry-run=client -o yaml | kubectl apply -f -' # Разворачиваем приложение - 'sed -e "s|__IMAGE__|$IMAGE_NAME:$IMAGE_TAG|g" k8s/deployment.yaml | kubectl apply -n $APP_NAMESPACE -f -' - 'kubectl apply -n $APP_NAMESPACE -f k8s/service.yaml' - 'sed -e "s|__HOSTNAME__|$HOSTNAME|g" -e "s|__SECRET_NAME__|$SECRET_NAME|g" k8s/ingress.yaml | kubectl apply -n $APP_NAMESPACE -f -' - 'echo "Deployed to PROD: https://$HOSTNAME"'