So konfigurieren Sie Travis-CI zum Erstellen von Pull-Anforderungen und Zusammenführungen zur Beherrschung ohne Redundanz

76

Um es in "BDD" -Begriffen auszudrücken:

Hintergrund:
Da ich zu einem GH-Repo beitrage

Wenn ich eine Pull-Anfrage erstelle,
sollte Travis das neueste Commit erstellen

Wenn ich auf eine vorhandene Pull-Anfrage
drücke, sollte Travis das neueste Commit erstellen

Wenn ich eine Pull-Anfrage mit Master zusammenführe,
sollte Travis Master erstellen

Ich war verwirrt über Travis-CIs Einstellungen "Build Pushes" und "Build PRs" wie folgt:

  • Wenn Sie beide aktivieren, wird jede Pull-Anforderung zweimal von Travis erstellt
    • einmal für das Commit in diesem Zweig
    • und noch einmal für das Zusammenführungs-Commit dieses Zweigs in sein Ziel
  • Wenn Sie nur "PRs erstellen" aktivieren, werden PRs erstellt, dies führt jedoch nicht zu Builds nach dem Zusammenführen (dh auf dem Master).
  • Das Aktivieren von "Pushs" Brute-Force erfüllt die oben genannten Kriterien, indem alle Pushs zum Repo erstellt werden. Sie können versuchen, Dinge durch Zweige mit weißer und schwarzer Liste zu finanzieren, aber das wird Sie wahrscheinlich beißen, es sei denn, Sie sind streng mit Zweignamen diszipliniert.

Dies wird in den Travis-CI-Dokumenten und in der GH-Ausgabe Nr. 3241 näher erläutert .

Kennt jemand eine Konfiguration, die die oben genannten Kriterien erfüllt?

Brian Gerstle
quelle
Der Branch Build und der PR Build sind unterschiedliche Builds und können unterschiedliche Ergebnisse haben. Der Zweigaufbau ist einfach die Spitze des Zweigs. Der PR-Build ist die Spitze des zum Master zusammengeführten Zweigs. Dies ist effektiv der Fall, wenn Sie den Zweig zu diesem Zeitpunkt zum Master zusammenführen würden. Wenn seit dem Öffnen des Zweigs andere Dinge zum Master zusammengeführt wurden, sodass kein Zusammenführen mit schnellem Vorlauf möglich ist, unterscheidet sich dies vom Aufbau des Zweigs.
Daniel Stevens

Antworten:

107

Ich fand schließlich ein weiteres GH-Problem ( Nr. 2111 ), das mich auf die Idee brachte, sowohl PRs als auch Pushs zu aktivieren, aber mit einer Whitelist, um Pushs auf einen bestimmten Zweig zu beschränken. Dies scheint die Kriterien für meinen Workflow zu erfüllen. Folgendes habe ich getan:

  1. Aktivieren Sie sowohl PRs als auch Branch Pushs in den Travis-Einstellungen für das Repo:

Travis Push / PR-Einstellungen aktiviert

  1. Wechseln Sie .travis.ymlzum White-List- masterZweig (dh nur Build-Pushs zum Master):
Geäst:
  nur: 
    - Meister
  1. Testen Sie es, indem Sie eine PR mit der .travis.ymlÄnderung und eine andere PR mit einigen leeren Commits erstellen , um zu überprüfen, ob es auch für Gabeln funktioniert .

  2. Überprüfen Sie den erfolgreichen Merge Commit Build vom Master .

Build-Ergebnis der Zusammenführung zum Master

Brian Gerstle
quelle
Bestätigung dieser Arbeit. Siehe diese Pull-Anfrage .
Brandon Bradley
4
Funktioniert dies immer noch für PRs mit Untermerkmalen, die auf etwas anderes als zeigen master? Ich glaube, dies beruht auf einer seltsamen Eigenart von Travis 'PR-Build-Env-Vars und würde in diesem Fall nicht funktionieren.
fotinakis
Ich glaube, es sollte so sein, da es so konfiguriert ist, dass alle Pull-Anforderungen (unabhängig vom Basiszweig) erstellt werden, aber nur Pushs für erstellt werden master.
Brian Gerstle
@fotinakis - In GitHub gibt es drei Optionen, die drei verschiedenen Arten von Zusammenführungen entsprechen. Wählen Sie die Option aus, die alle Unterzweige / Features beibehält, um sie in den Push einzubeziehen. Dann müssen Sie möglicherweise an der travis.yml arbeiten, um zu bestimmten Zweigen / Funktionen zu gelangen oder auszuschließen
user2347763
Dies funktioniert nicht für Pull-Anforderungen, die nicht auf den Master abzielen - sie werden einfach nicht erstellt.
Corey Noel
17

