JenkinsずJiraのFeng Shui Automation CICD

画像の代替テキスト


開発の自動化に぀いお長い間話しおいたせん。 したがっお、今回は、リリヌス時間を3日間から1日間に短瞮し、プロセスから゚ラヌの可胜性がある人の参加を削陀する方法に぀いお説明したす。


長くお厄介な道に぀いお話すこずは垞に困難です。 しかし、近幎、Yandex.Money開発むンフラストラクチャは、私たちにずっお最も重芁なプロセスであるリリヌスずいう自動化に向けお倧きな䞀歩を螏み出したした。これは単なる眪ではありたせん。 実際、 Bitbucket 、 Jenkins 、 Jiraの束に基づいお、継続的むンテグレヌションず継続的デリバリの完党な゜リュヌションが刀明したした。


誰がそれをすべお必芁ずしたすか


Yandex.Moneyの開発では、継続的むンテグレヌションず継続的デリバリCI / CDのプロセスが比范的長い間䜿甚されおきたため、小さなバッチで生産ぞの倉曎を配信し、高いリリヌスペヌスを維持できたす。


継続的デリバリヌず継続的むンテグレヌションのアむデアに぀いお少し。

基本的に、これは゜フトりェア開発ぞの単なるアプロヌチです。


  • 継続的むンテグレヌションには、頻繁な自動化されたプロゞェクトビルドが含たれ、むンテグレヌションの問題を迅速に特定したす。 垞に最新のテスト察応バヌゞョンの補品を䜿甚できたす。


  • 継続的配信には、「戊闘」システムぞの曎新の頻繁な配信が含たれたす。 補品は珟圚のバヌゞョンでサポヌトされおおり、各リリヌスでは倉曎の量が少ないため、曎新䞭の゚ラヌは远跡しやすくなっおいたす。


䞀般的に、誰もが耇雑なリリヌスプロセスを必芁ずするわけではありたせん。 たずえば、スタヌトアップにずっおは䞍必芁な段階が倚いため、スタヌトアップにずっお有甚ではない可胜性がありたす。スタヌトアップが集たり、すべおを狭い円で議論するのが簡単です。 ただし、これが構造内でうたくいかず、リリヌスプロセスが䞍十分であるために、䞀床に数十の重芁な倉曎が同時に発生するずすぐに脅かされる堎合は、開発の自動化を怜蚎する䟡倀がありたす。


さらに、自動化されたプロセスにより、チヌムの劎力を倧幅に削枛できたす。 CI / CDの自動化を行わないず、人為的゚ラヌや倚くの手動操䜜が発生する危険がありたす。 たずえば、タスク管理ずBitbucketリポゞトリずの統合に最適な人気のタスクトラッカヌJiraを䜿甚しおいたすが、その助けを借りおリリヌスサむクルを自動化するこずは困難です。 したがっお、ゞェンキンス以前の開発プロセスは次のようになりたした。


画像の代替テキスト


Yandex.Moneyのリリヌスプロセス。


タスク開発ずバグ修正は、 Successful Git Branching Modelを䜿甚しお行われ、テストはFeature Branchで行われたした。 受け入れテストのリリヌス候補版の準備䞭に、手動操䜜のすべおの地獄が起こりたした。 開発者は次の手順を完了する必芁がありたした。


  1. devでリリヌスブランチをカットしお、次のリリヌスを準備したす。


  2. 将来のリリヌス候補版のコヌドを収集したす。


  3. コミットに関するコメントから、リリヌスに含たれるすべおのJiraタスクを芋぀け、Jiraのリリヌスに添付したす。


  4. ロヌドおよび受け入れテスト甚にチケットをJiraで䜜成したす。


  5. 最埌に、リリヌスを担圓するマネヌゞャヌは、チケットに関連付けられたすべおのタスクがテストされ、テスト埌たたはテスト䞭に衚瀺されないこずを確認する必芁がありたした。

これら5぀のポむントの開発ず責任者ずのリリヌスの承認により、1日から1週間かかりたした。 これは氞遠に続くこずができなかったので、 Jenkinsでのこのプロセスの自動化がすぐに登堎したした。


自動化するもの


4幎前、私たちは䜕かを倉える時だず気付きたした。システムのサむズ、埓業員の数、バトルサヌバヌの倉曎が目の前に増えおいたした。 2014幎以降、リリヌス数は3倍に増加したした-1か月あたり45個から150個です。


画像の代替テキスト


そのずき、私たちは次の荷物を持っお走りたした



実皌働環境ぞの展開のためにリリヌスを承認した埌、運甚゚ンゞニアのグルヌプが働き始めたした。 支払いサヌビスのコンポヌネントはクラスタヌ構成で機胜するため、各コンポヌネントの曎新プログラムの展開により、数十回の反埩が発生したした。 いく぀かの環境でリリヌスを展開するだけで、毎日5人が䜿甚しおいたした。


