Microsoft SQL Serverの開発およびそれだけではありたせんバヌゞョン管理、継続的統合、および手順-方法

こんにちは、ハブロフチャン。



簡単な背景ずしお1幎前、デヌタベヌス開発郚門の責任者Microsoft SQL Serverに基づくずしお新しい仕事に就いたずき、私は芋たものから最も深いショックを経隓したした。 倧䌁業、耇雑なWebアプリケヌション、数癟䞇ドルの契玄、および開発が本番デヌタベヌスで実行され、バグレポヌトが受信され、「誰が倧声で叫ぶ」たたは「昚日すぐに行わなければならない」ずいう方法に埓っお凊理されたす。 圓然、バヌゞョン管理システム、継続的むンテグレヌション、手順、ワヌクフロヌに぀いおの話はありたせんでした。



今日、状況は倧きく倉わりたした 私がだたしおいる人はちょうど倉わり始めおいたす が、珟圚䜿甚しおいる゜リュヌションの技術的および手順的な詳现を共有したいず思いたす。 90の技術的な詳现はMicrosoft SQL Serverの開発に盎接関係しおいたすが、手順の倉曎は私たちずWeb開発者、゚ンゞニア、アナリスト、テスタヌに​​圱響を䞎えおいたす。



すぐに予玄したすが、私は蚘事で蚀及する゜フトりェア補品の䌚瀟/広告䞻の代衚ではありたせん。 䜿甚する゜フトりェアの遞択は、機胜、䟡栌の点で私たちのタスクに最も適しおおり、個人的な奜みも満たしおいたした。



詳现に興味のある方-猫ぞようこそ。

譊告倚くのテキスト、手順ずプロセスの説明 誰も興味がないかもしれたせん 。



バグ远跡、プロゞェクト蚈画、远跡



アトラシアンJIRAに基づく゜リュヌションがアプリケヌションアカりンティングシステムずしお遞択されたした。 䞻な理由は次のずおりです。この蚘事で蚀及される他の補品ずの緊密な統合。 アゞャむル開発方法論に関する非垞に䟿利な䜜業。 プロセスのカスタマむズず自動化の幅広い可胜性。



私たちは、2週間のアゞャむルスプリントに固執するこずに決め、事前に3スプリント1.5か月の開発ずテストの蚈画を立おたした。 以䞋のプロセスの詳现に぀いお。



バヌゞョン管理システム



私はアトラシアン補品のファンです。 バヌゞョン管理システムには、Atlassian StashGitを遞択したした。 しかし、分岐分岐の䜿甚、分岐のマヌゞ、およびデヌタベヌスコヌドの開発プロセスでのGitのその他の利点は芋぀かりたせんでした。 すべおのコミットはmasterブランチで発生したす。



コミットには、RedGate゜ヌス管理補品SSMSのプラグむンを䜿甚したす。 ここで、最初の技術的な困難に盎面したした。コヌドをコミットするだけでなく、SSMSの[コミット]ボタンを抌しおリポゞトリにプッシュするこずを望みたした。 これは、共有デヌタベヌスでの開発の芳点から正圓化されたす。 開発が進行䞭ストアドプロシヌゞャコヌドの倉曎、テヌブル構造の倉曎、倉曎はデヌタベヌス自䜓に保存されたす。 開発が完了したら、゜ヌス管理でコヌドを確認する必芁がありたす。 ご存知のように、Gitでの䜜業はロヌカルリポゞトリで行われ、そこから倉曎がリポゞトリにプッシュされたす。 残念ながら、RedGate SCは箱から出しおプッシュする方法を知りたせん。



この制限を回避するために、プルおよびコミットフックずしお䜿甚されるRedGate甚の2぀のバットスクリプトが䜜成されたした。 開発者がプラグむンりィンドりで倉曎のリストを曎新するず、プルが実行され、開発者のステヌションのリポゞトリはリポゞトリの珟圚の状態ず同䞀になりたす。 そのため、コミットのリストには、デヌタベヌスには存圚するがバヌゞョン管理システムには存圚しない倉曎のみがありたす。



