Могу ли я использовать триггер Container Registry для гибкого развертывания GAE Node.js?

Я узнал, как использовать триггер реестра контейнеров для развертывания облачных функций Google, из следующего руководства.

Автоматический бессерверный развертывания с помощью Cloud Source Repositories и Container Builder

У меня есть гибкое приложение Google App Engine. Среда выполнения — Node.js. Я хочу развернуть приложение, запускаемое git push. Есть ли хорошие ссылки?

Я использую этот пример кода. Ручное развертывание работает нормально.

* tree

.
├── app.js
├── app.yaml
└── package.json

* app.js

'use strict';
const express = require('express');
const app = express();
app.get('/', (req, res) => {
  res.status(200).send('Hello, world!').end();
});
const PORT = process.env.PORT || 8080;
app.listen(PORT, () => {
  console.log(`App listening on port ${PORT}`);
console.log('Press Ctrl+C to quit.');
});

* app.yaml

runtime: nodejs
env: flex

* package.json

{
  "name": "appengine-hello-world",
  "description": "Simple Hello World Node.js sample for Google App Engine Flexible Environment.",
  "version": "0.0.1",
  "private": true,
  "license": "Apache-2.0",
  "author": "Google Inc.",
  "repository": {
    "type": "git",
    "url": "https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git"
  },
  "engines": {
    "node": ">=4.3.2"
  },
  "scripts": {
    "deploy": "gcloud app deploy",
    "start": "node app.js",
    "lint": "samples lint",
    "pretest": "npm run lint",
    "system-test": "samples test app",
    "test": "npm run system-test",
    "e2e-test": "samples test deploy"
  },
  "dependencies": {
    "express": "4.15.4"
  },
  "devDependencies": {
    "@google-cloud/nodejs-repo-tools": "1.4.17"
  },
  "cloud-repo-tools": {
    "test": {
      "app": {
        "msg": "Hello, world!"
      }
    },
    "requiresKeyFile": true,
    "requiresProjectId": true
  }
}

* deploy command

$ gcloud app deploy

Обновление 1

Я нашел похожий вопрос.

Как автоматически развернуть приложение Google гибкий движок, использующий Container Registry с Build Trigger

Я добавил cloudbuild.yaml.

steps:
# Build the Docker image.
- name: gcr.io/cloud-builders/docker
args: ['build', '-t', 'gcr.io/$PROJECT_ID/app', '.']
# Push it to GCR.
- name: gcr.io/cloud-builders/docker
args: ['push', 'gcr.io/$PROJECT_ID/app']
# Deploy your Flex app from the image in GCR.
- name: gcr.io/cloud-builders/gcloud
args: ['app', 'deploy', 'app.yaml', '--image-url=gcr.io/$PROJECT_ID/app']
# Note that this build pushes this image.
images: ['gcr.io/$PROJECT_ID/app']

Однако я получил ошибку. Сообщение об ошибке: «ошибка загрузки шаблона: yaml: строка 5: не найден ожидаемый ключ». Я изучаю это.


Обновление 2

Причиной был неверный формат yaml. Я изменил его следующим образом.

steps:
  # Build the Docker image.
- name: gcr.io/cloud-builders/docker
  args: ['build', '-t', 'gcr.io/$PROJECT_ID/app', '.']
  # Push it to GCR.
- name: gcr.io/cloud-builders/docker
  args: ['push', 'gcr.io/$PROJECT_ID/app']
  # Deploy your Flex app from the image in GCR.
- name: gcr.io/cloud-builders/gcloud
  args: ['app', 'deploy', 'app.yaml', '--image-url=gcr.io/$PROJECT_ID/app']
  # Note that this build pushes this image.
  images: ['gcr.io/$PROJECT_ID/app']

У меня другая ошибка. Сообщение "ошибка загрузки шаблона: неизвестное поле "изображения" в cloudbuild_go_proto.BuildStep"


Обновление 3

Я заметил, что отступ «изображения» был неправильным.

steps:
  ...
# Note that this build pushes this image.
images: ['gcr.io/$PROJECT_ID/app']

Я столкнулся с новой ошибкой.

starting build "e3e00749-9c70-4ac7-a322-d096625b695a"

FETCHSOURCE
Initialized empty Git repository in /workspace/.git/
From https://source.developers.google.com/p/xxxx/r/bitbucket-zono-api-btc
* branch 0da6c8bf209c72b6406f3801f3eb66d346187f4e -> FETCH_HEAD
HEAD is now at 0da6c8b fix invalid yaml
BUILD
Starting Step #0
Step #0: Already have image (with digest): gcr.io/cloud-builders/docker
Step #0: unable to prepare context: unable to evaluate symlinks in Dockerfile path: lstat /workspace/Dockerfile: no such file or directory
Finished Step #0
ERROR
ERROR: build step 0 "gcr.io/cloud-builders/docker" failed: exit status 1

