Развертывание Google App Engine с частным git-репо в package.json - PullRequest
0 голосов
/ 30 сентября 2019

У меня есть зависимость от частного репозитория Bitbucket в моем пакете. Json

{
   "my-dependency": "git+ssh://git@bitbucket.org/something/my-dependency.git"
}

Я следовал инструкциям, приведенным в [1] и [2], и создал ключ SSH, который я зашифровал с помощью kms.

Я создал пользовательский cloudbuild.yaml следующим образом:

# Decrypt the file containing the key
steps:
  - name: 'gcr.io/cloud-builders/gcloud'
    args:
      - kms
      - decrypt
      - --ciphertext-file=bitbucket_rsa.enc
      - --plaintext-file=/root/.ssh/id_rsa
      - --location=global
      - --keyring=default
      - --key=bitbucket-key
    volumes:
      - name: 'ssh'
        path: /root/.ssh

  # Set up git with key and domain
  - name: 'gcr.io/cloud-builders/git'
    entrypoint: 'bash'
    args:
      - '-c'
      - |
        chmod 600 /root/.ssh/id_rsa
        cat <<EOF >/root/.ssh/config
        Hostname bitbucket.org
        IdentityFile /root/.ssh/id_rsa
        EOF
        mv known_hosts /root/.ssh/known_hosts
    volumes:
      - name: 'ssh'
        path: /root/.ssh

  # Install
  - name: 'gcr.io/cloud-builders/yarn'
    args: ['install']
    volumes:
      - name: 'ssh'
        path: /root/.ssh

  # Build
  - name: "gcr.io/cloud-builders/yarn"
    args: ["build"]
    volumes:
      - name: 'ssh'
        path: /root/.ssh

  # Deploy
  - name: "gcr.io/cloud-builders/gcloud"
    args: ["app", "deploy", "my-service.yaml"]
    volumes:
      - name: 'ssh'
        path: /root/.ssh

Когда я запускаю его с помощью gcloud builds submit --config=cloudbuild.yaml, шаги с 0 по 3 выполняются нормально, но шаг 4 не выполняетсяпотому что app deploy вызывает другой yarn install, который не имеет доступа к ключу SSH, определенному на шагах # 0 и # 1:

Step #4: INFO     rm_node_modules took 0 seconds
Step #4: INFO     starting: yarn_install
Step #4: INFO     yarn_install yarn install
Step #4: INFO     `yarn_install` stdout:
Step #4: yarn install v1.9.4
Step #4: [1/5] Validating package.json...
Step #4: [2/5] Resolving packages...
Step #4: [3/5] Fetching packages...
Step #4: info Visit https://yarnpkg.com/en/docs/cli/install for     documentation about this command.
Step #4:
Step #4: INFO     `yarn_install` had stderr output:
Step #4: error Command failed.
Step #4: Exit code: 128
Step #4: Command: git
Step #4: Arguments: ls-remote --tags --heads     ssh://git@bitbucket.org/something/my-dependency.git
Step #4: Directory: /workspace
Step #4: Output:
Step #4: Host key verification failed.
Step #4: fatal: Could not read from remote repository.
Step #4:
Step #4: Please make sure you have the correct access rights
Step #4: and the repository exists.
Step #4:
Step #4: ERROR    error: `yarn_install` returned code: 1
Step #4: INFO     yarn_install took 11 seconds
Step #4: INFO     build process for FTL image took 11 seconds
Step #4: INFO     full build took 11 seconds
Step #4: ERROR    `yarn_install` had stderr output:
Step #4: error Command failed.

Спасибо за вашу помощь!

Ссылки:

[1] https://cloud.google.com/cloud-build/docs/access-private-github-repos

[2] Связать частный репозиторий в packages.json в приложении, развернутом в gcloud

Ответы [ 2 ]

0 голосов
/ 01 октября 2019

Так что, очевидно, невозможно предоставить ключ SSH для шага gcloud app deploy. Таким образом, использование

{
   "my-dependency": "git+ssh://git@bitbucket.org/something/my-dependency.git"
}

не будет работать!

Обходной путь (как упомянуто @JKleinne в связанной ветке) - клонировать репозиторий и установить его из локальной папки:

{
  "my-dependency": "lib/my-dependency"
}

Я написал небольшой скрипт bash, который проверяет, можно ли получить доступ к репо, и клонирует / извлекает его, если он может:

GIT_PROJECT=$1
GIT_REPO=$2
NAME=${GIT_REPO}
REMOTE="git@bitbucket.org:${GIT_PROJECT}/${GIT_REPO}.git"

if [[ ! -d ./lib ]]
then
    mkdir -p ./lib
fi

## Test if git repo is accessible
if ! git ls-remote --exit-code -h ${REMOTE}; then
    echo "Unable to access git repo, skipping"
    exit 0
fi

## Clone or pull
if [[ ! -d ./lib/${NAME} ]]
then
    git clone ${REMOTE} ./lib/${NAME}
else
    git -C ./lib/${NAME} pull
fi

Затем я использую его в сценарии предварительной установки:

"preinstall": "./get-internal-package.sh something my-dependency",
0 голосов
/ 30 сентября 2019

Всякий раз, когда возникает ошибка Host Key verification failed, она, скорее всего, связана с вашим known_hosts файлом, это означает, что ключ хоста bitbucket.org отсутствует в вашем файле known_hosts, и поэтому у клиента нет способа проверитьЭто. Попробуйте запустить ssh-keyscan -t rsa bitbucket.org > known_hosts, а затем cat known_hosts и посмотреть, присутствует ли ключ хоста bitbucket.org.

Если ответ отрицательный, а выходные данные пустые, это может быть проблема с сетью, мешающая процессу. Следуйте принятому ответу в этой ветке , чтобы устранить его.

Если ответ положительный, в идеале, пропущен только один шаг - настроить ключ SSH в Bitbucket. Зайдите на bitbucket.org в разделе «Настройки Bitbucket» и нажмите «SSH Keys» в одном из вариантов. Добавьте ключ (пометьте его как угодно) и вставьте вывод, полученный при запуске cat ~ / .ssh / id_rsa.pub, в раздел ключей.

По сути, в одном из потоков, которые вы связанный Я клонирую закрытый репозиторий в той же папке, что и корень моего приложения. Таким образом, в package.json я могу просто добавить эту строку dependencies: {“circular-structure-stringify”: “./circular-structure-stringify”}, которая позволит мне require() это как любой пакет npm.

Я понимаю, что должен был оставить ссылку на Github открытой, но, тем не менее, я работаю над другим примером, который я скоро опубликую в разделе комментариев. А пока дайте мне знать о результате.

...