GitLab runner, ошибка на pu sh, тогда как то же самое работает на git bash или python с консоли - PullRequest
2 голосов
/ 18 марта 2020

Context

Мы пытаемся выполнить задание GitLab, которое по определенному тегу изменяет файл заголовка версии и добавляет ветку / тег выпуска к этому набору изменений.

Сервер запуска GitLab находится на моей машине и запущен моим пользователем как сервис (который правильно зарегистрирован на нашем сервере GitLab).

Задание запуска GitLab в основном запускает скрипт python, который использует gitpython чтобы выполнить задание, есть всего несколько изменений в yml-файле бегуна (добавлена ​​before_script часть, чтобы иметь возможность иметь разрешение на загрузку, получила его оттуда: { ссылка }), здесь полный текст .gitlab-ci.yml file:

variables:
  GIT_SUBMODULE_STRATEGY: recursive

stages: [ build, publish, release ]

release_tag:
  stage: build
  before_script:
    - git config --global user.name ${GITLAB_USER_NAME}
    - git config --global user.email ${GITLAB_USER_EMAIL}
  script:
    - python .\scripts\release_gitlab_runner.py
  only:
    # Trigger on specific regex...
    - /^Src_V[0-9]+\.[0-9]+\.[0-9]+$/
  except:
    # .. only for tags then except branches, see doc (https://docs.gitlab.com/ee/ci/yaml/#regular-expressions): "Only the tag or branch name can be matched by a regular expression."
    - branches

Также добавлен трюк в URL python при нажатии (pu sh с user:personal_access_token@repo_URL вместо URL-адреса бегуна по умолчанию, он получен из того же ответа, что и выше, и токен имеет был сгенерирован из компании gitlab => user "Settings" => "Access Tokens" => "Добавить личный токен доступа" со всеми правами и никогда не истекает), и здесь, не фактический скрипт scripts\release_gitlab_runner.py python, а один упрощен, чтобы иметь git поток как можно больше стоять как можно больше для того, что мы хотим (получить все, создать локальную ветку со случайным именем, чтобы она не существовала, изменить файл, этап, зафиксировать и, наконец, pu sh):

# -*-coding:utf-8 -*

import uuid
import git
import sys
import os

# Since we are in <git root path>/scripts folder, git root path is this file's path parent path
GIT_ROOT_PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
try:
    # Get user login and URL from GITLAB_USER_LOGIN and CI_REPOSITORY_URL gitlab environment variables
    gitlabUserLogin = os.environ["GITLAB_USER_LOGIN"]
    gitlabFullURL = os.environ["CI_REPOSITORY_URL"]
    # Push at "https://${GITLAB_USER_NAME}:${PERSONAL_ACCESS_TOKEN}@gitlab.companyname.net/demo/demo.git")
    # generatedPersonalAccessToken has been generated with full rights from https://gitlab.companyname.net/profile/personal_access_tokens and set in a variable not seen here
    gitlabPushURL = "https://{}:{}@{}".format(gitlabUserLogin, generatedPersonalAccessToken, gitlabFullURL.split("@")[-1])
    print("gitlabFullURL is [{}]".format(gitlabFullURL))
    print("gitlabPushURL is [{}]".format(gitlabPushURL))

    branchName = str(uuid.uuid1())

    print("Build git.Repo object with [{}] root path".format(GIT_ROOT_PATH))
    repo = git.Repo(GIT_ROOT_PATH)

    print("Fetch all")
    repo.git.fetch("-a")

    print("Create new local branch [{}]".format(branchName))
    repo.git.checkout("-b", branchName)

    print("Modify file")
    versionFile = os.path.join(GIT_ROOT_PATH, "public", "include" , "Version.h")
    patchedVersionFileContent = ""
    with open(versionFile, 'r') as versionFileContent:
        patchedVersionFileContent = versionFileContent.read()
        patchedVersionFileContent = re.sub("#define VERSION_MAJOR 0", "#define VERSION_MAJOR {}".format(75145), patchedVersionFileContent)
    with open(versionFile, 'w') as versionFileContent:
        versionFileContent.write(patchedVersionFileContent)

    print("Stage file")
    repo.git.add("-u")

    print("Commit file")
    repo.git.commit("-m", "New version file in new branch {}".format(branchName))

    print("Push new branch [{}] remotely".format(branchName))
    # The error is at below line:
    repo.git.push(gitlabPushURL, "origin", branchName)

    sys.exit(0)
except Exception as e:
    print("Exception: {}".format(e))

    sys.exit(-1)

Проблема

Даже с уловкой иметь права, когда мы пытаемся сделать пу sh из GitLab, возникает следующая ошибка:

Cmd('git') failed due to: exit code(1)
  cmdline: git push https://user:token@gitlab.companyname.net/demo/repo.git origin 85a3fa6e-690a-11ea-a07d-e454e8696d31
  stderr: 'error: src refspec origin does not match any
error: failed to push some refs to 'https://user:token@gitlab.companyname.net/demo/repo.git''

Что работает

Если я открою Git Bash, я успешно запускаю ручные команды:

git fetch -a
git checkout -b newBranch
vim public/include/Version.h
=> At this point file has been modified
git add -u
git commit -m "New version file in new branch"
git push origin newBranch

Здесь, если мы получим все из других источников, мы можем увидеть newBranch с изменениями файла версии

И то же самое, если мы запустим содержимое скрипта (без изменения URL) из командной строки python (при условии, что все операции импорта, как в сценарии были выполнены):

GIT_ROOT_PATH = "E:\\path\\to\\workspace\\repo"
branchName = str(uuid.uuid1())
repo = git.Repo(GIT_ROOT_PATH)
repo.git.fetch("-a")
repo.git.checkout("-b", branchName)
versionFile = os.path.join(GIT_ROOT_PATH, "public", "include" , "Version.h")
patchedVersionFileContent = ""
with open(versionFile, 'r') as versionFileContent:
    patchedVersionFileContent = versionFileContent.read()
    patchedVersionFileContent = re.sub("#define VERSION_MAJOR 0", "#define VERSION_MAJOR {}".format(75145), patchedVersionFileContent)
with open(versionFile, 'w') as versionFileContent:
    versionFileContent.write(patchedVersionFileContent)
repo.git.add("-u")
repo.git.commit("-m", "New version file in new branch {}".format(branchName))
repo.git.push("origin", branchName)

Вывод

Я не могу найти, что я делаю неправильно, когда при запуске из GitLab Runner, что-то мне не хватает?

Единственное, что я могу видеть по-другому при запуске из GitLab, это то, что после выборки я вижу, что у меня отстраненная голова (список * 1039) * дает например ['* (HEAD отделить ed в 560976b) ',' branchName ',' remotes / origin / otherExistingBranch ', ...]), но это не должно быть проблемой, так как я создаю новую ветку, где pu sh, верно?

1 Ответ

4 голосов
/ 18 марта 2020

Git сказал, что вы использовали неправильный refspe c. Когда вам нужно сделать pu sh в другом пульте, вы должны сначала сделать gitlab = repo.create_remote("gitlab", gitlabPushURL), а затем pu sh, например repo.push("gitlab", branchName).

Редактировать из @gluttony, чтобы не прерывать следующий git запустить с «удаленным уже существует»:

remote_name = "gitlab"
if remote_name not in repo.remotes:
    repo.create_remote(remote_name, gitlabPushURL)
...