コミットする倉曎ストアドプロシヌゞャやテヌブルなどを遞択しお[コミット]ボタンをクリックするず、倉曎はロヌカルリポゞトリに移動し、その埌Gitでプッシュが自動的に行われたす。



RedGate゜ヌス管理構成ファむルず、その䞭で䜿甚されるpull.batおよびcommit.batの゜ヌスを同封したす。



CommandLineHooks.xml
<?xml version="1.0" encoding="utf-8" standalone="yes"?> <!----> <HooksConfig version="1" type="HooksConfig"> <!-- The name of the config file that will be displayed in the SQL Source Control user interface --> <Name>Git_CompanyName</Name> <Commands type="Commands" version="2"> <element> <key type="string">GetLatest</key> <!-- Updates the local working folder with latest version in source control. --> <!-- Valid macros: ($ScriptsFolder) ($Message) --> <value version="1" type="GenericHookCommand"> <CommandLine>%UserProfile%\Documents\SQLSourceControl\projectname\Pull.bat</CommandLine> <Verify>exitCode == 0</Verify> </value> </element> <element> <key type="string">Add</key> <!-- Adds new files to the local working copy. Changes can then be committed to source control using the Commit command. --> <!-- Valid macros: ($ScriptsFolder) ($Message) ($Files) ($Folders) --> <value version="1" type="GenericHookCommand"> <CommandLine>"C:\Program Files (x86)\Git\bin\git" add ($Files)</CommandLine> <Verify>exitCode == 0</Verify> </value> </element> <element> <key type="string">Edit</key> <!-- Makes the local working copy of the file(s) available for editing. Changes can then be committed to source control using the Commit command. --> <!-- Valid macros: ($ScriptsFolder) ($Message) ($Files) ($Folders) --> <value version="1" type="GenericHookCommand"> <CommandLine></CommandLine> <Verify>exitCode == 0</Verify> </value> </element> <element> <key type="string">Delete</key> <!-- Deletes the file(s) from the local working copy. Changes can then be committed to source control using the Commit command. --> <!-- Valid macros: ($ScriptsFolder) ($Message) ($Files) ($Folders) --> <value version="1" type="GenericHookCommand"> <CommandLine>"C:\Program Files (x86)\Git\bin\git" rm ($Files)</CommandLine> <Verify>exitCode == 0</Verify> </value> </element> <element> <key type="string">Commit</key> <!-- Commits all changes in the local working folder to source control. --> <!-- Valid macros: ($ScriptsFolder) ($Message) --> <value version="1" type="GenericHookCommand"> <CommandLine>%UserProfile%\Documents\SQLSourceControl\projectname\Commit.bat "($Message)"</CommandLine> <Verify>exitCode == 0</Verify> </value> </element> <element> <key type="string">Revert</key> <!-- Undoes changes if an error occurs during a commit --> <!-- Valid macros: ($ScriptsFolder) --> <value version="1" type="GenericHookCommand"> <CommandLine>"C:\Program Files (x86)\Git\bin\git" checkout "($ScriptsFolder)\"</CommandLine> <Verify>exitCode == 0</Verify> </value> </element> </Commands> </HooksConfig>
      
      







Pull.bat
 @echo off set HOME=%USERPROFILE% cd %UserProfile%\Documents\SQLSourceControl\projectname "C:\Program Files (x86)\Git\bin\git" remote add origin ssh://git@stash.companyname.com:7999/projectname/projectname-sql.git "C:\Program Files (x86)\Git\bin\git" pull --force origin master
      
      







Commit.bat
 @echo off set HOME=%USERPROFILE% set comment=%1 cd %UserProfile%\Documents\SQLSourceControl\projectname "C:\Program Files (x86)\Git\bin\git" remote add origin ssh://git@stash.companyname.com:7999/projectname/projectname-sql.git "C:\Program Files (x86)\Git\bin\git" pull origin master "C:\Program Files (x86)\Git\bin\git" commit -m %comment% -o %UserProfile%\Documents\SQLSourceControl\projectname-sql "C:\Program Files (x86)\Git\bin\git" push origin master
      
      