Да. У меня нет файла Dockerfile, поскольку я использую гибкую среду выполнения Node.js Google App Engine. Докер не нужен.


Обновление 4

Я добавил Dockerfile

FROM gcr.io/google-appengine/nodejs

Затем произошла новая ошибка.

Step #2: ERROR: (gcloud.app.deploy) User [[email protected]] does not have permission to access app [xxxx] (or it may not exist): App Engine Admin API has not been used in project xxx before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/appengine.googleapis.com/overview?project=xxx then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.

Обновление 5

Я включил App Engine Admin API, после чего появилась следующая ошибка.

Step #2: Do you want to continue (Y/n)? 
Step #2: WARNING: Unable to verify that the Appengine Flexible API is enabled for project [xxx]. You may not have permission to list enabled services on this project. If it is not enabled, this may cause problems in running your deployment. Please ask the project owner to ensure that the Appengine Flexible API has been enabled and that this account has permission to list enabled APIs.
Step #2: Beginning deployment of service [default]...
Step #2: WARNING: Deployment of service [default] will ignore the skip_files field in the configuration file, because the image has already been built.
Step #2: Updating service [default] (this may take several minutes)...
Step #2: ...............................................................................................................................failed.
Step #2: ERROR: (gcloud.app.deploy) Error Response: [9] 
Step #2: Application startup error:
Step #2: npm ERR! path /app/package.json
Step #2: npm ERR! code ENOENT
Step #2: npm ERR! errno -2
Step #2: npm ERR! syscall open
Step #2: npm ERR! enoent ENOENT: no such file or directory, open '/app/package.json'
Step #2: npm ERR! enoent This is related to npm not being able to find a file.

Я изменил дерево кода, но это не сработало. Я подтвердил, что гибкий API Appengine включен. Я понятия не имею, что мне попробовать дальше.

.
├── Dockerfile
├── app
│   ├── app.js
│   └── package.json
├── app.yaml
└── cloudbuild.yaml

Обновление 6

Когда я развертываю вручную, артефакт выглядит следующим образом.

us.gcr.io/xxxxx/appengine/default.20180316t000144

Должен ли я использовать этот артефакт...? Я в замешательстве..


Обновление 7

Выполняются две сборки. Я не знаю, правильно ли это.

введите здесь описание изображения




Ответы (2)


Ваш Dockerfile не копирует исходный код в образ.

Вы можете переместить все обратно в тот же каталог, чтобы

.
├── app.js
├── app.yaml
├── cloudbuild.yaml
├── Dockerfile
└── package.json

но это не имеет значения.

Вставьте это в свой Dockerfile, и он должен работать:

FROM gcr.io/google-appengine/nodejs

# Working directory is where files are stored, npm is installed, and the application is launched
WORKDIR /app

# Copy application to the /app directory.
# Add only the package.json before running 'npm install' so 'npm install' is not run if there are only code changes, no package changes
COPY package.json /app/package.json
RUN npm install
COPY . /app

# Expose port so when container is launched you can curl/see it.
EXPOSE 8080

# The command to execute when Docker image launches.
CMD ["npm", "start"]

Изменить: это файл cloudbuild.yaml, который я использовал:

steps:
- name: gcr.io/cloud-builders/docker
  args: ['build', '-t', 'gcr.io/$PROJECT_ID/app', '.']
- name: gcr.io/cloud-builders/docker
  args: ['push', 'gcr.io/$PROJECT_ID/app']
- name: gcr.io/cloud-builders/gcloud
  args: ['app', 'deploy', 'app.yaml', '--image-url=gcr.io/$PROJECT_ID/app'] 
images: ['gcr.io/$PROJECT_ID/app']
person codrienne    schedule 16.03.2018
comment
И не забудьте предоставить разрешения на развертывание App Engine сервисной учетной записи вашего проекта с именем [email protected]? cloud.google.com/container- строитель/документы/защита-сборки/ - person Philmod; 16.03.2018

Мне помог технарь. Я изменил структуру каталогов и cloudbuild.yaml. Тогда это сработало. Спасибо.

* Code Tree

.
├── app
│   ├── app.js
│   ├── app.yaml
│   └── package.json
└── cloudbuild.yaml

* cloudbuild.yaml

steps:
- name: gcr.io/cloud-builders/npm
  args: ['install', 'app']
- name: 'gcr.io/cloud-builders/gcloud'
  args: ['app', 'deploy', 'app/app.yaml']
person zono    schedule 16.03.2018
comment
Привет, Zono, если вы не используете собственный Dockerfile, нет причин запускать gcloud app deploy на GCB. Также npm install app не будет использоваться, так как на втором шаге будет воссоздана другая сборка. - person Philmod; 16.03.2018
comment
@PhilippeModard Спасибо, Филипп. Я думал, почему требуются две сборки. Я добавил обновление 7 на свой вопрос со скриншотом истории сборки. Я попробую еще раз без развертывания приложения gcloud на втором этапе. - person zono; 21.03.2018