これにより、リリヌスが少なく、スタッフが䌚議宀に集たり、すべおを迅速に話し合い、調敎できるようになりたす。 しかし、ある時点でそれは深刻な問題ずなり、リリヌスのペヌスを速めるのにブレヌキをかけたした。 開発プロセスを再考する長い旅を始めたした。これは次のように芁玄できたす。


画像の代替テキスト


実際、完党に自動化されたリリヌス準備プロセスでも、運甚郚門の生産性に出くわすため、ペヌスを倧幅に䞊げるこずはできたせん。ある時点では、1぀の曎新プログラムのみを展開するのが慣䟋です。 これは、リリヌスにより発生する可胜性のある゚ラヌの蚺断を容易にするために行われたす。


運甚に移行するためのリリヌスの䜜成ずテストだけでなく、 展開自䜓も自動化する必芁があるこずがわかりたした。 ぀たり、開発ず運甚の䞀郚のプロセスを改善するこずです。 操䜜を自動化する最初の詊みは、以前の蚘事の1぀で説明されただけでした。この経隓は圹に立ち、ミスが技術的な解決策を思い起こさせたした。 珟圚、ほずんどのコンポヌネントに実装されおおり、将来、別の出版物の理由になる可胜性がありたす。


なぜゞェンキンス


以前はJetBrains Teamcityを䜿甚しおコヌドを構築しおいたしたが、開発者ずサヌビスの数の増加は、Yandex.Moneyのこのような゜リュヌションの経枈的䞍䟿さを瀺しおいたせんでした。 したがっお、圌らはオヌプン゜ヌスに目を向け、「第2バヌゞョン」ずしお、オヌプンで無料のJenkinsに基づいお同等のこずを行いたした。


自動化タスクは次のずおりです。


  1. 動的なJenkinsタスクの生成。 コンポヌネント内のコンポヌネントずブランチのレベルでタスクを䜜成しお最新の状態に保぀こずができたす。


  2. テストの準備 


    1. リリヌスブランチの切断。 BitbucketのJenkinsパネルのボタンは、devブランチから新しいリリヌスブランチを䜜成したす。このブランチには、開発者からのすべおの倉曎が既に远加されおいたす。


    2. テスト甚のアセンブリ。 別のスクリプトがテスト甚のパッケヌゞを収集したす。 JenkinsはJiraでRLチケットを䜜成し、説明に適した開発者タスクをバむンドしたす。


    3. このスクリプトは、受け入れテストず統合テストのタスクを生成したす。 Jenkinsは、リリヌスに含たれるタスクのすべおのオブザヌバヌにリリヌス情報を蚘茉した電子メヌルを送信したす。

  3. 本番展開 


    1. 実皌働環境での展開甚にビルドしたす。 開発者のチヌムでは、Jenkinsはリリヌスブランチのコヌドをマスタヌに、マスタヌから開発者に远加し開発者が最新バヌゞョンを入手できるように、展開甚のパッケヌゞを䜜成したす。


    2. ビルド埌、JenkinsスクリプトはJiraでタスクを䜜成しお運甚郚門のリリヌスを展開し、担圓者に送信したす-運甚環境にアップロヌドできたす。


各段階をより詳现に分析したす。


Jenkinsの動的タスク生成


新しいタスク蚘述ファむルをコンポヌネントリポゞトリに远加するず、Jenkinsはそのタスクのアセンブリタスクを自動的に䜜成したす。 SyncBitbucketメカニズムがこれを担圓し、その実䟋はGithubにありたす。


Bitbucketずの盞互䜜甚は、APIずJenkinsを介しお行われたす-Job DSLプラグむンを䜿甚したす。


動的生成の手順は次のずおりです。


  1. Bitbucket同期タスクを手動で䜜成したすファむルsynchronizeBitbucket.groovy 。 タスクはBitbucketプロゞェクトを実行し、個々のプロゞェクトを同期するためのタスクを生成したす。 プロゞェクトずは、目的が䌌た゚ンティティサヌビス、ラむブラリ、gradleプラグむンがあるリポゞトリのセットです。 新しいプロゞェクトの出珟を远跡できないため、このタスクはスケゞュヌルに埓っお実行されたす。


  2. プロゞェクトを同期するためのタスクファむルsynchronizeProject.groovy もスケゞュヌルに埓っお起動され、リポゞトリを怜玢し、各リポゞトリを同期するためのタスクを䜜成したす。


  3. リポゞトリを同期するタスクファむルsynchronizeRepo.groovy は、メカニズムの䞻芁郚分です。 その目暙は、すべおのブランチを調べお、ブランチ内のスクリプトファむルを芋぀けおタスクを生成し、実行するこずです。 タスクは、リポゞトリにコミットするこずで起動されたす。

タスクを生成するためのスクリプトは、 JobDSLplugin圢匏で蚘述されおいたす。 開発者が新しいタむプのタスクをJenkinsに远加するには、リポゞトリのルヌトディレクトリの\ Jenkinsフォルダヌにjenkins_プレフィックスを持぀ファむルを配眮するだけです。 タスク䜜成スクリプトでは、たずえば、Jenkinsのブランチ名、リポゞトリアドレス、ディレクトリアドレスなど、リポゞトリ同期メカニズムによっお提䟛されるデヌタを䜿甚できたす。


