travis-ciをローカルで実行する方法


524

プロジェクトに参加したばかりで、travis-ciを初めて使用します。ビルドを実行するために、すべての小さな変更を.travis.ymlにプッシュしたり、ソースに加えたすべての小さな変更をプッシュしたりする必要はありません。jenkinsを使用すると、jenkinsをダウンロードしてローカルで実行できます。トラビスはこのようなものを提供していますか?

注:travis-ci cliを確認してダウンロードしましたが、APIを呼び出すだけで、githubリポジトリに接続するため、プッシュしなくても、再起動する必要はありません。最後のビルド。


3
Travis CIを実行しなくても、ローカルでテストを実行できるはずです。実行するコマンドを確認するには、.travis.ymlの「スクリプト」セクションを確認してください。
Konstantin Haase

69
しかし、単にテストを実行するだけでは問題ではありません。多くの場合、install:セクションのセットアップとインストールの手順が原因でTravisビルドが失敗します。問題がより懸念されるのはおそらくこれらです。
Brandon Rhodes

4
複雑なプロジェクトでは、さまざまな理由(たとえば、異なるポイントリリースやランタイムのシステムの相互作用、本質的に時間依存のテスト(タイムアウトテストなど))がローカル環境とTravis CIで異なる動作をする場合があることを付け加えます。
circlespainter 2016年

回答:


200

このプロセスにより、コンピューター上のTravisビルドジョブを完全に再現できます。また、いつでもプロセスを中断してデバッグできます。以下は、php-school / cli-menuジョブ#191.1の 結果を完全に再現する例です。

前提条件

  • GitHubに公開リポジトリがあります
  • Travisで少なくとも1つのビルドを実行した
  • コンピューターにDockerがセットアップされている

ビルド環境をセットアップする

リファレンス:https : //docs.travis-ci.com/user/common-build-problems/

  1. 独自の一時ビルドIDを作成する

    BUILDID="build-$RANDOM"
    
  2. 見るビルドログを、ショーにWORKERについては、より多くのボタンを開き、INSTANCEラインを見つけ、ここでは、実行に貼り付けます(コロンの後にタグを置き換える最新の利用可能1付き)

    INSTANCE="travisci/ci-garnet:packer-1512502276-986baf0"
    
  3. ヘッドレスサーバーを実行する

    docker run --name $BUILDID -dit $INSTANCE /sbin/init
    
  4. 接続されているクライアントを実行する

    docker exec -it $BUILDID bash -l
    

ジョブを実行する

これでTravis環境に入りました。su - travis開始して実行します。

この手順は明確に定義されていますが、面倒で手作業です。Travisが環境で実行するすべてのコマンドが見つかります。これを行うには、右側の列でのようなタグがあるすべてのものを探します0.03s

左側には実際のコマンドが表示されます。これらのコマンドを順番に実行します。

結果

historyコマンドを実行する良い機会です。プロセスを再起動し、それらのコマンドを再生して、更新されたコードベースに対して同じテストを実行できます。

  • リポジトリがプライベートの場合:ssh-keygen -t rsa -b 4096 -C "YOUR EMAIL REGISTERED IN GITHUB"次にcat ~/.ssh/id_rsa.pubここをクリックしてキーを追加します
  • 参考:git pullGitHubにプッシュする前に、Docker内からコミットを開発ボックスからロードできます
  • Travisが実行するコマンドを変更したい場合、それがどのように機能するように変換されるかを理解するのはあなたの責任.travis.ymlです。
  • Docker環境をクリーンアップする方法がわかりません。複雑に見えますが、メモリがリークしている可能性があります

22
下のログにinstance:、有効なDockerイメージパスが表示されませんtravis-ci-garnet-trusty-1512502259-986baf0。試しましたtravisci/ci-garnet:$INSTANCEtravisci/$INSTANCE-画像を見つけることができない、動作しません。また、単に後置(つまりtravisci/ci-garnet:packer-1512502259-986baf0)をとっても機能しませんでした。
Roy Shilkrot、2018

