質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.77%

git pullした際のファイル反映の順番について

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 702

koji9412

score 136

前提・実現したいこと・発生している問題

とあるWEBサービスにgitを使用して本番にデプロイする際に、git pull を使ってデプロイするとします。

例としてこれからデプロイするファイルが2つあり、A、Bとします。
・Aのみをデプロイした場合にはWEBサービスにエラーが出ない
・Bのみをデプロイした場合にはWEBサービスにエラーが出る
・A→Bの順番でデプロイした場合にはWEBサービスにエラーが出ない
・AとBのファイルは1つのファイルとして結合することはできない
・WEBサービスは秒間リスエストが非常に多いサイト
とします。

ファイルA、Bはほぼ同時にデプロイされるはずなので、そもそもファイルA,Bがどちらが先に反映されるかなど些細な問題なのですが
諸事情により1エラー足りとも、エラーを出すことが許されない状況でして、デプロイの手法について悩んでいます。

例えばgit pullを実行後、ファイルの反映がB→Aとなってしまう場合があれば、一瞬でもエラーが発生してしまう可能があります。

試したこと

ファイルAを先にデプロイをすればエラーが発生しないため、Aをデプロイ後、あとからファイルBをデプロイしております。
しかしあまり頭の良いやり方ではないのではと考え、何かいい方法はないかと探っておりますが思いつきません。

git pull時に反映する順番を選べるなど(comitした順番になるのか、容量なのか、タイプスタンプ、またはファイル名のソートなのかなど)の
情報があればぜひ試してみたいのですが、知りたいことの情報が出てこないため、ぜひ文献や情報、解決策、皆様のお知恵を拝借したいです。

補足情報(FW/ツールのバージョンなど)

申し訳ありませんが
・ファイルのアップロード順でエラーが発生してしまうこと自体が問題、というのは今回はなしにしてください。
・WEBサービスをメンテナンスモードにすることは許されていない状況です。

何卒、よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

check解決した方法

0

リリースブランチを2つに分けてデプロイするやり方にしました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

この疑問はもっともで、それを対策する為にブランチという概念がGitには備わっています。
また、デグレを起こさない為のブランチ運用戦略というものがいくつも考案されています。

ブランチ運用戦略の内、有名なやり方は名前がついており、
GitFlowGitHubFlowが有名です。
それをカスタマイズして運用しているプロジェクトも非常に多いですね。


まぁ、どのブランチ運用戦略も基本は単純です。
「master」は今本番環境で動作しているソースコードで、テストしてないコミットを混ぜるなころすぞ!!みたいな運用です。

GitFlowでは本番環境と一致するmasterブランチはおいそれとバージョンを引き上げられませんので、
他のコミットを取り込んで吸収するdevelopmentブランチを用意しておき、
リリースするぞ!というタイミングで入念なテストを行ってパスしたら、初めてmasterにマージされて運用が始まるという思想です。

GitHubFlowではこれは簡素になっており、
masterブランチへのプルリクエストだけでどんどんmasterに集約していく考えで運用しています。


諸事情により1エラー足りとも、エラーを出すことが許されない状況でして、デプロイの手法について悩んでいます。

ブランチ切ってプルリクエストの運用にしましょう。
質問文の懸念は「A機能」と「B機能」が同時に本番用のソースコードに混ざり、
デプロイされてしまうとエラーでWebサイトが停止してしまう!…というものですね。

この「A機能」と「B機能」をブランチとして別個のものにしておけば、
A機能だけ混ぜてデプロイしたいんだけどなぁと悩む事はありません。
A機能だけmasterにmergeで取り込ませてデプロイすれば良いのですから。

そもそもエラーの出るコードを混ぜてシステムを壊してしまう「B機能」なんて混ぜてはいけません。
ここはGitHubのSNS機能上で皆で検討・レビューを行ってからマージするプルリクエストという機能を利用しましょう。
これで本番環境でエラーが出たら誰の責任か?B機能がエラーが出るとわかってて承認ボタン押した間抜けにきまっているだろう?という話になります。

まぁ、DBの値が消えちゃった!?みたいな取り返しのつかないヤバイ不具合でなければ
そんなにダメージは出ないのでさっさと直せば良いだけだと思いますけどね。


こんな所ですかね。

まずは「プルリクエスト」などのGitHubに備わっている機能、
「GitHubFlow」などのブランチ戦略に関して調査していきながら
これは良さそう、これでやっていこうという運用を決めてみてくださいね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/24 18:36

    >GitFlowやGitHubFlowが有名です
    もちろんGitFlowやGitHubFlowは存じており、プルリクもわかっておりますが、当方の質問の仕方が悪かったため返信させていただきます。

    現在、プルリク後、releaseブランチからmasterへマージし、本番環境でgit pullするタイミングとしてください。

    分割されたファイルA、Bについてですが、これは1つの機能を実装しており、ファイルBはAを参照している状態です。
    Aのみをデプロイする場合は特にエラーが出ないのですがBのみデプロイした場合、参照先のAがないわけですからエラーとなってしまう仕様です。


    通常、普通はファイルAとBを一緒にデプロイすると思うのですが、Bのファイルのほうが早くアップされ、コンマの差でファイルAがアップされた場合、
    その間にアクセスがあった場合にはエラーが出てしまうというふうに認識してます。

    本番へデプロイする方法として最終段階、本番サーバーにてgit pullにて対応するわけですが
    git pull の細かい挙動として、本番のローカルのmasterブランチとリポジトリのmasterブランチの差分を変更するために
    本番のローカルのmasterブランチのファイルA、ファイルBの中身が書き換わると思います。

    しかし、同時に書き換わる仕様ではない場合、(1ファイルずつ書き換わっている)ファイルBのほうがタイミング早いと、エラーとなってしまいます。


    そのため
    ・そもそものgitの仕組みが同時に書き換えている
    のであれば問題ありません。

    また、仮に書き換えている順番があるのであればcomitの順番であったり、ファイル名のソート順などで指定できるのであれば対応できるのですが
    どのような順番を選ぶ基準で選ばれているのかがソースを見てもわからないため質問させていただいている次第となっております。

    もしご存知でしたらお力を貸して頂けましたら幸甚に存じます。

    よろしくお願いいたします。

    キャンセル

  • 2019/05/24 18:43

    後出しな上に園児ニアじゃねえかという話で
    状況をかなり下方修正する必要があるので回答する気力が大分失せました。
    気力が回復したら文章を全部リテイクするかも知れません。

    キャンセル

  • 2019/05/24 19:03

    miyabi-sun様
    申し訳ありません。投稿後、内容を追記した部分もありましたため
    タイミング的に後出しになってしまった可能性もあるかと思います。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.77%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る