2

基本的に 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メソッドはUsernamePasswordを要求するため、この関数は以下のエラーをスローします。

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 キーを配置したくありません。

4

1 に答える 1