4
同じ問題が発生しています。インスタンス情報に記載されている画像をダウンロードできません。さらに、Travis docsでtravisci/ci-garnet:packer-1512502276-986baf0提案されている画像を試しました。これは入手可能ですが、古くなっています。たとえば、CMakeはTravisで使用可能なものよりもかなり古いものです。過去6か月間にの新しいバージョンがDocker Hubにアップロードされていませんでしたが、以前は毎月多くの更新がありました。ci-garnet
skalee

7
参照リンクが機能しなくなりました。つまり、「コンテナベースのDockerイメージをローカルで実行する」セクションがそのページから削除されました。おそらく、インスタンス出力の違いは、sudo: required設定されていないためでしたか?私の現在のビルドではtravis-ci-sardonyx-xenial-1547455603-2c98a19travisci / ci-sardonyx:packer-1547455648-2c98a19に
maxschlepzig

4
dockerハブで最新バージョンのtravisci / ci-garnet(travisci / ci-garnet:packer-1515445631-7dfb2e1)を使用している私にとっては、トリックを行った
taleb

3
Travisの言語固有のインスタンスで作業している場合は、Pythonのような専用のイメージを使用することもできます。
Zaccharie Ramzi

162

Travis-ciは、Dockerを使用する新しいコンテナーベースのインフラストラクチャを提供します。これは、travis-ciビルドをローカルで複製してトラブルシューティングを行う場合に非常に役立ちます。これはTravis CIのドキュメントから取得されました。

Dockerイメージのローカルでのトラブルシューティング

ビルドで正確な問題を追跡できない場合は、ビルドをローカルで実行すると役立つことがよくあります。これを行うには(すなわち、持っている私たちのコンテナベースのインフラストラクチャを使用している必要がありsudo: false、あなたの中で.travis.yml)、そしてあなたがトラビスCI上で使用しているドッカーの画像を知っています。

コンテナーベースのDockerイメージをローカルで実行する

  1. Docker Engineをダウンロードしてインストールします。
  2. Docker Hubからイメージを選択します。言語固有の画像を使用していない場合は、を選択してくださいci-ruby。ターミナルを開き、イメージURLを使用してインタラクティブなDockerセッションを開始します。

    docker run -it travisci/ubuntu-ruby:18.04 /bin/bash
    
  3. travisユーザーに切り替えます。

    su - travis
    
  4. gitリポジトリのクローンを/イメージのフォルダーに作成します。
  5. 依存関係を手動でインストールします。
  6. Travis CIビルドコマンドを手動で実行します。

6
@DustinGraham、それはTravis CIによってビルドされているプロジェクトがビルドするように構成されている方法に依存します。私が取り組んでいるプロジェクトでは、ビルドコマンドはscript:サブセクションの下の.travis.ymlファイルで構成され、でした。make test
スコットマクロード

102
> Manually install any dependencies これは、通常のTravisビルドと一致しない結果に終わる良い方法のように思えます。
ジェリー2016年

6
@Gerry依存関係を手動でインストールすることにより、依存関係のインストールを処理するtravis構成ファイルにあるコマンドを手動で実行することを意味します。したがって、travis CIが実行するのと同じコマンドですが、自動化されていません。
Chathan Driehuys 2016年

8
これはどういうわけか私の質問への答えのように感じManually tun your Travis CI build commandますが、...のように、何ですか?どうやって?それは何ですか?.travis.ymlファイルがあります。私はtravis-buildを試しましたが、行き止まりです。
ブランドン、

2
@Brandon .travis.yml内には通常、ソースを構築するためにtravisによって呼び出されるスクリプトサブセクションがあります。この回答の要点は、travisが動作する環境と同じローカル環境をセットアップすることです。次に、これらのコマンドを実行するためにtravisに依存する代わりに、これらのコマンドを自分で呼び出します。このようにして、この環境内で各コマンドを自分で実行した場合の影響を確認できます。これにより、他の方法ではアクセスできない、トラビスで発生する可能性のあるビルドの問題に関する洞察を得ることができます。
スコットマクロード

