7

私は次のMakefileを持っています:

#runs the working directory unit tests
test:
    @NODE_ENV=test; \
        mocha --ignore-leaks $(shell find ./test -name \*test.js);

#deploys working directory
deploy:
    @make test; \
    make deploy-git; \
    make deploy-servers;

#deploys working to git deployment branch
deploy-git:
    @status=$$(git status --porcelain); \
    if test "x$${status}" = x; then \
        git branch -f deployment; \
        git push origin deployment; \
        echo "Done deploying to git deployment branch."; \
    else \
        git status; \
        echo "Error: cannot deploy. Working directory is dirty."; \
    fi

deploy-servers:
#   for each server
#       @DEPLOY_SERVER_IP = "127.0.0.1"; \
#       make deploy-server

#deploy-server:
#   connect to this server with ssh
#   check if app is already running
#   stop the app on the server if already running
#   set working directory to app folder
#   update deployment git branch
#   use git to move head to deployment branch
#   start app again

deploy-serversdeploy-serverは今のところ単なるダミーであることに注意してください。これは、deployコマンドが実行する必要があることです。

  1. テストを実行し(make test)、失敗したら終了します
  2. 現在のヘッドをデプロイメントブランチにプッシュし(make deploy-git)、失敗したら終了します
  3. サーバー上のデプロイメントブランチをプルする(make deploy-servers

これは、Makefileで次のように確認できます。

deploy:
    @make test; \
    make deploy-git; \
    make deploy-servers;

問題は、失敗したときに実行されないようにする方法と、テストが失敗したときまたは失敗したときにmake deploy-git実行されないようにする方法がわからないことです。make testmake deploy-serversmake deploy-git

これを行う明確な方法はありますか、それともシェルファイルを使用するか、通常のプログラミング言語でこれらのツールを作成する必要がありますか?

4

4 に答える 4

14

シェルコマンドリストの終了ステータスは、リストの最後のコマンドの終了ステータスです。コマンドリストを個別の単一の単純なコマンドに変換するだけです。デフォルトでmakeは、コマンドがゼロ以外を返すと停止します。だからあなたはあなたが望むものを手に入れます

deploy:
    @make test
    make deploy-git
    make deploy-servers

単純なコマンドの終了ステータスを無視したい場合は、接頭辞としてダッシュを付けることができます。

 target:
     cmd1
     -cmd2 # It is okay if this fails
     cmd3

あなたのmakeマニュアルにはすべての詳細があります。

于 2012-05-11T22:03:21.267 に答える
5

他の人は、「レシピ」を個々のコマンドに分割することに基づいた答えを出しました。

それが実行可能でない状況ではset -e、コマンドが失敗した場合にそれを終了させるためにシェルスクリプトで行うことができます。

target:
        set -e ; \
          command1 ; \
          command2 ; command3 ; \
          ... commandN

これは、set -e一部のコマンドが正常に終了しなかった場合にシェルスクリプトをベイルさせるために、シェルスクリプトの上部近くに配置するのと同じです。

command2およびの終了ステータスには関心がないとしcommand3ます。これらが失敗を示している場合、または終了ステータスを確実に使用していない場合は問題ないとします。次に、代わりにset -e明示的な終了テストをコーディングできます。

target:
        command1 ; \
        command2 || exit 1 ; \
        command3 ; \
        true  # exit 0 will do here also.

command3失敗を示す可能性があり、ビルドが失敗しないようにするため、成功したダミーコマンドを追加します。

于 2012-05-12T01:01:53.530 に答える
2

makeすでにこれを行う必要があります。で複雑なコマンドを実行しますsh -e。これは、(POSIX互換シェルでループしていない限り)コマンドがゼロ以外で終了すると実行を中止し、Makefile特に指示しない限り、コマンドが失敗すると全体を中止します。妄想を感じている場合は、コマンド&&の代わりに使用でき;ます。

于 2012-05-11T21:49:24.080 に答える
0

潜在的なブレークポイントで新しいmakeコマンドにプロキシすることで、この問題を解決しました。

.PHONY cmd_name cmd_name_contd

cmd_name:
    if [ "`pwd`" = "/this/dir" ]; then make cmd_name_contd; fi

cmd_name_contd:
    @echo "The directory was good, continuing"

そうすれば、ディレクトリが間違っていた場合、サイレントに終了します。失敗時に表示するメッセージを含むelse条件を追加することもできます。

于 2014-10-24T07:05:42.883 に答える