J'utilise gitlab CI runner pour tester mon code et générer des fichiers. Je veux juste pousser les fichiers générés vers le référentiel gitlab via CI runner. Y'a-t'il un quelconque moyen d'y arriver ?
J'ai résolu ce problème en procédant comme suit:
User Settings > Access Tokens
Your project > Settings > Secret variable
-> edit: Si vous voulez git Push vers une branche non protégée ne définissez pas la variable runner comme protégée
Ensuite, vous pouvez utiliser ce jeton au lieu de celui par défaut dans votre script gitlab-ci. par exemple :
before_script:
- git remote set-url Origin https://USERNAME:${CI_Push_TOKEN}@gitlab.com/your-project.git
- git config --global user.email '[email protected]'
- git config --global user.name 'yourname'
...
- git checkout -B branch
- change files
- git commit -m '[skip ci] commit from CI runner'
- git Push --follow-tags Origin branch
Généré une clé SSH dans gitlab
-> Paramètres de profil -> Clés SSH -> Générez-le
Après avoir généré le magasin de clés SSH qui dans le gitlab variables nommé SSH
-> Paramètres du projet -> Variables -> Ajouter une variable
Dans le .gitlab-ci.yml, ajoutez les lignes ci-dessous.
before_script:
- mkdir -p ~/.ssh
- echo "$SSH" | tr -d '\r' > ~/.ssh/id_rsa
- chmod 600 ~/.ssh/id_rsa
- ssh-keyscan -H 'Git_Domain' >> ~/.ssh/known_hosts
Après cela, a poussé les fichiers vers le référentiel en utilisant ce code js ci-dessous.
var child_process = require("child_process");
child_process.execSync("git checkout -B 'Your_Branch'");
child_process.execSync("git remote set-url Origin Your_Repository_Git_Url");
child_process.execSync("git config --global user.email 'Your_Email_ID'");
child_process.execSync("git config --global user.name 'Your_User_Name'");
for (var i=0;i<filesToBeAdded.length;i++) {
child_process.execSync("git add "+filesToBeAdded[i]);
}
var ciLog = child_process.execSync("git commit -m '[skip ci]Automated commit for CI'");
var pushLog = child_process.execSync("git Push Origin Your_Branch");
[skip ci] est le plus important dans le message de validation. Sinon, il démarrera une boucle infinie de processus CI.
Vous pouvez bien sûr utiliser des clés SSH mais vous pouvez également fournir un utilisateur et un mot de passe (utilisateur avec accès en écriture) comme variables secrètes et les utiliser.
Exemple:
before_script:
- git remote set-url Origin https://$GIT_CI_USER:[email protected]/$CI_PROJECT_PATH.git
- git config --global user.email '[email protected]'
- git config --global user.name 'MyUser'
Vous devez définir GIT_CI_USER
et GIT_CI_PASS
en tant que variables secrètes (vous pouvez toujours créer un utilisateur dédié à cet effet).
Avec cette configuration, vous pouvez normalement travailler avec git. J'utilise cette approche pour pousser les balises après la sortie (avec Axion Release Gradle Pluing - http://axion-release-plugin.readthedocs.io/en/latest/index.html )
Exemple de tâche de libération:
release:
stage: release
script:
- git branch
- gradle release -Prelease.disableChecks -Prelease.pushTagsOnly
- git Push --tags
only:
- master
La fonctionnalité que vous recherchez s'appelle Artefacts. Les artefacts sont des fichiers qui sont attachés à une génération lorsqu'ils réussissent.
Pour activer un artefact, mettez-le dans votre .gitlab-ci.yml:
artifacts:
paths:
- dir/
- singlefile
Cela va télécharger le répertoire dir
et le fichier singlefile
dans GitLab.