web-dev-qa-db-de.com

Wie kann ich von Travis CI aus auf Github Pages veröffentlichen?

Wir kompilieren Doxygen-Dokumente auf dem travis-ci-Server und möchten sie auf unseren gh-pages-Zweig übertragen.

Wie gehe ich mit der Autorisierung für git Push um? Hat jemand ein Beispiel für die Verwendung von verschlüsselten Variablen in Travis-Ci? Soll ich eine https-Autorisierung oder einen SSH-Schlüssel beantragen?

29
Stasik

Schrittweises Beispiel mit dem HTTPS-API-Token in der Umgebungsvariablen

Andere haben es erwähnt, aber hier wird ein detaillierteres Verfahren beschrieben.

  1. Erstellen Sie ein separates Repository für die Website (optional). Dies verringert die Wahrscheinlichkeit, dass Sie Ihr Haupt-Repository überschreiben, und verhindert, dass Ausgabedateien es verschmutzen.

  2. Holen Sie sich ein persönliches Zugangs-Token unter https://github.com/settings/tokens

    Aktivieren Sie "public_repo" nur für öffentliche Repositorys, "repo" für private.

    Speichern Sie das Token irgendwo, da Sie es nur einmal sehen können.

  3. Erstellen Sie in den Travis-Einstellungen für das Repository https://travis-ci.org/<me>/<myrepo>/settings eine Umgebungsvariable:

    GITHUB_API_KEY=<token>
    

    stellen Sie sicher, dass "Wert im Build-Protokoll anzeigen" als "Aus" markiert ist.

    Dies ist sicher, da nur autorisierte Pushs von Ihnen solche Umgebungsvariablen sehen. Wenn also ein böswilliger Benutzer versucht, eine Pull-Anfrage zu machen, um Ihre Zeichenfolge abzurufen, ist die Variable nicht vorhanden.

    Stellen Sie einfach sicher, dass Sie niemals Ihre Umgebungsvariablen in Ihrem Build auflisten!

  4. Fügen Sie Ihrem .travis.yml Folgendes hinzu:

    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
    

Alternative travis-Verschlüsselungsmethode

Ausführlich erklärt unter: https://stackoverflow.com/a/33109519/895245

Verschlüsseln Sie den String GITHUB_API_KEY=<key> mit der travis gem und fügen Sie ihn Ihrem .travis.yml hinzu:

env:
  secure: <encrypted>

Dies hat den Vorteil, dass es nicht erforderlich ist, die Travis-Weboberfläche zu verwenden, sondern einen Gem und einige weitere Einfügungen von Kopien.

Ich weiß nicht, wie aktuell es ist, aber Travis verfügt jetzt über eine integrierte Implementierungsoption, die Ihrer Travis-Datei im Wesentlichen hinzugefügt wird:

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

Stellen Sie sicher, dass sich im hochgeladenen Ordner kein .gitignore befindet. Es lädt nur nicht ignorierte Dateien hoch.

Siehe das offizielle Online-Dokument von travis: https://docs.travis-ci.com/user/deployment/pages/

Bei der Verwendung von "Repository-Einstellungen" gibt es kein Problem mit dem öffentlichen Schlüssel. Sie generieren einen Schlüssel in Github und kopieren ihn dann in geheime/nicht sichtbare Felder von Travis.

Fehler beim Upload-Verlauf: Beachten Sie, dass jeder Upload alle zuvor hochgeladenen Daten unterdrückt, ohne dass der Verlauf erhalten bleibt. 

  • Sie können jetzt (November 2017+) den Verlauf beibehalten, indem Sie eine keep-history: true-Zeile hinzufügen

  • Dies kann wünschenswert sein, da diese Snapshot-Builds sehr umfangreich sein können und ohnehin reproduzierbar sind (verzweigen Sie einfach Ihr Depot von der gewünschten Revision). Wenn Sie auf solche Artefakte zeigen, wird in der Regel auf den letzten erfolgreichen Aufbau eines Schnappschusses verwiesen. 

  • Um jedoch Speicherplatz an einem stabilen Ort auszulösen, bearbeiten Sie einfach Ihr Travis, um ein Flag hinzuzufügen:
    target_branch: Branch to Push force to, standardmäßig gh-pages
    E.g target_branch: rc1.2

Führen Sie es einmal aus, bevor Sie den Schnappschussmodus aktivieren.

Eine andere Alternative, die für Veröffentlichungen hilfreich sein könnte (ich habe sie jedoch nicht persönlich getestet), ist die Veröffentlichung auf einem Tag. Siehe: https://docs.travis-ci.com/user/deployment/releases/

19
Yann TM

Die travis-ci-Dokumentation hier empfiehlt, dies zu einem git-Repo zu Push hinzuzufügen:

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

das ist unsicher , da Sie Ihren ungeschützten privaten Schlüssel im github-Repository speichern.

Stattdessen können Sie Ihren ssh-Schlüssel als verschlüsselte Umgebungsvariable hinzufügen, indem Sie das travis-Tool verwenden:

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

Jetzt müssen Sie nur noch diese Zeile am Anfang von after_success einfügen:

cat $DEPLOY_KEY > .travis/deploy_key.pem

Bitte beachten Sie, dass after_success in jedem Build in der Build-Matrix umschaltet. Wenn Sie also mehrere Jobs pro Build haben, wird Ihr Code mehrmals gepusht, was zwar nichts bewirkt, aber gut zu wissen ist, dass er ausgeführt wird.

12
joshua-anderson

Um eine weitere Lösung hinzuzufügen, habe ich ein HTTPS-Token von github verwendet, verschlüsselt und HTTPS für das Checkout und Push-Verfahren verwendet

10
Stasik

Ich habe vor einigen Tagen gerade einen Blog darüber geschrieben. Hier ist der Brief:

Ich habe ein benutzerdefiniertes Implementierungsskript für diesen Zweck geschrieben. Die Kernfunktionalität des Skripts sieht folgendermaßen aus:

#!/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

Gehen Sie jetzt zu https://github.com/settings/tokens und generieren Sie ein Token. Gewähren Sie ihm das public_repo-Privileg. Gehen Sie zu den Repository-Einstellungen in Travis CI und speichern Sie das Token mit dem Variablennamen GH_TOKEN.

Fügen Sie das Implementierungsskript zu Travis hinzu:

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

Drücke diese Sachen auf GitHub und Travis wird ausgelöst.


Mein Blog ist hier . Es ist umfangreich und daher redundant, wenn es hier als Antwort angezeigt wird (da Stack Overflow-Benutzer meist erfahrene Entwickler sind). Dem Skript, das ich in meinem Blog gepostet habe, fehlt außerdem eine Funktionalität: Es behält den Commit-Verlauf der erstellten Site nicht bei, während das Skript in dieser Antwort oben funktioniert.

0
iBug