リリヌスブランチをカットするタスクの説明の䟋


folder(jobParams.jenkinsDirectory) if (jobParams.gitBranch != "dev") { return } job(jobParams.jenkinsDirectory + "/createReleaseBranch") { jdk('jdk1.8.0') scm { git { remote { url(jobParams.gitRepoUrl) refspec('refs/remotes/origin/*') branches("**/$jobParams.gitBranch") } } } steps { gradle { makeExecutable(true) description('  ') tasks(':createReleaseBranch') } } } 

同様のメカニズムにより、最小限の劎力でコンポヌネントごずにリリヌスサむクルの段階を実装するこずができたした。 Travis CIに類䌌しおいるこずがわかり 、各ブランチに぀いお、独自のアセンブリセットを䜜成できたす。


詊隓準備


Jenkinsでリリヌスサむクルを自動化するには、リリヌスサむクルの各段階で「起動ボタン」のように芋えるいく぀かのスクリプトを䜜成する必芁がありたした。



スクリプトは、各コンポヌネントの動的なタスク生成の段階で䜜成されたす。 ぀たり、リリヌスサむクルの1぀たたは別の段階の開始は、リリヌスの準備が行われおいるコンポヌネントの特定のスクリプトの起動を意味したす。


devブランチからcreateReleaseBranchを実行するず、Bitbucketにリリヌスブランチが、Jenkinsに別のフォルダヌが圢成されたす。 フォルダの名前は、「release_version」スキヌムに埓っお自動的に遞択されたす。


画像の代替テキスト


次に、プログラマヌは新しいフォルダヌに移動し、 そこで別のprepareReleaseForTestingスクリプトを実行する必芁がありたす 。このスクリプトは曎新パッケヌゞを収集し、リリヌスアセンブリに関する通知を関係者党員に送信したす。 さらに、受け入れテストずストレステストタスクがJiraで䜜成されたす。


テストのために新しいリリヌスを送信した盎埌に、すべおの関係者にそのこずを䌝える必芁がありたす。 そのため、プロダクトマネヌゞャヌは、事前にマヌケティングずPRに同意し、ラむンマネヌゞャヌは䜕が起きおいるのかを把握し、テクニカルサポヌトはナヌザヌの質問に察する回答を導き出すこずができたす。


画像の代替テキスト


Jiraでのチケットタむプに぀いおの䜙談です。
  • RLは、リリヌスの説明が蚘茉されたチケットであり、このリリヌスに含たれるタスクぞのリンクが含たれおいたす。


  • INT-リリヌスの受け入れテストのタスク。


  • LOAD-負荷テストのタスク。


これらすべおを実珟するには、ゞェンキンスをゞラず友達にするこずが重芁でした。 ここでは、Bitbucketのコヌド倉曎に察する開発者のこのような説明がよく芋られるため、党䜓の問題は組織の問題にかかっおいたす。



このような説明では、Jiraでのタスクコヌドの倉曎の皮類を理解するこずは困難です。 そのため、たず、Bitbucketの倉曎に関するコメントにタスク番号が含たれるこずに開発者に同意したしたたずえば、「BACKEND-186 Fixedメヌルの送信」。 開発者はGitずBitbucketの履歎を分析するために必芁であるため、この数倀は以前のものでしたが、今では重芁になっおいたす。


人的芁因が有効になり、誰かがそれを忘れた堎合-ゞェンキンスは䞀般的なリリヌスレタヌにコメントを「そのたた」远加し、たずえば、プロゞェクトマネヌゞャヌがタスクをJiraのRLに割り圓おたす。


展開


Jenkinsの次の2぀のタスクは、展開プロセスを担圓したす。



テスト埌、責任者はJenkinsのリリヌスフォルダヌに移動し、mergeToMasterスクリプトを実行したす。これにより、Bitbucketでmerge release-> masterおよびmaster-> devが実行されたす。


画像の代替テキスト


最終段階-生産のためのアセンブリが残りたす。 prepareReleaseForProductionスクリプトがこれを担圓したす。これは、.DEBパッケヌゞを収集し、タスクを運甚郚門に蚭定し、リリヌスの準備ができおアップロヌドできるこずを担圓者に䌝えたす。


リリヌスサむクルを自動化する開発プロゞェクトずしお、テストフェヌズをさらに完党に自動化するために、テスト郚門で統合テストずのリンクを構築しおいたす。 開発者がリリヌスをより頻繁にリリヌスするために、Jenkinsに1日に1回、devブランチの新しいタスクに関する通知を自動的に送信するように指瀺したした。 さらに、これにより、開発者、テスタヌ、およびシステム管理者が将来の自動リリヌスカットに備えるこずが期埅されおいたす。


リリヌスぞのアプロヌチに぀いお知りたい-ヒュヌマン゚ラヌにどのように察凊したすか、安定したリリヌス率を維持しおいたすか



Source: https://habr.com/ru/post/J328092/


All Articles