Трубопроводы Bitbucket: сбой gcloud (UnicodeDecodeError)

Изменить: я хочу отметить, что эта проблема не возникает, если я вручную развернуть с облачным SDK на моем компьютере. Только с трубопроводами

Отредактируйте еще раз: я добавил verbosity = debug к своему развертыванию приложения gcloud. Вот что сгенерировано:

Do you want to continue (Y/n)?  
DEBUG: No bucket specified, retrieving default bucket.
DEBUG: Using bucket [gs://staging.PROJECT.appspot.com].
DEBUG: Service [appengineflex.googleapis.com] is already enabled for project [PROJECT]
Beginning deployment of service [default]...
INFO: Need Dockerfile to be generated for runtime php
Building and pushing image for service [default]
DEBUG: 'ascii' codec can't decode byte 0xe2 in position 26: ordinal not in range(128)

Traceback (most recent call last):
  File "/usr/lib/google-cloud-sdk/lib/googlecloudsdk/calliope/cli.py", line 845, in Execute
    resources = calliope_command.Run(cli=self, args=args)
  File "/usr/lib/google-cloud-sdk/lib/googlecloudsdk/calliope/backend.py", line 767, in Run
    resources = command_instance.Run(args)
  File "/usr/lib/google-cloud-sdk/lib/surface/app/deploy.py", line 87, in Run
    parallel_build=False)
  File "/usr/lib/google-cloud-sdk/lib/googlecloudsdk/command_lib/app/deploy_util.py", line 594, in RunDeploy
    flex_image_build_option=flex_image_build_option)
  File "/usr/lib/google-cloud-sdk/lib/googlecloudsdk/command_lib/app/deploy_util.py", line 393, in Deploy
    flex_image_build_option)
  File "/usr/lib/google-cloud-sdk/lib/googlecloudsdk/command_lib/app/deploy_util.py", line 283, in _PossiblyBuildAndPush
    self.deploy_options.parallel_build)
  File "/usr/lib/google-cloud-sdk/lib/googlecloudsdk/api_lib/app/deploy_command_util.py", line 427, in BuildAndPushDockerImage
    skip_files=service.parsed.skip_files.regex)
  File "/usr/lib/google-cloud-sdk/lib/googlecloudsdk/api_lib/app/cloud_build.py", line 151, in UploadSource
    skip_files)
  File "/usr/lib/google-cloud-sdk/lib/googlecloudsdk/api_lib/app/cloud_build.py", line 122, in _GetIncludedPaths
    paths = docker.utils.exclude_paths(root, exclude)
  File "/usr/bin/../lib/google-cloud-sdk/lib/third_party/docker/docker/utils/utils.py", line 111, in exclude_paths
    all_paths = get_paths(root)
  File "/usr/bin/../lib/google-cloud-sdk/lib/third_party/docker/docker/utils/utils.py", line 135, in get_paths
    for parent, dirs, files in os.walk(root, followlinks=False):
  File "/usr/lib/python2.7/os.py", line 296, in walk
    for x in walk(new_path, topdown, onerror, followlinks):
  File "/usr/lib/python2.7/os.py", line 296, in walk
    for x in walk(new_path, topdown, onerror, followlinks):
  File "/usr/lib/python2.7/os.py", line 296, in walk
    for x in walk(new_path, topdown, onerror, followlinks):
  File "/usr/lib/python2.7/os.py", line 296, in walk
    for x in walk(new_path, topdown, onerror, followlinks):
  File "/usr/lib/python2.7/os.py", line 286, in walk
    if isdir(join(top, name)):
  File "/usr/lib/python2.7/posixpath.py", line 80, in join
    path += '/' + b
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 26: ordinal not in range(128)
ERROR: gcloud crashed (UnicodeDecodeError): 'ascii' codec can't decode byte 0xe2 in position 26: ordinal not in range(128)

Я пытаюсь развернуть в gcloud с использованием конвейеров bitbucket.

У меня не было этой странной ошибки изначально, пока я не закончил редактирование определенных файлов (я развертываю сайт WordPress, используя движок приложения).