86

更新:私は今、完全なターンキー、オールインワン回答を持っています。https://stackoverflow.com/a/49019950/300224を参照してください。たった3年でわかりました。

Travisのドキュメントによれば、https//github.com/travis-ci/travis-ciは、私たちが知っていて愛しているTravis CI Webサービスを提供するために結集したプロジェクトの合体があります。次のプロジェクトのサブセットは、プロジェクトでを使用してローカルmake test機能を許可.travis.ymlしているようです:

トラビスビルド

travis-buildは、各ジョブのビルドスクリプトを作成します。.travis.ymlファイルから構成をbash取得し、travis-workerによってビルド環境で実行されるスクリプトを作成します。

トラビスクックブック

travis-cookbooksには 、ビルド環境のプロビジョニングに使用されるChefクックブックが含まれています。

トラビスワーカー

travis-workerは、クリーンな環境でビルドスクリプトを実行する責任があります。ログ出力をtravis-logsにストリーミングし、状態の更新(ビルドの開始/終了)をtravis-hubにプッシュします。

(他のサブプロジェクトは、GitHub、それらのWebインターフェイス、電子メール、およびAPIとの通信を担当します。)


4
これら3つのコンポーネントだけを使用してmake test機能を実行するプロジェクトは素晴らしいと思います。私と一緒に取り組みたい場合はコメントしてください。
William Entriken 2014年

4
travis repoにこれに関するスレッドがあります。
急いでmaplelad 14

5
GitHubのが理由で、今日ダウンしているDDOS github.com/blog/1981-large-scale-ddos-attack-on-github-com私たちは地元のテストを必要とする理由です
ウィリアム・エントリケン

20
実際にインストールして実行するにはどうすればよいtravis-buildですか?リポジトリに指示はありません。
DisgruntledGoat 2015年

1
@sindhusいいえ、申し訳ありません。私が見つけた唯一の解決策は、リポジトリをforkし、Travisが機能するまで変更を加えてから、構成ファイルをメインリポジトリにコピーして1つのコミットを行うことです。編集:考えてみてください。そのために一時的なブランチを使用し、完了したらリモートブランチを削除し、コミットを1つにリベース/スカッシュします。
DisgruntledGoat 2016年

23

Scott McLeodと似ていますが、これも.travis.ymlからステップを実行するbashスクリプトを生成します。

生成されたBashスクリプトを使用したDockerのローカルでのトラブルシューティング

# choose the image according to the language chosen in .travis.yml
$ docker run -it -u travis quay.io/travisci/travis-jvm /bin/bash

# now that you are in the docker image, switch to the travis user
sudo - travis

# Install a recent ruby (default is 1.9.3)
rvm install 2.3.0
rvm use 2.3.0

# Install travis-build to generate a .sh out of .travis.yml
cd builds
git clone https://github.com/travis-ci/travis-build.git
cd travis-build
gem install travis
# to create ~/.travis
travis version
ln -s `pwd` ~/.travis/travis-build
bundle install

# Create project dir, assuming your project is `AUTHOR/PROJECT` on GitHub
cd ~/builds
mkdir AUTHOR
cd AUTHOR
git clone https://github.com/AUTHOR/PROJECT.git
cd PROJECT
# change to the branch or commit you want to investigate
travis compile > ci.sh
# You most likely will need to edit ci.sh as it ignores matrix and env
bash ci.sh

までのステップをたどることができましたtravis # to create ~/.travis。Travisを実行するにはコマンドが必要です。
EivindGussiåsLøkseth18年

3
sudo - travisする必要がありますsu - travis
Berend de Boer