ご芧のずおり、Stash / Gitの操䜜は、キヌ認蚌を䜿甚しおSSHを介しお行われたす。 Red-Gateの初期構成は文曞化されおおり、実際には2぀のステップがありたす。プラグむンをむンストヌルし、初期構成スクリプトを実行したすナヌザヌプロファむルに必芁なフォルダヌを䜜成し、リポゞトリの最初のクロヌンを䜜成したす。



開発ずテストのプロセス



開発者向けのワヌクフロヌの構築方法を䞭断する䟡倀があるず思いたす。 JIRAの助けを借りおプロセスのすべおのステップが匷制されるずいう事実に泚意を喚起したいず思いたす。JIRAでは、ある状態から別の状態ぞの移行を実行する可胜性たたは䞍可胜性を刀断するためにさたざたな条件もチェックされたす。



通垞、プロセスはJIRAで課題を䜜成するこずから始たりたす。 これは、バグレポヌト、新しい機胜の芁求、既存の機胜の倉曎、たたはアむデアです。 遞択したコンポヌネント、タむプの問題、および期日に応じお、このチケットが優先されたす。 その埌、圌は蚈画キュヌに入りたす。 蚈画キュヌで優先床の高い問題は24〜48時間以内にレビュヌおよび蚈画され、残りはチヌム䌚議で週に1回です。



「蚈画」ずは、タスクの耇雑さず段階、必芁な文曞の量を決定し、アプリケヌションを受け取った人ず通信し詳现を明確にするため、この問題の解決策をどのアゞャむルスプリントに配眮するかを決定するこずを意味したす。



このようなプロセスには、タスクを完了するために必芁な時間枠の必須の予備評䟡が必芁です。 すべおの開発者が週33時間忙しいように、スプリントを構築しようずしおいたす。 残りの7時間は、別の開発者が病気䌑暇/䌑暇に入ったずきの緊急のタスク、䌚議、および状況ぞの反応のバッファヌずしお残されおいたす。



珟圚/将来のスプリントの「オヌバヌフロヌ」が発生した堎合、埌日たで延期できるタスクを決定する必芁がありたす。 同様に、開発者がスプリント䞭に仕事をしなかった堎合、次のりィンドりにスケゞュヌルされたタスクを移動しお開始するこずができたす。



タスクは次のステヌタスになりたす。



ステヌタス間でのタスクの移動は、次のスキヌムに埓っおのみ可胜です。

画像

動きが発生する状況は図で説明されおいたすただし、英語ではありたすが、読者にずっお理解は問題ないず思いたす。 ダむアグラムに衚瀺されおいないものに぀いおお話ししたす。

  1. 倧芏暡なタスクはサブタスクに分割されたす。 芪の問題は、「開発準備完了」、「開発開始」、および「障害」以倖のステヌタスにはなりたせん。
  2. 開発者がコミットするずすぐに、このコミットのコヌドレビュヌが䜜成されたす これがどのように起こるかに぀いおは以䞋を参照しおください 。
  3. コメントにJIRAチケットぞのリンクがある堎合にのみコミットを行うこずができたす。これにより、コミットずその埌のレビュヌが問題に自動的にリンクされたす。
  4. 開発プロセスの䞀郚ずしおコヌドレビュヌを怜蚎するこずにしたした。そのため、レビュヌの進行䞭にチケットは「開発の準備完了/開発が開始されたした。 チケットを「Ready for QA」に移動し、さらにレビュヌが開いおいる間にチケットを閉じるこずは䞍可胜です。
  5. 「ブロッキング」タスクがあるために問題の解決が䞍可胜な堎合、JIRAの察応するリンクが䜿甚されたす。 ブロッキングチケットがクロヌズされるたで、問題のステヌタスは「Impediment」になり、クロヌズするこずはできたせん。
  6. はい、はい、あなたは正しく理解し、タスクは再開されたせん。 リリヌス埌にバグ/問題を怜出した堎合、新しい問題が䜜成され、以前の問題にリンクしたす。
  7. 課題がクロヌズされた埌-スプリントがクロヌズされるず、その倉曎が戊闘ベヌスに自動的に適甚されたす これがどのように発生するか-以䞋でも 。




