web-dev-qa-db-fra.com

Comment publier sur Github Pages à partir de Travis CI?

Nous compilons des documents Doxygen sur le serveur travis-ci et souhaitons les placer dans notre branche gh-pages.

Comment gérer l'autorisation pour git Push? Quelqu'un a-t-il un exemple d'utilisation de variables chiffrées dans travis-ci? Devrais-je choisir une autorisation https ou une clé SSH?

29
Stasik

Exemple pas à pas avec le jeton de l'API HTTPS dans la variable d'environnement

D'autres l'ont mentionné, mais voici une procédure plus détaillée.

  1. Créez un référentiel distinct pour le site Web (facultatif). Cela réduira le risque d'écraser votre référentiel principal et empêchera les fichiers de sortie de le polluer.

  2. Obtenir un jeton d'accès personnel sous https://github.com/settings/tokens

    Activez uniquement l'accès "public_repo" pour les référentiels publics, "repo" pour privé.

    Enregistrez le jeton quelque part car vous ne pouvez le voir qu'une fois.

  3. Dans les paramètres Travis du référentiel https://travis-ci.org/<me>/<myrepo>/settings, créez une variable d’environnement:

    GITHUB_API_KEY=<token>
    

    et assurez-vous de marquer "Afficher la valeur dans le journal de construction" comme "Désactivé".

    Ceci est sûr car seules les pressions autorisées par vous voient de telles variables d'environnement. Ainsi, si un utilisateur malveillant tente de faire une demande d'extraction pour obtenir votre chaîne, la variable ne sera pas là.

    Assurez-vous simplement de ne jamais répertorier vos variables d'environnement sur votre construction!

  4. Ajoutez ce qui suit à votre .travis.yml:

    after_success: |
      if [ -n "$GITHUB_API_KEY" ]; then
        cd "$TRAVIS_BUILD_DIR"
        # This generates a `web` directory containing the website.
        make web
        cd web
        git init
        git checkout -b gh-pages
        git add .
        git -c user.name='travis' -c user.email='travis' commit -m init
        # Make sure to make the output quiet, or else the API token will leak!
        # This works because the API key can replace your password.
        git Push -f -q https://<me>:[email protected]/<me>/<myrepo>-gh-pages gh-pages &>/dev/null
        cd "$TRAVIS_BUILD_DIR"
      fi
    

Méthode de chiffrement alternative travis

Expliqué en détail à: https://stackoverflow.com/a/33109519/895245

Cryptez la chaîne GITHUB_API_KEY=<key> avec la gemme travis et ajoutez-la à votre .travis.yml:

env:
  secure: <encrypted>

Cela présente l’avantage de ne pas nécessiter l’utilisation de l’interface Web de Travis, mais bien d’utiliser un Gem et un peu plus de copier-coller.

Je ne sais pas si c'est récent, mais Travis a maintenant une option de déploiement intégrée, à ajouter à votre fichier travis:

deploy:
  provider: pages
  skip_cleanup: true
  local_dir: myfolder/  # or remove this line to upload from root of repo
  github_token: $GITHUB_TOKEN # Set in travis-ci.org dashboard
  on:
    branch: master

Assurez-vous de ne pas avoir un .gitignore dans le dossier téléchargé; il ne télécharge que des fichiers non ignorés.

Voir le document officiel en ligne de travis: https://docs.travis-ci.com/user/deployment/pages/

Il n'y a pas de problème de clé publique en utilisant l'approche "Paramètres du référentiel", vous générez une clé dans Github puis copiez-la, collez-la dans les champs secrets/non visibles de Travis.

Problème lié à l’historique des téléchargements: Notez que chaque téléchargement écrase toutes les données précédemment téléchargées, sans conserver l’historique. 

  • Vous pouvez maintenant (novembre 2017+) conserver l’historique en ajoutant une ligne keep-history: true

  • Cela peut être souhaitable car ces versions d'instantanés peuvent être volumineuses, et elles sont reproductibles à volonté (branchez simplement votre dépôt de la révision souhaitée). Le fait de pointer vers de tels artefacts signifie généralement la dernière construction réussie d’un instantané. 

  • Cependant, pour déclencher le stockage dans un lieu stable, éditez simplement votre travis pour ajouter le drapeau:
    target_branch: branche vers laquelle pousser force, valeur par défaut pour gh-pages
    E.g target_branch: rc1.2

Et exécutez-le une fois avant de le rétablir en mode instantané.

Une autre alternative qui pourrait être bonne pour les versions (je n'ai pas encore testé personnellement) est de publier sur une balise, voir: https://docs.travis-ci.com/user/deployment/releases/

19
Yann TM

La documentation de travis-ci ici _ recommande de l'ajouter à Push dans un dépôt git:

after_success:
   - chmod 600 .travis/deploy_key.pem # this key should have Push access
   - ssh-add .travis/deploy_key.pem
   - git remote add deploy DEPLOY_REPO_URI_GOES_HERE
   - git Push deploy

Cependant, ceci n'est pas sûr car vous avez stocké votre clé privée non protégée dans le référentiel github.

À la place, vous pouvez ajouter votre clé ssh en tant que variable d'environnement chiffrée } à l'aide de l'outil travis:

travis encrypt DEPLOY_KEY=<private ssh key with write access> --add env.matrix

Il ne vous reste plus qu'à ajouter cette ligne au début de after_success:

cat $DEPLOY_KEY > .travis/deploy_key.pem

Notez que after_success basculera dans chaque construction de la matrice de construction. Ainsi, si vous avez plusieurs tâches par construction, votre code sera poussé plusieurs fois, ce qui ne fera rien, mais il est bon de savoir qu'il se produit.

12
joshua-anderson

Juste pour ajouter une autre solution, j'ai utilisé un jeton HTTPS de github, je l'ai chiffré et utilisé HTTPS pour les extractions et les envois

10
Stasik

Je viens d'écrire un blog à ce sujet il y a quelques jours. Voici le brief:

J'ai écrit un script de déploiement personnalisé à cet effet. La fonctionnalité principale du script ressemble à ceci:

#!/bin/bash

git clone --depth=1 --branch=master "https://github.com/iBug/iBug.github.io.git" deploy
cd deploy
git rm -rf .
cd ..
mv _site/* deploy
cd deploy
git add --all
git config user.name "Travis CI"
git config user.email "[email protected]"
git commit --message "Auto deploy from Travis CI"
git remote add deploy "https://[email protected]/iBug/iBug.github.io.git" &>/dev/null
git Push deploy master &>/dev/null

Maintenant, allez à https://github.com/settings/tokens et générez un jeton. Accordez-lui le privilège public_repo. Accédez aux paramètres du référentiel sur Travis CI et stockez le jeton avec le nom de variable GH_TOKEN.

Ajoutez le script de déploiement à travis:

script: bundle exec jekyll build
after_success:
    - bash .travis/deploy.sh

Poussez ces choses sur GitHub et Travis sera déclenché.


Mon blog est ici . Il est complet et donc redondant s'il est posté ici comme réponse (car les utilisateurs de Stack Overflow sont principalement des développeurs expérimentés). Le script que j'ai posté dans mon blog manque également de fonctionnalité: il ne conserve pas l'historique de validation du site créé, contrairement au script de cette réponse ci-dessus.

0
iBug