1
コンパイルステップを行うとき、私は得る:/home/travis/.rvm/rubies/ruby-2.4.1/lib/ruby/site_ruby/2.4.0/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- travis/support (LoadError)
Berend・デ・ボーア

2
@BerenddeBoer:この問題をまだ理解していない場合:問題を取り除くための解決策 cd ~/.travis/travis-build/ bundle install bundler add travis bundler binstubs travis cd <REPO_YOU_WANT_TO_RUN_COMPILE_IN> ~/.travis/travis-build/bin/travis compile
Venkateshwaran Selvaraj

2
トラビスのコンパイルはもはや有効ではありませんか?不明なコマンドcompile:/ travis -hに表示されない:////
Dawid Drozd

16

wwtd(travisが実行することになる) ruby gemを使用して、ローカルマシンでtravisで実行するのとほぼ同じようにテストを実行します。

ビルドマトリックスを再作成し、各構成を実行します。プッシュする前に、セットアップの健全性チェックに最適です。

gem i wwtd
wwtd

重要な注意:のみrubyのサポート
msangel

他の言語のサポートを追加して、ステップを実行できるようにする必要がある
Grosser

それは病気です。よく働く!ありがとう!
ppetraki

14

TL; DRで指定された使用イメージhttps://docs.travis-ci.com/user/common-build-problems/#troubleshooting-locally-in-a-docker-imageとの組み合わせでhttps://github.com/ travis-ci / travis-build#use-as-addon-for-travis-cli


編集2019-12-06

#troubleshooting-locally-in-a-docker-imageセクションが置き換えられ、デバッグモードで実行されているジョブ#running-builds-in-debug-modeSSHで接続する方法も説明されています

編集2019-07-26

#troubleshooting-locally-in-a-docker-imageセクションはドキュメントの一部ではなくなりました。ここに理由があります


しかし、それはまだgitの履歴にあります:https : //github.com/travis-ci/docs-travis-ci-com/pull/2193

https://travis-ci.org/travis-ci/docs-travis-ci-com/builds/230889063#L661で(かなり古い、新しいものを見つけることができなかった)イメージバージョンを探します



ビルドのテストの1つがローカルでは取得できないエラーで失敗した 理由を調べたかったのです。

働いた。

実際に機能したのは、Dockerイメージのドキュメントページのローカルでのトラブルシューティングで指定されたイメージを使用することでした。私の場合はそうだったtravisci/ci-garnet:packer-1512502276-986baf0

https://github.com/travis-ci/travis-build#use-as-addon-for-travis-cliでtravise compile説明されている次の手順を追加できました。

dm@z580:~$ docker run --name travis-debug -dit travisci/ci-garnet:packer-1512502276-986baf0 /sbin/init
dm@z580:~$ docker images
REPOSITORY                       TAG                          IMAGE ID            CREATED             SIZE
travisci/ci-garnet               packer-1512502276-986baf0    6cbda6a950d3        11 months ago       10.2GB
dm@z580:~$ docker exec -it travis-debug bash -l
root@912e43dbfea4:/# su - travis
travis@912e43dbfea4:~$ cd builds/
travis@912e43dbfea4:~/builds$ git clone https://github.com/travis-ci/travis-build
travis@912e43dbfea4:~/builds$ cd travis-build
travis@912e43dbfea4:~/builds/travis-build$ mkdir -p ~/.travis
travis@912e43dbfea4:~/builds/travis-build$ ln -s $PWD ~/.travis/travis-build
travis@912e43dbfea4:~/builds/travis-build$ gem install bundler
travis@912e43dbfea4:~/builds/travis-build$ bundle install --gemfile ~/.travis/travis-build/Gemfile
travis@912e43dbfea4:~/builds/travis-build$ bundler binstubs travis
travis@912e43dbfea4:~/builds/travis-build$ cd ..
travis@912e43dbfea4:~/builds$ git clone --depth=50 --branch=master https://github.com/DusanMadar/PySyncDroid.git DusanMadar/PySyncDroid
travis@912e43dbfea4:~/builds$ cd DusanMadar/PySyncDroid/
travis@912e43dbfea4:~/builds/DusanMadar/PySyncDroid$ ~/.travis/travis-build/bin/travis compile > ci.sh
travis@912e43dbfea4:~/builds/DusanMadar/PySyncDroid$ sed -i 's,--branch\\=\\\x27\\\x27,--branch\\=master,g' ci.sh
travis@912e43dbfea4:~/builds/DusanMadar/PySyncDroid$ bash ci.sh

