基本的に Google ソース リポジトリのクローンを作成するために、Google Cloud Functions (python 3.7) を使用しようとしています。私はGitPythonライブラリを使用しており、その Cloud Functions のサービス アカウントには、複製するリポジトリに対するソース リポジトリ リーダーアクセス権があります。
当初、gcloud.sh credential.helperを git config に渡してみたのですが、Cloud Functions 環境 (少なくとも Python 3.7 環境) には Cloud SDK がインストールされていないようです。ここに私のコードの要点があります:
from git import Repo
import tempfile
def git_clone():
local_repo = tempfile.gettempdir()+'/localrepo'
repo = Repo.init(local_repo)
origin = repo.create_remote('origin', 'https://source.developers.google.com/p/PROJECT/r/REPO')
repo.config_writer().set_value("user", "name", "gsr-to-gcs-backup-function").release()
repo.config_writer().set_value("user", "email", "gsr-to-gcs-backup-function@PROJECT.iam.gserviceaccount.com").release()
repo.config_writer().set_value("credential \"https://source.developers.google.com\"", "helper", "gcloud.sh").release()
assert origin.exists()
assert origin == repo.remotes.origin == repo.remotes['origin']
origin.fetch()
Cloud Functions で実行すると、デフォルトで認証ヘルパーがない場合、httpsメソッドはUsernameとPasswordを要求するため、この関数は以下のエラーをスローします。
git.exc.GitCommandError: Cmd('git') failed due to: exit code(128) cmdline: git fetch -v origin stderr: 'fatal: could not read Username for 'https://source.developers.google.com ': 入出力エラー'
git cloneコマンドと一緒にトークンを渡すための以下の回答しか見つかりませんでしたが、トークンを渡す方法には回答していません。
gcloud を使用せずに Google ソース レポジトリのクローンを作成する
そのコマンドをクラウド シェルから開始すると、ハングするだけです。
gcloud auth git-helper store --account=YOUR_ACCOUNT --ignore-unknown $@
上記を使用して達成する予定の同様のものを次に示します(正しいコードではありません)。
Repo.clone_from("https://source.developers.google.com/p/PROJECT/r/REPO",tempfile.gettempdir(), multi_options=['--config credential.helper={}'.format(MYTOKEN)], branch='master')
後で本番環境にデプロイする必要があり、キーのローテーションは面倒なので、クローンの方法として代わりに SSH キーを配置したくありません。