web-dev-qa-db-fra.com

Poussez les fichiers vers gitlab-ci via CI runner

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 ?

15
Venkat

J'ai résolu ce problème en procédant comme suit:

  1. Générez un nouveau jeton d'accès gitlab avec une portée api: User Settings > Access Tokens
  2. Ajoutez une variable CI protégée dans les paramètres de votre projet avec le nouveau jeton: 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
15
jmuhire

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.

8
Venkat

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
2
Przemek Nowak

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.

1
Fairy