からのすべて.travis.ymlが期待どおりに実行されました(依存関係がインストールされ、テストが実行された、など)。

実行する前に、で(最後から2番目のコマンドを参照)bash ci.shに変更--branch\=\'\'\する必要があったことに注意し--branch\=master\ください。sed -i ...ci.sh

それが機能しない場合は、次のコマンドを使用して対象の行番号を特定し、手動で行を編集できます。

travis@912e43dbfea4:~/builds/DusanMadar/PySyncDroid$ cat ci.sh | grep -in branch
840:    travis_cmd git\ clone\ --depth\=50\ --branch\=\'\'\ https://github.com/DusanMadar/PySyncDroid.git\ DusanMadar/PySyncDroid --echo --retry --timing
889:export TRAVIS_BRANCH=''
899:export TRAVIS_PULL_REQUEST_BRANCH=''
travis@912e43dbfea4:~/builds/DusanMadar/PySyncDroid$

うまくいきませんでした。

この質問の承認された回答に従いましたが、https://hub.docker.com/u/travisci/でtravis-ci-garnet-trusty-1512502259-986baf0言及さinstanceれている画像()が見つかりませんでした。

ビルドワーカーバージョンtravis-ci / worker commitを指し、そのtravis-worker-installquay.io/travisci/はイメージレジストリとして参照します。だから私はそれを試しました。

dm@z580:~$ docker run -it -u travis quay.io/travisci/travis-python /bin/bash
travis@370c23a773c9:/$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 12.04.5 LTS
Release:    12.04
Codename:   precise
travis@370c23a773c9:/$
dm@z580:~$ docker images 
REPOSITORY                       TAG                          IMAGE ID            CREATED             SIZE
quay.io/travisci/travis-python   latest                       753a216d776c        3 years ago         5.36GB

確かに信頼できない(Ubuntu 14.04)か、小さくもない。


1
働いたアプローチは私のためにそれをしました。しかし、それに加えて、http_proxy環境を設定する必要がありましたgit clone。デフォルトでgit clonegnutls_handshake例外をスローし ます。したがって、以前に失敗したため、特定のbundlerバージョンのインストールを強制する必要があります。`bundle info travis`を実行して必要なバージョンを改善するgem install bundler -v 1.16.6bundler binstubs travisbundler
palik

1
これは、travis.yml実行可能なシェルスクリプトにコンパイルする方法を説明しているため、ここでの最良の回答です。よくできました!これに対する唯一の改善は、構築元のブランチを指定するときに手動の文字列置換を回避するメカニズムです。
ベンジョンソン

1
@BenJohnson私はsedあなたがした点に対処するコマンドを追加しました。実行する前にコマンドを参照してくださいbash ci.sh
斗山マダラ

リンク* Docker Imageのローカルでのトラブルシューティング*が機能しなくなった
juliangonzalez

1
@juliangonzalezは私が掘ることができた最高の情報で編集しました。
斗山マダラ

7

Dockerを使用してTravisビルドを実行するTrevorを試すことができます。

その説明から:

Node.jsの複数のバージョンのテストを実行する必要があることがよくあります。しかし、n / nvmを使用して手動でバージョンを切り替えたり、テストを実行するためだけにコードをTravis CIにプッシュしたりしたくありません。