Тем не менее, даже после возврата моего репозитория назад, когда моя сборка была успешной, он завершается сбоем снова с ошибкой: `ERROR: gcloud crash (UnicodeDecodeError): кодек 'ascii' не может декодировать байт 0xe2 в позиции 26: порядковый номер не находится в диапазоне (128)

Это не имеет смысла для меня. Работало нормально. Есть ли способ расширить эту ошибку или найти файл, из-за которого это происходит?

Следующее происходит после запуска сборки в конвейерах:

+ gcloud app deploy
Services to deploy:
descriptor:      [/opt/atlassian/pipelines/agent/build/app.yaml]
source:          [/opt/atlassian/pipelines/agent/build]
target project:  [project]
target service:  [default]
target version:  [20180731t175825]
target url:      [https://site.appspot.com]
Do you want to continue (Y/n)?  
Beginning deployment of service [default]...
Building and pushing image for service [default]
ERROR: gcloud crashed (UnicodeDecodeError): 'ascii' codec can't decode byte 0xe2 in position 26: ordinal not in range(128)
If you would like to report this issue, please run the following command:
  gcloud feedback
To check gcloud for common problems, please run the following command:
  gcloud info --run-diagnostics

Это мой bitbucket-pipelines.yml

изображение: php: 7.1.1

pipelines:
  branches:
   master:
    - step:
        # set GCLOUD_PROJECT environment variablee to your project ID
        # set GCLOUD_API_KEYFILE environment variable to base64-encoded keyfile as described here: https://confluence.atlassian.com/x/dm2xNQ
        name: Deploy to GCloud
        deployment: production   # set to test, staging or production
        # trigger: manual  # uncomment to have a manual step
        image: google/cloud-sdk:latest
        caches:
          - composer
        script:
          - echo $GCLOUD_API_KEYFILE | base64 --decode --ignore-garbage > ./gcloud-api-key.json
          - gcloud auth activate-service-account --key-file gcloud-api-key.json
          - gcloud config set project $GCLOUD_PROJECT
          - gcloud app deploy app.yaml

app.yaml

runtime: php
env: flex

handlers:
- url: /(.*\.(htm|html|css|js))$
  static_files: wordpress/\1
  upload: wordpress/.*\.(htm|html|css|js)$
  application_readable: true

- url: /wp-content/(.*\.(ico|jpg|jpeg|png|gif|woff|ttf|otf|eot|svg))$
  static_files: wordpress/wp-content/\1
  upload: wordpress/wp-content/.*\.(ico|jpg|jpeg|png|gif|woff|ttf|otf|eot|svg)$
  application_readable: true

- url: /(.*\.(ico|jpg|jpeg|png|gif|woff|ttf|otf|eot|svg))$
  static_files: wordpress/\1
  upload: wordpress/.*\.(ico|jpg|jpeg|png|gif|woff|ttf|otf|eot|svg)$
  application_readable: true

- url: /wp-includes/images/media/(.*\.(ico|jpg|jpeg|png|gif|woff|ttf|otf|eot|svg))$
  static_files: wordpress/wp-includes/images/media/\1
  upload: wordpress/wp-includes/images/media/.*\.(ico|jpg|jpeg|png|gif|woff|ttf|otf|eot|svg)$
  application_readable: true

- url: /wp-admin/(.+)
  script: wordpress/wp-admin/\1
  secure: always

- url: /wp-admin/
  script: wordpress/wp-admin/index.php
  secure: always

- url: /wp-login.php
  script: wordpress/wp-login.php
  secure: always

- url: /wp-cron.php
  script: wordpress/wp-cron.php
  login: admin

- url: /xmlrpc.php
  script: wordpress/xmlrpc.php

- url: /wp-(.+).php
  script: wordpress/wp-\1.php

- url: /(.+)?/?
  script: wordpress/index.php

beta_settings:
  cloud_sql_instances: project:us-central1:match

runtime_config:
  document_root: wordpress
  skip_lockdown_document_root: true

env_variables:
  WHITELIST_FUNCTIONS: escapeshellarg,escapeshellcmd,exec,pclose,popen,shell_exec,phpversion,php_uname

1 ответ

Решение

Проблема вызвана не-ascii символом в пути, который gcloud пытается обработать.

Сообщение UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 26: ordinal not in range(128) исключение Python, указывающее на проблему при попытке закодировать байт 0xe2 как ASCII.

Бег gcloud --verbosity=debug .... генерирует трассировку Python.

Конец трассировки

  File "/usr/bin/../lib/google-cloud-sdk/lib/third_party/docker/docker/utils/utils.py", line 135, in get_paths
    for parent, dirs, files in os.walk(root, followlinks=False):
  File "/usr/lib/python2.7/os.py", line 296, in walk
    for x in walk(new_path, topdown, onerror, followlinks):
  File "/usr/lib/python2.7/os.py", line 296, in walk
    for x in walk(new_path, topdown, onerror, followlinks):
  File "/usr/lib/python2.7/os.py", line 296, in walk
    for x in walk(new_path, topdown, onerror, followlinks):
  File "/usr/lib/python2.7/os.py", line 296, in walk
    for x in walk(new_path, topdown, onerror, followlinks):
  File "/usr/lib/python2.7/os.py", line 286, in walk
    if isdir(join(top, name)):
  File "/usr/lib/python2.7/posixpath.py", line 80, in join
    path += '/' + b

показывает, что код Python идет по иерархии файловой системы (вот что os.walk делает) и что проблемная операция создает путь (это то, что path += '/' + b делается).

Принимая во внимание эту информацию, следующим шагом является проверка путей, связанных с развертыванием символов, отличных от ascii, что OP удалось успешно выполнить с помощью методов, описанных в этом ответе суперпользователя.

Другие вопросы по тегам