Hallo, vor 10 Monaten habe ich hier gefragt "Komplexe Jenkins Konfiguration - will man das?" [1] Aktuell verwende ich noch Jenkins für closed-source Dinge und für open-source nehme ich travis von github. Für die closed-source Dinge suche ich eine Alternative. Hier wäre gitlab-CI vermutlich eine passend. Das hat den Vorteil, das man keinen Jenkins per Web-GUI konfigurieren muss. Das ganze funktioniert per yaml-Datei aus dem Git-Repo. Hat jemand damit schon etwas Erfahrung? Bis jetzt setzen wir noch Kallithea anstatt Gitlab ein. Gruß, Thomas PS: Ja, das ist off-topic und entsprechend ist das Subjekt gekennzeichnet. [1] https://groups.google.com/forum/#!topic/de.comp.lang.python/0Ook6HNPfdY -- http://www.thomas-guettler.de/
Am 19.03.2017 um 16:39 schrieb Christopher Arndt:
Am 19.03.2017 um 15:15 schrieb Thomas Güttler <guettliml@thomas-guettler.de>:
Hier wäre gitlab-CI vermutlich eine passend. [...]
Hat jemand damit schon etwas Erfahrung?
Ja. Funktioniert gut.
Was willst du sonst wissen? :)
Ich wollte Feedback von jemandem, der damit praktische Erfahrung hat. Du hast eigentlich alles gesagt was ich hören wollte. Wenn du willst kannst du auch noch etwas aus dem Nähkästchen plaudern :-) Danke! Thomas -- Thomas Guettler http://www.thomas-guettler.de/
Am 21.03.2017 um 14:26 schrieb Thomas Güttler <guettliml@thomas-guettler.de>: Wenn du willst kannst du auch noch etwas aus dem Nähkästchen plaudern :-) Wir setzten sowohl Jenkins als auch Gitlab und dessen CI ein. Letzteres für neuere Projekte, bei denen wir die Tests schon auf tox umgestellt haben (alle Tests benutzen pytest). Die Tests über die Gitlab CI laufen in Docker-Images. Je nach tag in der .gitlab-ci.yml (oder so ähnlich) wird ein anderer Gitlab-Runner mit einem anderen Docker-Image verwendet. Um ein Projekt für die Gitlab CI zu konfigurieren, müssen wir eigentlich also nur dafür sorgen, dass die Tests unter tox laufen und eine .xml Datei zum Repo hinzufügen. Da tox sich alle Python-Dependencies aus unserem eigenen devpi-Server holt, haben wir (sinngemäß) folgende Einträge in der tox.ini: [tox] envlist = py27, py34, py35, py36 indexserver = default = {env:PIP_INDEX_URL:https://pypi.python.org/simple} ... [testenv] setenv = PYTHONPATH = {toxinidir}:{toxinidir}/mypackage deps = -r{toxinidir}/requirements/dev.txt commands = py.test -v --basetemp={envtmpdir} {toxinidir}/tests (Sorry für die Formatierung, das iOS-Mailprogramm ist buggy und lässt mich das nicht korrigieren.) Damit können wir den verwendeten Paketindex durch Setzen der Environment-Variable PIP_INDEX_URL je nach Build anpassen. Zum Beispiel wollen wir für die Builds des development-Branches einen anderen Paketindex verwenden, als für Builds des master-Branches. So müssen wir keine Alpha/Pre-Release-Pakete auf den Paketindex hochladen, der für den Code in Produktion im master-Branch da ist. -- Christopher Arndt <info@chrisarndt.de>
Am 22.03.2017 um 09:29 schrieb Christopher Arndt:
Am 21.03.2017 um 14:26 schrieb Thomas Güttler <guettliml@thomas-guettler.de>: Wenn du willst kannst du auch noch etwas aus dem Nähkästchen plaudern :-) Wir setzten sowohl Jenkins als auch Gitlab und dessen CI ein. Letzteres für neuere Projekte, bei denen wir die Tests schon auf tox umgestellt haben (alle Tests benutzen pytest).
Die Tests über die Gitlab CI laufen in Docker-Images. Je nach tag in der .gitlab-ci.yml (oder so ähnlich) wird ein anderer Gitlab-Runner mit einem anderen Docker-Image verwendet. Um ein Projekt für die Gitlab CI zu konfigurieren, müssen wir eigentlich also nur dafür sorgen, dass die Tests unter tox laufen und eine .xml Datei zum Repo hinzufügen.
Da tox sich alle Python-Dependencies aus unserem eigenen devpi-Server holt, haben wir (sinngemäß) folgende Einträge in der tox.ini:
[tox] envlist = py27, py34, py35, py36 indexserver = default = {env:PIP_INDEX_URL:https://pypi.python.org/simple} ...
[testenv] setenv =
PYTHONPATH = {toxinidir}:{toxinidir}/mypackage
deps = -r{toxinidir}/requirements/dev.txt
commands = py.test -v --basetemp={envtmpdir} {toxinidir}/tests
(Sorry für die Formatierung, das iOS-Mailprogramm ist buggy und lässt mich das nicht korrigieren.)
Ist lesbar - passt schon.
Damit können wir den verwendeten Paketindex durch Setzen der Environment-Variable PIP_INDEX_URL je nach Build anpassen. Zum Beispiel wollen wir für die Builds des development-Branches einen anderen Paketindex verwenden, als für Builds des master-Branches. So müssen wir keine Alpha/Pre-Release-Pakete auf den Paketindex hochladen, der für den Code in Produktion im master-Branch da ist.
Per PIP_INDEX_URL habt für verschiedene pypi-Server, und einen anderen Paket-Stand. OK, interessant. Macht das nicht viel Aufwand diese verschiedenen pypi-Server mit den passenden Paketen zu versorgen? Eine Frage zu "-r{toxinidir}/requirements/dev.txt": Sind die Paketversionen in dieser Datei gepinnt (also mit exakter Version zB ==a.b.c)? Falls ja, wie wird diese Datei aktualisiert? Gruß, Thomas -- Thomas Guettler http://www.thomas-guettler.de/
Am 22.03.2017 um 17:44 schrieb Thomas Güttler <guettliml@thomas-guettler.de>:
Per PIP_INDEX_URL habt für verschiedene pypi-Server, und einen anderen Paket-Stand. OK, interessant.
Macht das nicht viel Aufwand diese verschiedenen pypi-Server mit den passenden Paketen zu versorgen?
Mit Devpi kann man auf einem Server verschiedene Paketindexe haben, die von einander ableiten. Wir haben eine Paketindex für die Pakete der Produktionsumgebung (der auch aus der DMZ erreichbar ist) und einen Paketindex für die Development/Integration/Staging-Umgebung, der nur im lokalen Netz erreichbar ist. Der Dev-Index leitet vom Prod-Index ab, d.h. Er ist sozusagen ein Proxy: wenn Pakete nicht im Dev-Index sind, werden sie vom Prod-Index geholt. Aber man kann auf den Dev-Index neuere Paketversionen hochladen, die im Prod-Index nicht sichtbar sind. Außerdem können auf dem Dev-Index Paketversionen und deren Files überschrieben werden, während auf dem Prod-Index bei jeder Änderung eine neue Paketversion hochgeladen werden muss, er ist also nicht-volatil (Stichwort: Rollback). In der Praxis wird also einfach eine neue Version eines Paktes zuerst auf den Dev-Index hochgeladen und - wenn alles funktioniert - mit einem Befehl auf den Prod-Index gepusht. Zusätzlich kann jeder Entwickler noch einen eigenen Paketindex haben, aber das nur nebenbei.
Eine Frage zu "-r{toxinidir}/requirements/dev.txt": Sind die Paketversionen in dieser Datei gepinnt (also mit exakter Version zB ==a.b.c)?
In einer idealen Welt: ja ;) In der Praxis sind wir leider erst dabei, das in allen Projekten Schritt für Schritt wirklich streng durchzusetzen. Momentan haben wir leider in vielen Projekten noch nur Versionsbeschränkungen (>=a.b,<c.d) in den Requirements-Dateien.
Falls ja, wie wird diese Datei aktualisiert?
Ich bin gerade dabei in unserem größten Projekt die Erzeugung der Requirements-Dateien aus Vorlagen mit pip-compile (pip-tools) einzuführen. Allein durch diesen Prozess sind schon etliche Dependency-Konflikte aufgefallen, die vorher unbemerkt blieben. Insbesondere in die Requirements fürs Development (Tests, Doc-Erzeugung usw.) schleichen sich schnell Dependencies ein, die wiederum andere Dependencies nach sich ziehen, die mit den Paketversionen, die für Produktionsumgebung gepinnt sind, im Konflikt stehen. Es muss sich noch zeigen, ob der Weg mit pip-tools praktikabel ist, leider gibt es immer noch zu viele Pakete, die in ihrer setup.py irgendwelche Dependencies fest auf eine Version pinnen, obwohl dies eigentlich gar nicht nötig wäre, oder gar einfach ihre requirements.txt unverändert in die install_requires in der setup.py übernehmen. Die meisten Paketautoren sind sich wahrscheinlich gar nicht bewusst, dass sie damit bei Anwendungen, die ihre Pakete und noch andere Dependencies verwenden, die dies genauso machen, Versions-Konflikte heraufbeschwören. Aber wenn man einmal eine Vorlage für die Requirements hat, aus der sich eine funktionierende Requirements-Datei erstellen lässt, kann man diese mit pip-compile leicht aktualisieren und merkt dann sofort, wenn eine neue Version eines Pakets Versionskonflikte mit einer anderen Dependency mit sich bringt. -- Christopher Arndt <info@chrisarndt.de>
Am 19.03.2017 um 15:15 schrieb Thomas Güttler:
Hat jemand damit schon etwas Erfahrung? Bis jetzt setzen wir noch Kallithea anstatt Gitlab ein.
Ich setze das seit einigen Wochen für mein Open-Source-Projekt pdfposter ein, siehe <https://gitlab.com/pdftools/pdfposter/blob/develop/.gitlab-ci.yml>. Es war etwas schwierig zu verstehen, was man eigentlich machen muss. Man muss unter Settings -> CI/CD Pipelines eintweder einen eigenen "Runner" aufsetzen, oder die vorgefertigten "Shared Runner" nehmen. (Evtl. noch einen Security-Token generieren und einsetzen, daran erinnere ich mich nicht mehr). Mehr ist es nicht, aber knackig-kurz beschreiben habe ich es nirgends gefunden. -- Schönen Gruß Hartmut Goebel Dipl.-Informatiker (univ), CISSP, CSSLP, ISO 27001 Lead Implementer Information Security Management, Security Governance, Secure Software Development Goebel Consult, Landshut http://www.goebel-consult.de Blog: http://www.goebel-consult.de/blog/k-9-mail-statt-apps-der-mailprovider Kolumne: http://www.cissp-gefluester.de/2011-11-in-troja-nichts-neues
On Sun, 19 Mar 2017 15:15:00 +0100 Thomas Güttler <guettliml@thomas-guettler.de> wrote:
Hallo,
vor 10 Monaten habe ich hier gefragt "Komplexe Jenkins Konfiguration - will man das?" [1]
Aktuell verwende ich noch Jenkins für closed-source Dinge und für open-source nehme ich travis von github.
Für die closed-source Dinge suche ich eine Alternative.
Hier wäre gitlab-CI vermutlich eine passend. Das hat den Vorteil, das man keinen Jenkins per Web-GUI konfigurieren muss. Das ganze funktioniert per yaml-Datei aus dem Git-Repo.
Hat jemand damit schon etwas Erfahrung? Bis jetzt setzen wir noch Kallithea anstatt Gitlab ein.
Tja, ich kann da nur meine Antwort von vor 10 Monaten wiederholen: Nimm gitlab-CI. Damit geht alles, was Du mit jenkins auch machst. Und alles was Dein Job machen soll steht versioniert im Projekt mit drinne statt irgendwo sonst. Und für gitlab-CI gibt es die ziemlich gute Online-Hilfe (die in der gitlab-Instanz dabei ist, also so Online wie Dein gitlab-CI, nicht stackoverflow-muss-erreichbar-sein-online), die die Inhalte der gitlab-ci.yml erklärt. Während man bei jenkins mit den Infos und Erklärungen nur bedingt weiterkommt, wenn man den Job reproduzierbar per xml definieren will. - Arnold
Am 22.03.2017 um 22:17 schrieb Arnold Krille:
On Sun, 19 Mar 2017 15:15:00 +0100 Thomas Güttler <guettliml@thomas-guettler.de> wrote:
Hallo,
vor 10 Monaten habe ich hier gefragt "Komplexe Jenkins Konfiguration - will man das?" [1]
Aktuell verwende ich noch Jenkins für closed-source Dinge und für open-source nehme ich travis von github.
Für die closed-source Dinge suche ich eine Alternative.
Hier wäre gitlab-CI vermutlich eine passend. Das hat den Vorteil, das man keinen Jenkins per Web-GUI konfigurieren muss. Das ganze funktioniert per yaml-Datei aus dem Git-Repo.
Hat jemand damit schon etwas Erfahrung? Bis jetzt setzen wir noch Kallithea anstatt Gitlab ein.
Tja, ich kann da nur meine Antwort von vor 10 Monaten wiederholen: Nimm gitlab-CI. Damit geht alles, was Du mit jenkins auch machst. Und alles was Dein Job machen soll steht versioniert im Projekt mit drinne statt irgendwo sonst. Und für gitlab-CI gibt es die ziemlich gute Online-Hilfe (die in der gitlab-Instanz dabei ist, also so Online wie Dein gitlab-CI, nicht stackoverflow-muss-erreichbar-sein-online), die die Inhalte der gitlab-ci.yml erklärt. Während man bei jenkins mit den Infos und Erklärungen nur bedingt weiterkommt, wenn man den Job reproduzierbar per xml definieren will.
Ja, gitlab-ci werden wir in der Zukunft nehmen. Mir gefällt Konfig per Datei auch besser als Konfig per web-GUI :-) Gruß, Thomas -- Thomas Guettler http://www.thomas-guettler.de/
participants (4)
-
Arnold Krille
-
Christopher Arndt
-
Hartmut Goebel
-
Thomas Güttler