だからトレヴァーを作りました。Travis CIと同様に、.travis.ymlを読み取り、要求したすべてのバージョンでテストを実行します。これで、プッシュする前にテストして、git履歴をクリーンに保つことができます。


2
これを試してみたい人のための参考までに... PHPはサポートされていません
Craig Wayne

2
node.js専用のようです。それを拡張するためにいいだろう
ジョアン・ネト

6

Travisをローカルで実行する本来の理由は何なのかわかりません。もしそれをいじりたいだけなら、それはあなたには関係がないので、ここで読むのをやめてください。

ホストされたTravisの経験があり、自分のデータセンターで同じ経験をしたい場合は、以下をお読みください。

2014年12月以降、Travis CIはエンタープライズオンプレミスバージョンを提供しています。

http://blog.travis-ci.com/2014-12-19-introducing-travis-ci-enterprise/

価格も記事の一部です。

ライセンスはシートごとに行われ、すべてのライセンスには20ユーザーが含まれます。価格はライセンスあたり6,000ドルからで、これには20人のユーザーと5つの同時ビルドが含まれます。8,500ドルで無制限にビルドできるプレミアムオプションがあります。


3
私も実際にこれに興味がありました。私は本当に厄介なプロジェクトのトラビスジョブを構成しようとしています。4月26日のコミットはすべて、.travis.ymlファイル(github.com/gregturn/issue-aggregator/commits/master)をいじっていました。すべての編集をプッシュする必要なく、構成をいじる簡単な方法があったらいいのにと思います。
gregturn 2015

4
@gregturn私が思いついた醜いがストレスを軽減する回避策は、私のリポジトリを2番目のGitHubリポジトリに複製することでした。したがって、リポジトリwhackamoleは私が本当に取り組みたいプロジェクトのコピーであり、ビルド自動化のねじれを解決する間、そのプロジェクトの一時的なTravisビルドジョブを設定できます。それを確認したら、何十もの「oops」コミットをリベースして、実際のGitHubリポジトリにプッシュします。(そしておそらくwhackamoleGitHubリポジトリと対応するTravisジョブを削除します。)
tripleee

3
6000ドルのライセンス料は1回限りか、年1回か。
Erik

0

バウンスホストを介してTravis CI環境にSSHで接続することが可能です。この機能はTravis CIには組み込まれていませんが、次の手順で実現できます。

  1. バウンスホストでtravisユーザーを作成し、SSHできることを確認します。
  2. これらの行script:をあなたのセクションに入れてください.travis.yml(例えば最後に)。

    - echo travis:$sshpassword | sudo chpasswd
    - sudo sed -i 's/ChallengeResponseAuthentication no/ChallengeResponseAuthentication yes/' /etc/ssh/sshd_config
    - sudo service ssh restart
    - sudo apt-get install sshpass
    - sshpass -p $sshpassword ssh -R 9999:localhost:22 -o StrictHostKeyChecking=no travis@$bouncehostip
    

    どこに$bouncehostipあなたのバウンスホストのIP /ホストで、$sshpasswordあなたの定義されたSSHのパスワードです。これらの変数は、暗号化された変数として追加できます

  3. 変更をプッシュします。バウンスホストへのSSH接続を確立できるはずです。

ソース:Travis CIビルド環境へのシェル


ここに完全な例があります:

# use the new container infrastructure
sudo: required
dist: trusty

language: python
python: "2.7"

script:
- echo travis:$sshpassword | sudo chpasswd
- sudo sed -i 's/ChallengeResponseAuthentication no/ChallengeResponseAuthentication yes/' /etc/ssh/sshd_config
- sudo service ssh restart
- sudo apt-get install sshpass
- sshpass -p $sshpassword ssh -R 9999:localhost:22 -o StrictHostKeyChecking=no travisci@$bouncehostip

参照:c-mart/travis-shellGitHubで


参照:デバッグのためにtravis-ciビルド環境を再現する方法

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.