Cloud Run — это облачный сервис в GCP, который выполняет программный код упакованный в Docker-контейнер.
Cloud Run тесно интегрируется с другими сервисами GCP:
Цель: познакомиться с сервисом Cloud Run.
План работы:
Ход работы:
Войдите в https://console.cloud.google.com (далее консоль GCP) с помощью своего Google-аккаунта. При входе в первый раз GCP создаст вам учетную запись. При этом нужно будет выбрать произвольную страну.
Убедитесь, что преподаватель знает ваш Google-аккаунт и пригласил вас в свой проект (далее будем обращаться к нему IMI-SVFU). Откройте почту Gmail, найдите приглашение и примите его.
В консоли GCP выберите проект IMI-SVFU.
Откройте Google Cloud Shell:

gcloud auth list
gcloud config set account <Ваш Google-аккаунт>
gcloud config list project
gcloud config set project imi-svfu
mkdir ~/helloworld-python
cd ~/helloworld-python
touch main.py requirements.txt Procfile
cloudshell edit main.py
cloudshell edit requirements.txt
cloudshell edit Procfile
virtualenv venv
source venv/bin/activate
pip install -r requirements.txt
python main.py
Откройте превью в браузере и убедитесь, что код работает (должно появиться сообщение “Hello World!”):

Остановите интерпретатор Python нажав клавишу Ctrl+C
deactivate
rm -r venv/
REGION=europe-north1
gcloud run deploy <ваша фамилия> --source . --platform managed --region $REGION --allow-unauthenticated
main.py:
from flask import Flask, request
app = Flask(__name__)
@app.get("/")
def hello():
"""Return a friendly HTTP greeting."""
who = request.args.get("who", default="World")
return f"Hello {who}!\n"
if __name__ == "__main__":
# Development only: run "python main.py" and open http://localhost:8080
# When deploying to Cloud Run, a production-grade WSGI HTTP server,
# such as Gunicorn, will serve the app.
app.run(host="localhost", port=8080, debug=True)
requirements.txt:
# https://pypi.org/project/flask
Flask==3.0.2
# https://pypi.org/project/gunicorn
gunicorn==21.2.0
Procfile:
web: gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 main:app
Цель: научиться настраивать развертывание в Cloud Run в качестве этапа пайплайна Cloud Build.
План работы:
Ход работы:
Откройте Google Cloud Shell:

gcloud config set account <Ваш Google-аккаунт>
gcloud config set project imi-svfu
REGION=europe-north1
PROJECT_ID=imi-svfu
PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
mkdir ~/video-describer-job
cd $_
mkdir views
touch package.json app.js Dockerfile views/index.pug
cloudshell edit package.json
cloudshell edit app.js
cloudshell edit Dockerfile
cloudshell edit views/index.pug
npm install
npm run start
Откройте превью приложения (оно пока содержит ошибки, поэтому не сохраняет изменения)
Нажмите в Cloud Shell клавишу Ctrl+C чтобы прервать работу приложения
git config --global user.name "<имя разработчика>"
git config --global user.email "<почта разработчика>"
git config --global credential.helper cache
git init
git branch -M main
echo node_modules/ >> .gitignore
git add .
git commit -m "Initial commit"
git remote add origin <https-ссылка на репозиторий>
Создайте персональный токен доступа (classic) для GitHub по инструкции (с правом доступа к репозиториям) и используйте его в дальнейшем как пароль для git в командной строке.
git push -u origin main
Откройте в консоли GCP сервис Cloud Run.
Нажмите кнопку “DEPLOY CONTAINER → SERVICE” для начала создания сервиса.
Выберите вариант “Continuously deploy from a repository” с логотипом GitHub. Нажмите кнопку “SET UP WITH CLOUD BUILD”.
При необходимости разрешите доступ Cloud Build к GitHub и выберите созданный ранее репозиторий. Нажмите кнопку “NEXT”.
Выберите тип сборки с помощью Dockerfile. Нажмите кнопку “SAVE”.
Введите в качестве имени сервиса свою группу и фамилию.
Выберите регион europe-north1.
Выберите вариант аутентификации пользователей “Allow unauthenticated invocations”.
Оставьте остальные изменения без изменений и нажмите кнопку “CREATE”.
Откройте в браузере URL сервиса и проверьте что сервис отображает сообщение “Hello World!”
Измените сообщение в app.js
git add .
git commit -m "Second commit"
git push
Откройте в консоли GCP сервис Cloud Build и следите за процессом сборки и публикации новой версии
Вернитесь сервис Cloud Run, откройте свой сервис и проверьте что трафик теперь обслуживается новой версией кода.
app.js:
const express = require("express");
const app = express();
app.set('view engine', 'pug')
app.get("/", async (_req, res) => {
res.render('index', {message: "Hello World!"})
});
const port = parseInt(process.env.PORT) || 8080;
app.listen(port, async () => {
console.log(`Listening on port ${port}`);
});
package.json:
{
"name": "demo",
"version": "1.0.0",
"main": "app.js",
"scripts": {
"start": "node app.js"
},
"license": "ISC",
"dependencies": {
"express": "^5.1",
"pug": "^3.0"
}
}
views/index.pug:
html
body
h1= message
Dockerfile
FROM node:lts
COPY . .
RUN npm ci
EXPOSE 8080
CMD npm run start