Gerade in Travis Docs gefunden

Zu .travis.yml hinzufügen

if: type = push

Alternative:

if: type = pull_request
gröber
quelle
Dies, aber @Corey Noel unten hat eine vollständigere Antwort, die ich für unsere verwendet habe
John Gardner
9

Angenommen, Sie möchten alle PRs erstellen , reicht Folgendes aus. Aktivieren Sie sowohl Zweig- als auch PR-Builds auf der Einstellungsseite und fügen Sie diese Zeile als erste Zeile in Ihre ein travis.yml:

if: (type = push AND branch IN (master, dev)) OR (type = pull_request AND NOT branch =~ /no-ci/)

Dies versucht einen Push-Build für alle Pushs und einen PR-Build für alle Pushs zu einem offenen PR, filtert jedoch alle heraus, die die Bedingung nicht erfüllen. Möglicherweise müssen Sie dies ein wenig ändern - die Klausel, keine Zweige mit no-ci irgendwo in ihrem Namen zu erstellen, ist offensichtlich optional, und Sie haben möglicherweise nicht zwei Zweige, auf denen Sie immer Builds ausführen möchten.

Weitere Informationen zu Bedingungen und bedingten Builds finden Sie auf Travis 'Website.

Corey Noel
quelle
4

Der in der akzeptierten Antwort beschriebene Whitelist-Ansatz weist einige wesentliche Einschränkungen auf. Insbesondere wird der nicht redundante Aufbau beliebiger Zweige ohne PR-Eröffnung nicht unterstützt.

Ich habe ein Problem eröffnet und nach einer besseren Lösung gefragt .

John
quelle
2

Sie können den nächsten Workflow verwenden, wenn Sie nicht nur masterZweige, sondern auch einige andere Zweige testen möchten :

  • Lassen Sie sowohl "Build-Pushs" als auch "Build-Pull-Anforderungen erstellen" aktiviert
  • Fügen Sie branches:exceptIhrem .travis.yml: Direktive hinzu :

    branches:
      except:
        - /^pr\..*/
    

In dieser Konfiguration:

  • Jedes Commit für einen Zweig feature-Alöst den Build aus
  • Ein Commit für einen Zweig pr.feature-Alöst den Build nicht aus
  • Wenn der Zweig pr.feature-Ain der geöffneten Pull-Anforderung verwendet wird, wird der Build ausgelöst

Workflow-Beispiel

  • Temporärer WIP-Zweig, der von mehreren Entwicklern gemeinsam genutzt wird: wip.feature-AJedes Festschreiben für diesen Zweig löst den Build aus
  • Wenn der Zweig zum Zusammenführen bereit ist, können masterSie ihn von wip.feature-Anach umbenennen pr.feature-Aund die Pull-Anforderung öffnen
  • Wenn Sie beim Überprüfen der Pull-Anforderung neue Korrekturen anwenden möchten, drücken Sie einfach auf pr.feature-A

Bei allen oben genannten Schritten wird nur ein Build ausgelöst.


quelle
0

Für eines der Repositories, mit denen ich gearbeitet habe, wollte ich Folgendes:

Es gibt ein originRepo, das das Haupt-Repo ist, das alle Veröffentlichungen macht.

Ich wollte, dass alle Pull-Anfragen, die zum masterUrsprungszweig kommen, nur einmal mit Travis erstellt werden, unabhängig davon, dass sie von einem gegabelten Repo oder einem anderen Zweig des Ursprungs stammen origin.

In diesem Fall funktioniert dies wie ein Zauber

if: (type == push) OR (type == pull_request AND fork == true)

sarthakgupta072
quelle