2017-02-04 13 views
13

Ich baue Websites mit Jekyll, die ERB, SASS, & c kompiliert. in einfaches HTML & CSS.Erstellen Sie für jedes Commit ein entsprechendes kompiliertes Commit in einem separaten Repo oder Zweig

Nach den meisten Commits möchte ich die Site kompilieren und die kompilierte Version in einem separaten Repository oder einer separaten Verzweigung festschreiben, damit sie auf einen statischen Server übertragen werden kann.

Was ist der beste Weg, um darüber zu gehen?

Ich habe bereits a solution, aber ich hatte gehofft, jemand könnte einen eleganteren haben.

Antwort

1

Initialisieren eines Repo-Git in _site/, dann fügen Sie ein Git post-commit Haken, .git/hooks/post-commit:

echo -n "Add commit to compiled version? (y/N) " 
read answer < /dev/tty 
if [ "$answer" != "y" ]; then exit; fi 

message=$(git log -1 --pretty=%B) 

git stash --all 
bundle exec jekyll build 

cd _site 
    git add --all 
    git commit -m "$message" 
cd .. 

git stash pop 

Nun, jedes Mal begehen, werden Sie gefragt, ob Sie die eine verpflichten hinzufügen möchten kompilierte Version.

5

Nach den meisten Commits möchte ich die Site kompilieren und die kompilierte Version in einem separaten Repository oder einer separaten Verzweigung festschreiben, damit sie auf einen statischen Server übertragen werden kann.

Das richtige Keyword für Sie ist "Continuous Integration".

Sie können eine CI-Software wie Jenkins verwenden, um Ihr System nach jedem Commit zu erstellen, nachdem Sie eine Pull-Anforderung erstellt oder geändert haben oder nur nachts.

Das Build-Skript, das Sie in der CI-Software konfigurieren, ist dann dafür verantwortlich, die Build-Artefakte, in diesem Fall Ihre kompilierte Version, wie ein S3-Bucket auf Ihr Zielsystem zu verteilen. Sie können auch ein programmatisches Commit Ihrer Artefakte zu einem anderen Git Repo machen.

Werfen Sie einen Blick hier: https://jenkins.io/doc/

+0

Vielen Dank für Ihre Antwort. Ich befürchte, dass das für die Situation übertrieben sein könnte, und ich hoffe, dass ich einen einfachen Weg finde, es mit Git zu machen, also werde ich die Frage vorerst offen lassen. – Zaz

2

Ihre Lösung würde und „Lieferung verpflichtet“ (die _site kompilierte Version), die die beste Praxis nicht „Quelle verpflichtet“ im gleichen Repo mischen (und erhöht sich die Größe des Git-Repo unnötig)

ich einen separaten Repo „site“ schaffen würde, die ich als submodule zu Ihrem aktuellen Repo, in einem Pfad _site/ genannt hinzufügen würde.

cd /path/to/current/repo 
git rm -R _site 
git submodule add -- /url/repo/site _site 

Auf diese Weise jedes Mal, wenn Sie Ihre Lieferung mit Bündel exec jekyll Build bauen, wird es in einem separaten Repo (in _site) durchgeführt, wo Sie hinzufügen können, begehen, und drücken Sie sogar direkt an, wo Sie wollen Probier es aus.
Dann gehen Sie zurück zu Ihrem Hauptrepo, wo Sie die gitlink (special entry in the index) hinzufügen und festsetzen, eine starke Verbindung zwischen der genauen Version der Quelle und der genauen Version der Lieferung (der gebauten Website) herstellen.

+0

Ah, ich habe vergessen, in meiner Lösung zu erwähnen, dass ich 'git init _site /' verwendet habe, also gingen die Commits eigentlich in ein separates Repository. Es scheint mir, dass, wenn überhaupt, die * source * das Submodul sein sollte. – Zaz

+0

@Zaz Genau: mit nur 'git init' würde es nicht ein Submodul machen, nur ein verschachtelter Git Repo, was schlecht ist, wie ich es in http://stackoverflow.com/a/41968295/6309 beschrieben habe. – VonC

+0