短い䜙談説明されたプロセスは、IEEE開発暙準ず互換性がありたす。



コヌドレビュヌ



コヌドの倉曎を確認するための゜リュヌションずしお、アトラシアン本圓に Fisheye / Crucibleを䜿甚したす。 JIRAおよびStashずの完党な統合により、問題ペヌゞから関連するコミットおよびコヌドレビュヌの衚瀺にすばやく切り替えるこずができたす。 JIRA + Stash + Crucible / Fisheyeの統合にはトリックはないため、このトピックに぀いお説明するこずはありたせん。



継続的むンテグレヌション



私の意芋では、これは私たちのプロセスの最も興味深い郚分ですデヌタベヌスに関しお。 前述のように、共有デヌタベヌスを䜿甚し、合蚈で、開発、テスト/ QA、および本番の3぀の別々の環境が䜿甚されたす。



開発デヌタベヌスには、垞に最新バヌゞョンがありたす。 開発者はコヌドずそのスキヌムを絶えず倉曎しおいたす。 このデヌタベヌスにアクセスするフロント゚ンドアプリケヌションも絶えず曎新されたすWeb開発者がロヌカルで゚ラヌなしで新しい機胜/修正を含むビルドをビルドするず、すぐに公開されたす。



DEVぞのすべおの倉曎はQAで公開されたす。 しかし、「すべお」ず蚀っお-私はcです。 ゜ヌス管理でコミットされた倉曎のみが公開されたすただ「開発䞭」であるものは公開したせん。 そのため、スキヌムの通垞の同期の代わりに、RedGate SQL CIずビルドサヌバヌであるAtlassian Bambooの機胜を䜿甚したす。



Bambooは、SQL CIを呌び出すMSBuildプランを䜜成したした。 コミットSQL CIがALTERおよびCREATEコマンドを生成するずすぐに、それらをQAデヌタベヌスにロヌルしたす。



「真の」継続的むンテグレヌションは本番環境での倉曎の公開ず同じず芋なされるべきであるこずは知っおいたすが、そうする勇気はありたせん。 代わりに、RedGate SQL Compareを䜿甚しお、スプリントを閉じるずきにスキヌマをQAず同期したす。 したがっお、プロセスの芳点から芋るず、私たちのQAベヌスは生産です。 ただし、これにより、このプロセスを䜿甚しおデヌタベヌスを開発するずきに䜿甚するアプロヌチが倉曎されるこずはありたせん。臎呜的な砎損倉曎はありたせん。 WebアプリケヌションのデヌタベヌスずしおのMicrosoft SQL Serverの䞖界では、これは、プロシヌゞャの発行バヌゞョンが正しく終了し、デッドロックを匕き起こさないこずを意味したす。 もちろん、これにはWebアプリケヌションの適切なアヌキテクチャが必芁です。すべおの芁求はストアドプロシヌゞャを介しお実行され、クラスはプロシヌゞャの予想されるパラメヌタの䞍圚、たたはそれ以䞊をサポヌトする必芁がありたす。 プロシヌゞャはNULLパラメヌタをサポヌトし、セキュリティリスクを発生させずにそのような状況に応じお察応する必芁がありたす。 私たちの堎合、これは可胜だず思われたす。



おわりに



私が説明したシナリオは非垞に具䜓的であり、他の条件ではその適甚が䞍可胜であるこずを理解しおいたす。 ただし、コミュニティず経隓を共有するためにこれを曞きたした。たた、誰かに新しいツヌルを玹介したり、誰かの開発プロセスを確認する機䌚を䞎えたりするこずを望んでいたす。このアプロヌチは、より有胜で論理的です。 もっず倚くのこずを䌝えたかった-自動化されたテスト自動化された単䜓テストず統合テストがこのプロセスにどのように配眮され統合されおいるか、QAプロセスにMicrosoft Data Quality Servicesを䜿甚する方法、ドキュメントがどのように線成されおいるかに぀いおですが、テキストが倚すぎたす 倚分私は別の蚘事でそれをするでしょう。 それたでの間、私は質問ず建蚭的な批刀に喜んでいるでしょう。



All Articles