Рубрики
Без рубрики

Создание супер быстрой бессвесовой контейнерной контейнеров в Google Cloud

Один из наших принципов вождения для ManceCtl – это #frugalbydesign – мы просто не хотим платить за … Помечено GoogleCloud, DevOps, Python, Git.

Один из наших принципов вождения для Рубрикакт Является ли #frugalbydesign – мы просто не хотим платить за то, что мы не используем.

Наша архитектура должна балансировать стоимость наряду с другими основными возможностями, такими как охрана приложений 🔒, гибкость дизайна 💪 и совместное обеспечение разработчика 👩💻👨💻.

В этом посте мы будем делиться некоторыми деталями нашего постоянного трубопровода развертывания. Мы объединили Bitbucket с обслуживанием Google Cloud Build, которые развертывают наши приложения на облачный проход в среднем в среднем 1-2 минуты на сборку!

Для развития мы также создали локальный рабочий процесс для:

  1. Ускорить итерацию локального кода 🏎💨
  2. Минимизируйте количество рабочих мест облачных построек и изменений облачных прогонов (#frugalbydesign) ☁️.
  3. Держите наш коммит журналом 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”