Один из наших принципов вождения для Рубрикакт
Является ли #frugalbydesign – мы просто не хотим платить за то, что мы не используем.
Наша архитектура должна балансировать стоимость наряду с другими основными возможностями, такими как охрана приложений 🔒, гибкость дизайна 💪 и совместное обеспечение разработчика 👩💻👨💻.
В этом посте мы будем делиться некоторыми деталями нашего постоянного трубопровода развертывания. Мы объединили Bitbucket с обслуживанием Google Cloud Build, которые развертывают наши приложения на облачный проход в среднем в среднем 1-2 минуты на сборку!
Для развития мы также создали локальный рабочий процесс для:
- Ускорить итерацию локального кода 🏎💨
- Минимизируйте количество рабочих мест облачных построек и изменений облачных прогонов (#frugalbydesign) ☁️.
- Держите наш коммит журналом Tidy! 🧹.
Вот высокий вид нашего подхода:
Теперь давайте посмотрим на некоторые из основных компонентов. 🔎
Скоростные местные сборки
Наши MVP-подписи API – это приложение Python Flask. Он опирается на несколько различных пакетов Python, которые обеспечивают остальные рамки, электронное письмо, хранение и другие возможности. Прямо сейчас это просто API.PY
Файл и A требования .txt
Это представляет наши пакетные зависимости.
Наше Dockerfile
Для местного и облачного развертывания целенаправленно идентичны, поэтому мы можем сосредоточиться на разработке API.
FROM python:slim # install python dependencies RUN python3 -m venv /app/env COPY requirements.txt . RUN /app/env/bin/pip install -r requirements.txt # configure port (Cloud Run requires 8080) ENV PORT=8080 EXPOSE $PORT # setup application runtime WORKDIR /app/src ENV GOOGLE_APPLICATION_CREDENTIALS="/app/sa-key.json" COPY entrypoint.sh . RUN chmod +x entrypoint.sh COPY api.py . CMD ["sh", "-c", "./entrypoint.sh"]
У нас есть localbuild.sh
Сценарий, который эмулирует развертывание облачного запуска локально с помощью Docker, что означает, что мы можем очень быстро повторить наши задачи развития, без необходимости перераспределения до облака.
#!/bin/bash REPO=$(basename -s .git $(git config --get remote.origin.url)) BRANCH=$(git rev-parse --abbrev-ref HEAD) gcloud iam service-accounts keys create sa-key.json \ --iam-account service-account@project.iam.gserviceaccount.com SA_KEY_FILE_BASE64=$(cat sa-key.json | base64) docker build -t shirtctl-${REPO}-${BRANCH}:latest . docker run --rm -it \ -e K_SERVICE=localbuild \ -e SA_KEY_FILE_BASE64 \ -p 8080:8080 \ -v $(pwd):/app/src \ shirtctl-${REPO}-${BRANCH}:latest
Мы можем «горячее перезагрузку» 🔥 наши изменения, чтобы развиваться еще быстрее! enterpoint.sh
определяет во время выполнения, чтобы запускать колбу или оружием в зависимости от значения $ K_Service
. Таким образом, наша служба Flask перезапускается автоматически, когда обнаружены изменения в исходном коде:
#!/bin/bash echo $SA_KEY_FILE_BASE64 | base64 -d > $GOOGLE_APPLICATION_CREDENTIALS if [ "$K_SERVICE" = "localbuild" ] ; then export FLASK_APP="api.py" export FLASK_DEBUG=1 /app/env/bin/flask run --host=0.0.0.0 --port=$PORT else /app/env/bin/gunicorn --bind=0.0.0.0:$PORT api:app fi
Bitbucket в облачный источник репозитория
Код предан и выталкивается в частное репо Bitbucket. Наша ветвье структура проста:
- ⚙️.
dev
Для разработки на основе функций (мы можем иметь столько из них по мере необходимости!) - ✅
Тест
где все филиалы DEV объединены в (только по тягу запроса) - 🚀
прод
гдеТест
Выпускается (также только по выводу запрос только с двойным одобрением)
Bitbucket Repo – автоматически синхронизируется для хранилища облачного источника того же имени и структуры ветки.
Развертывание с облачной сборкой
Облачная сборка Разрешить Работа построения для срабатывания на толчке нашему репо. Это пробеги представляет CloudBuild.yaml
Файл из нашего репо в облачную сборку, который выполняет следующие шаги для текущего отделения:
Вытаскивает предыдущий образ докера из реестра Google Container
docker pull gcr.io/$PROJECT_ID/$REPO_NAME-$BRANCH_NAME:latest
Строится и тегируют новый образ докера из нашего Dockerfile
выше:
docker build . \ --cache-from gcr.io/$PROJECT_ID/$REPO_NAME-$BRANCH_NAME:latest \ -t gcr.io/$PROJECT_ID/$REPO_NAME-$BRANCH_NAME:$SHORT_SHA \ -t gcr.io/$PROJECT_ID/$REPO_NAME-$BRANCH_NAME:latest
Толкает последнее изображение в реестр контейнера Google:
docker push gcr.io/$PROJECT_ID/$REPO_NAME-$BRANCH_NAME:$SHORT_SHA docker push gcr.io/$PROJECT_ID/$REPO_NAME-$BRANCH_NAME:latest
Развертывает новейшее изображение на Cloud Run и отображает соответствующие домены для доступа к услуге:
gcloud beta run deploy $REPO_NAME-$BRANCH_NAME \ --image gcr.io/$PROJECT_ID/$REPO_NAME-$BRANCH_NAME:$SHORT_SHA gcloud beta run domain-mappings create \ --service $REPO_NAME-$BRANCH_NAME \ --domain $BRANCH_NAME.$REPO_NAME.shirtctl.com
Это все сейчас! Следить за rushctl.com Для наших MVP запуска запуска! 👕👚.
Оригинал: “https://dev.to/shirtctl/building-a-super-fast-serverless-container-deployment-pipeline-on-google-cloud-251o”