Le contexte
Nous essayons de faire un travail de coureur qui gitlab ce, sur une certaine étiquette, modifie un fichier d'en-tête de version et ajouter une branche de sortie / tag à cette changeset.
Le serveur coureur est gitlab ce sur ma machine, lancé en tant que service par mon utilisateur (correctement enregistré sur notre serveur gitlab ce).
Le travail de coureur lance gitlab ce essentiellement un script python que les utilisations du gitpython pour le travail, il y a quelques changements dans le fichier runner YML (ajouté une before_script
partie pour être en mesure d'avoir la permission télécharger, il a obtenu à partir de là: https://stackoverflow.com / a / 55344804/11159476 ), voici plein .gitlab-ci.yml
fichier:
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
Aussi truc ajouté dans l'URL de python en poussant (push avec au user:personal_access_token@repo_URL
lieu d'URL de coureur par défaut, il a obtenu de même réponse que ci - dessus, et le jeton a été généré par la société gitlab ce => utilisateur « Paramètres » => « Accès Tokens » => « Ajouter un jeton » avec tous les droits et ne venant à échéance) un accès personnel, et voici, pas le véritable scripts\release_gitlab_runner.py
script python mais simplifié d'avoir un flux git en standard autant que possible pour ce que nous voulons (aller chercher tout, création d'une branche locale avec un nom aléatoire afin qu'il n'existe pas, modifier un fichier, étape, engager et enfin pousser):
# -*-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)
Problème
Même avec l'astuce pour avoir des droits, quand nous essayons de pousser de coureur gitlab ce message d'erreur suivant est élevé:
Cmd('git') failed due to: exit code(1)
cmdline: git push https://user:[email protected]/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:[email protected]/demo/repo.git''
Ce qui fonctionne
Si j'ouvre une Git Bash, je commandes manuelles exécuté avec succès:
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
Ici, si nous récupérons tous d'ailleurs, nous pouvons voir newBranch avec des modifications de fichier version
Et même si nous courons le contenu du script (sans modification de l'URL) à partir d'une ligne de commande python (en supposant que toutes les importations qui ont été effectuées dans le script):
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)
Conclusion
Je ne peux pas trouver ce que je fais de mal lors de l'exécution du coureur gitlab ce, est-il quelque chose que je suis absent?
La seule chose que je peux voir différents lors de l' exécution de coureur est gitlab ce qui aille chercher après que je vois que je suis sur une tête détachée (liste repo.git.branch('-a').split('\n')
donne par exemple [ « * (HEAD détaché à 560976b) », « BRANCHNAME », « remotes / origine / otherExistingBranch », ...]), mais cela ne devrait pas être un problème puisque je crée une nouvelle branche où pousser, non?
Git dit que vous avez utilisé le mauvais refspec. Lorsque vous avez besoin de pousser dans d' autres à distance , vous devez le faire d' abord gitlab = repo.create_remote("gitlab", gitlabPushURL)
et pousser à comme repo.push("gitlab", branchName)
.
Modifier de @gluttony pour ne pas casser le prochain git courir avec « existe déjà à distance »:
remote_name = "gitlab"
if remote_name not in repo.remotes:
repo.create_remote(remote_name, gitlabPushURL)