web-dev-qa-db-ja.com

Travis-CIを構成してプル要求を作成し、冗長性なしのマスターにマージする方法

「BDD」の用語で表すには:

バックグラウンド:
与えられたGHレポに貢献しています

プルリクエストを作成するとき
その後、Travisは最新のコミットをビルドする必要があります

既存のプルリクエストにプッシュするとき
その後、Travisは最新のコミットをビルドする必要があります

プルリクエストをマスターにマージするとき
その後、トラビスはマスターを構築する必要があります

次のように、Travis-CIの「ビルドプッシュ」および「ビルドPR」設定に混乱しました。

  • 両方を有効にすると、Travis によって各プルリクエストが2回作成されます。
    • そのブランチでのコミットのために一度
    • もう一度、そのブランチを宛先にマージコミットするために
  • 「ビルドPR」のみを有効にすると、PRがビルドされますが、マージ後のビルド(つまり、マスター上)にはなりません。
  • 「プッシュ」ブルートフォースを有効にすると、レポジトリへのallプッシュを構築することにより、上記の基準を満たします。ホワイトリストとブラックリストのブランチで物事を細かくしようとすることができますが、ブランチ名で厳密に訓練されていない限り、それはおそらくあなたに噛み付くでしょう。

これは Travis-CI docs および GH issue#3241 でさらに説明されています。

上記の基準を満たす構成を知っている人はいますか?

57
Brian Gerstle

最終的に別のGH問題( #2111 )を見つけました。これにより、PRとプッシュの両方を有効にしようとするアイデアが得られましたが、特定のブランチへのプッシュを制限するホワイトリストがありました。これは私のワークフローの基準を満たしているようです。私がやったことは次のとおりです。

  1. レポジトリのTravis設定でPRとブランチプッシュの両方を有効にします。

travis Push/pr settings enabled

  1. 変化する .travis.ymlから ホワイトリストmasterブランチ (つまり、マスターへのビルドプッシュのみ):
ブランチ:
のみ:
-マスター
  1. PR .travis.yml change 、およびそれを確認するための空のコミットを含む別のPR forkでも機能します

  2. 確認 マスターからのマージコミットビルドの成功

build result of merge to master

94
Brian Gerstle

travis docs にあります

.travis.ymlに追加

if: type = Push

代わりに:

if: type = pull_request
10
grosser

受け入れられた回答で説明されているホワイトリストアプローチには、いくつかの重要な制限があります。特に、PRを開かずに任意のブランチを非冗長に構築することはサポートしていません。

より良い解決策を求める問題 を開きました。

3
John

masterブランチだけでなく、他のいくつかのブランチもテストする場合は、次のワークフローを使用できます。

  • [プッシュをビルド]と[プルリクエストをビルド]の両方をオンのままにします
  • branches:exceptディレクティブを.travis.ymlに追加します。

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

この構成では:

  • ブランチfeature-Aへのコミットはビルドをトリガーします
  • ブランチpr.feature-Aへのコミットはビルドをトリガーしません
  • ブランチpr.feature-Aが開かれたプルリクエストで使用されている場合、ビルドがトリガーされます

ワークフローの例

  • 複数の開発者間で共有される一時的なWIPブランチ:wip.feature-A、このブランチへのコミットはビルドをトリガーします
  • ブランチをmasterにマージする準備ができたら、wip.feature-Aからpr.feature-Aに名前を変更し、プルリクエストを開くことができます。
  • プルリクエストの確認中に新しい修正を適用する場合は、pr.feature-Aにプッシュするだけです

上記のすべてのステップで、1つのビルドのみがトリガーされます。

2
user2288008

allPRを構築すると仮定すると、次のようなものがトリックを行います。設定ページでブランチとPRビルドの両方を有効にし、この行を_travis.yml_の最初の行として配置します。

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

これにより、すべてのプッシュでプッシュビルドが試行され、オープンPRに対するすべてのプッシュでPRビルドが試行されますが、条件を満たさないものは除外されます。これを少し変更する必要があるかもしれません-名前のどこかにno-ciを含むブランチを構築しないという条項は明らかにオプションであり、ビルドを常に実行したい2つのブランチがない場合があります。

詳細については、Travisのサイトで conditions および conditional builds をご覧ください。

2
Corey Noel