Ich habe '_site /' in '.gitignore', kann ich mich irgendwie in den Fuß mit dieser Einstellung schießen? – Zaz

2

Wie Sie angefordert

empfehle ich Ihnen nicht den gleichen Repo verwenden kompilierten Code zu speichern.Weil es aus jedem Zustand des Quellcodes erhalten werden kann, und es wird eine unnötige Vervielfältigung von Informationen sein.

Also, in diesem Fall möchten Sie Git als CI-Tool verwenden. Sie sollten ein anderes Repo für die kompilierte Site erstellen und jedes Mal, wenn Sie es benötigen, ein Commit durchführen.

Ich empfehle Ihnen, Zweig für "Produktion" Status des Codes zu wählen. Und wenn Sie sich in diesem Zweig engagieren, sollte der Code neu erstellt werden. Nennen wir es "Produktion".

  1. Machen Sie separate Git Repo für builded Code.
  2. Setzen Sie diesen Code zu post-commit Hook in Ihrem SRC Repo. Es verarbeitet alle Commits im Produktionszweig, checkt den Code in ein temporäres Verzeichnis, erstellt Build und schreibt die Änderungen fest.
srcDir='../srcWorkTree' 
buildedRepo='../buildedRepo' 

if [ `git rev-parse --abbrev-ref HEAD` == "production" ]; then 
    echo "making builded code commit..." 
    mkdir -p $srcDir 
    # http://stackoverflow.com/questions/4479960/git-checkout-to-a-specific-folder 
    git checkout-index -a -f --prefix=$srcDir/ 

    bundle exec jekyll build --source $srcDir --destination $buildedRepo 

    cd $buildedRepo 
    git add -A 
    commitInfo=$(git log -1 --pretty="%h %B") 
    git commit -m "autobuild for $commitInfo" 
    # git push 
fi 

Eine andere Variante

Wie nehme ich an, haben Sie Zugriff auf Ihre Produktionsserver. Zumindest erwähnen Sie, dass Sie dort git Repo haben. Es wird also sinnvoll sein, einen Post-Receive-Hook zu erstellen, um den Code im Zielverzeichnis zu erstellen. Es wird klarer und einfacher sein als auf der lokalen Maschine, wie ich es beschrieben habe.

Ich nehme an, dass dieser Repo "bare" ist, weil Sie keine Möglichkeit haben sollten, Änderungen auf dem Server vorzunehmen.

Post erhalten Haken:

#!/bin/sh 

siteDir='/var/www/site' 
tmpSrcDir='/var/www/site' 

echo "**** [builder's post-receive hook]" 

while read oldrev newrev refname 
do 
    if [ $refname = refs/heads/production ] 
    then 
     GIT_WORK_TREE=$tmpSrcDir git checkout --detach $newrev 

     bundle exec jekyll build --source $tmpSrcDir --destination $siteDir 
    fi 
done 

exit 0 

Und einige Bemerkungen

Ich sehe, tryed Sie Submodul zu benutzen, um Ihre builded Website zu speichern. Ich empfehle das nicht. Es hat keinen Sinn, denn Ihr Quellcode hängt nicht vom Code ab.

2

Ich werde nur eine andere Option vorschlagen: Speichern Sie die kompilierten Versionen nicht in Git, speichern Sie sie woanders.

Um Ihnen unseren Workflow als Beispiel:

  • , wenn wir eine bestimmte verpflichten zu testen, müssen wir es durch unsere CI-Prozess ausgeführt, die eine tar.gz-Archiv erzeugt, und wir nutzen unsere deploy Tool zum Testen auf einem Staging-Server; Wenn wir ein Commit für eine Release-Version auswählen, markieren wir dieses Commit in git, wir führen es durch den CI-Prozess, das .tar.gz wird mit der Versionsnummer markiert und in einem Verzeichnis der Version releases/ in unserer Implementierung gespeichert Server.

Wir haben eine Sicherung unserer releases/ Ordner, aber sollten wir es verlieren, könnten wir wieder aufbauen auch einen bestimmten Build von der Quelle (basierend auf dem Tag).

Verwandte Themen