1日でiOS開発者向けにCIを上げる方法。 パート2

みなさんこんにちは。 これは、 Live Typing iOS部門がCI方法論を実装し、サーバーを展開してJenkinsでのビルドを自動化する方法に関する記事の続きです。 約束したとおり、2番目の部分は、コードの基本的なメトリックを取得し、プロジェクトを.ipaにアーカイブし、Slackとの対話を構成する方法に専念します。



1.必要なすべてのプログラムとプラグインのインストール。



最初に、統計を収集するプログラムをインストールします。



#     brew install gcovr #   brew install cloc #  ,   brew install sloccount #   brew install pmd #     (    oclint) sudo gem install xcpretty #   brew tap oclint/formulae brew install oclint
      
      





次に、Jenkinsのプラグインをインストールする必要があります。これにより、受信した統計が人間が読める形式で表示されます。

  1. PMDプラグイン -統計コードの複雑さに関するレポート生成。
  2. SLOCCountプラグイン -コードの行数によるレポート生成。
  3. テスト結果分析プラグイン -テスト結果に応じたレポート生成。
  4. Coberturaプラグイン -テストによるコードカバレッジに関するレポート生成。
  5. DRYプラグイン -コードの複製に関するレポート生成。


補助プラグインもインストールします。

  1. 環境インジェクタープラグイン -プロジェクトでの変数の実装。
  2. Pre SCM BuildStep Plugin-ジョブ実行前の変数の実装。
  3. 承認トークンルートプラグインのビルド - トークンを使用してgetリクエストでジョブを開始します。
  4. パラメータ化されたトリガープラグイン -アセンブリの最後でパラメータを使用してジョブを実行できます。
  5. Slack Notification Plugin -Slackチームチャットにメッセージを送信します。
  6. SSHで公開 -このプラグインは例としてここにリストされています。 私たちのように、SFTPを介してサーバーにデータを送信する場合に適しています。


2. Slackチャットとの統合



Slackチームチャットでビルドステータスに関する通知を受け取るには、Slackの設定でJenkinsとの適切な統合を追加する必要があります。 ここでできます

統合を作成すると、一意のトークンが生成されます。これは、スクリーンショットの例のように、ジェンキンスの設定(または別のジョブの設定)に追加する必要があります。







次に、Slackの組み込みコマンドメカニズムを使用してアセンブリの起動を構成します。 最初に統合を追加する必要があります。 これを行うには、[カスタム統合]セクションの[スラッシュコマンド]サブセクションに移動し、[構成の追加]ボタンをクリックします。 ここでこの操作を実行できます

セットアップ時に、チームの名前を指定し、POSTデータ転送方法を選択して、リクエストの送信先URLを指定する必要があります。







リクエストのURLをより詳細に生成する例を考えてみましょう。 URLの例は次のようになります。



http://server:8080/buildByToken/buildWithParameters?job=JenkinsExecutor&token=XXXXXXXXXXXXXXXXX







コンポーネント別に分析してみましょう。

  1. serverは、サーバーの外部アドレスです。 必要に応じて、ここで目的のポート(この場合は8080)も示します。
  2. buildByTokenは、Build Authorization Token Root Pluginプラグインによって提供される機能です。 トークン(この場合はXXXXXXXXXXXXXXXXX)を使用して参照によりジョブを実行できます。
  3. buildWithParameters-パラメーター化されたアセンブリを実行する必要があることを示します。
  4. JenkinsExecutor-他のジョブを実行するために作成して使用するジョブの名前。 以下で説明します。
  5. XXXXXXXXXXXXXXXXXX-トークンの値。各トークンの構成のプラグイン設定で設定されます。


例として、次のコマンド構造を使用します。



/build Example test master







  1. / build-チームの名前。
  2. 例-job'aの名前;
  3. test-テストの実行とメトリック付きのレポートの作成に関連する補助フラグ。
  4. master-アセンブリ用のブランチ。


考慮された構成により、目的のブランチを示すプロジェクトのアセンブリを開始でき、単一のコマンド/ buildが使用されます。



3.補助ジョブ構成-JenkinsExecutor



他のジョブを実行するには、このジョブが必要になります。 ユーザーが存在しないプロジェクトを入力した場合にエラーを処理し、コマンドに関する情報を追加することもできます(一種のヘルプ)。

サーバーにアクセスして、JenkinsExecutorという名前の無料の構成で新しいタスクを作成します。 次に、ジョブ設定で、アセンブリがパラメーター化され、テキストパラメーターを受け入れることを示すフラグを設定します。 Slackでコマンドが起動されると、すべてのデータ(マスターテストの例)がテキスト変数の1行として送信されます。







次に、リモートでアセンブリを開始するフラグを設定します。 ここで、Slackのコマンド設定で設定したものと同一のトークンを指定する必要があります。







次に、テキスト変数から値を抽出する必要があります。 これを行うには、「アセンブリ」セクションに移動し、「シェルコマンドを実行する」アセンブリステップを追加します。 コマンド例:



 #    ,   IFS=' ' read -a array <<< "$text" #  ,   —    JOB_NAME=${array[0]} #,    TEST=${array[1]} #   BRANCH=${array[2]} # ,     : USER_NAME=${user_name} CHANNEL_NAME=${channel_name}
      
      





パラメータを使用してアセンブリを開始するには、特定のジョブを実行するためのPOSTリクエストを送信します。 これを行うには、前のシェルコマンドに次の行を追加します。



 curl -d TEST=${TEST} -d BRANCH=${BRANCH} -X POST \ -u username:password http://127.0.0.1:8080/job/${JOB_NAME}/buildWithParameters
      
      





ここで、パスワードはユーザー名ユーザーのAPIキーです(ユーザーにはジョブを実行する権限が必要です)。

キーを取得するには:

  1. Jenkins Webインターフェースの右上隅にあるユーザー名をクリックします。
  2. 画面の左側にある「構成」ボタンをクリックします。
  3. [APIキーの表示]をクリックします-希望のキーがあります。


実行中のすべてのアセンブリはパラメーター化する必要があることに注意してください!



4.ビルドのセットアップ



4.1。 ジョブを設定するときに最初に注意する必要があるのは、アセンブリをパラメーター化する必要があるということです。 これを行うには、適切なフラグを設定し、テキストパラメータBRANCHおよびTESTを追加して、デフォルトパラメータを設定します。





ここで、BRANCH変数には、デフォルト値を追加する必要があることに注意してください。 実際には、ブランチを指定せずにSlackからアセンブリを実行すると、BRANCH変数の値が空になるため、エラーが発生します。 これを行うには、「ビルド環境」セクションに「SCMを実行する前にビルドステップを実行する」フラグを追加します。 次に、「シェルコマンドを実行する」ステップと環境変数を挿入するステップを追加します。 例として行います:







4.2。 GitLabとの対話を構成します。

プロジェクトリポジトリのアドレスを指定します。 アセンブリブランチを指定します(この例では、BRANCH変数です)。







4.3。 Webフックアセンブリをセットアップします。

アセンブリトリガーで、フラグ「GitLabのプッシュでビルド」を設定します。 必要なパラメーターを追加し、トリガーを起動するブランチを示します。







次に、WebフックカテゴリのGitLabのプロジェクト設定で、JenkinsのサーバーにWebフックを追加します。







4.4。 ビルドフェーズは、ファイルが更新された場合にPodをインストールするシェルコマンドの実行から始まります。



 if [ $(( $(date +"%s") - $(stat -f %m Podfile) )) -le 60 ]; then pod install fi
      
      





次に、便宜上、プロジェクトにいくつかの変数を設定し、それらをファイルに書き込みます。



 # .ipa- PROJECT_NAME="Example" #  .xcworkspace WORKSPACE_NAME="Example" #   SCHEME_NAME="Example" #   .        FOLDER_NAME_WITH_CODE="Example" #   ,       echo PROJECT_NAME=$PROJECT_NAME > build.properties echo WORKSPACE_NAME=$WORKSPACE_NAME >> build.properties echo SCHEME_NAME=$SCHEME_NAME >> build.properties
      
      







TESTパラメーターセットに応じて、テストフェーズとレポート生成を開始またはスキップします。 これがどのように見えるかの例:



 if [ "$TEST" == "test" ]; then #  reports,       if [ ! -d "reports" ]; then mkdir "reports" fi #      xcodebuild -workspace ${WORKSPACE_NAME}.xcworkspace \ -scheme ${SCHEME_NAME} \ -configuration Debug \ -sdk iphonesimulator \ -destination 'platform=iOS Simulator,name=iPhone 6' \ -IDECustomDerivedDataLocation="build_ccov" \ GCC_GENERATE_TEST_COVERAGE_FILES=YES \ GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES \ clean test | xcpretty -r junit -o reports/junit.xml -r json-compilation-database -o compile_commands.json #Publish JUNIT test = **/reports/junit.xml #    oclint-json-compilation-database -v -e Pods -- \ -rc=LONG_LINE=200 \ -rc=NCSS_METHOD=60 \ -rc=LONG_METHOD=100 \ -rc=MINIMUM_CASES_IN_SWITCH=1 \ -report-type pmd \ -o reports/oclint.xml \ -max-priority-1 1000 \ -max-priority-2 1000 \ -max-priority-3 1000 #Publish PMD analysis = **/reports/oclint.xml #    gcovr --object-directory="build_ccov/${SCHEME_NAME}/Build/Intermediates/${SCHEME_NAME}.build/"\ "Debug-iphonesimulator/${SCHEME_NAME}.build/Objects-normal/x86_64/" \ --xml \ --print-summary \ --exclude '.*Tests.*' \ --exclude '.*Libs.*' \ --exclude '.*ExternalFrameworks.*' \ --exclude '.*Platforms.*' \ --output=reports/coverage.xml #Publish Cobertura Coverage = **/reports/coverage.xml #   ( ): cloc ${WORKSPACE}/${FOLDER_NAME_WITH_CODE} -by-file -skip-uniqueness -xml -out=${WORKSPACE}/reports/cloc.xml #Publish SLOCCount analysis = **/reports/cloc.xml sloccount --duplicates --wide --details ${WORKSPACE}/${FOLDER_NAME_WITH_CODE} -v > reports/sloccount.sc #Publish SLOCCount analysis = **/reports/sloccount.sc #   pmd cpd --files ${WORKSPACE}/${FOLDER_NAME_WITH_CODE} \ --minimum-tokens 10 --language objectivec \ --encoding UTF-8 \ --format net.sourceforge.pmd.cpd.XMLRenderer | iconv -f macRoman -t utf-8 | sed 's/MacRoman/UTF-8/g' > reports/duplicated-code.xml #Publish duplicate code = **/reports/duplicated-code.xml else touch reports/junit.xml #  ,      -    Publish JUNIT test result report fi
      
      





コマンド構文の詳細については、対応するドキュメントページを参照してください。

  1. オクリント
  2. Gcovr
  3. クロック
  4. SLOCount
  5. PMD(CPD)
  6. Xcodeビルド


4.5。 以前に作成した変数は、ビルドプロセスに埋め込む必要があります。 これを行うには、Inject環境変数アセンブリステップを追加し、目的のパスを指定します。





4.6。 次の手順では、アセンブリを作成し、それを.ipaファイルにアーカイブします。 これを行うには、Xcodeプラグインを使用します。 例として行います:









4.7。 最後の手順は、アセンブリ後の操作を追加することです。

5つのレポート用のファイルを生成しました。次に、これらのファイルを適切なプラグインに転送する必要があります。

  1. PMD分析結果の公開= ** / reports / oclint.xml
  2. 重複コード分析結果の公開= ** / reports / duplicated-code.xml
  3. Coberturaカバレッジ分析結果の公開= ** / reports / coverage.xml
  4. SLOCCount分析結果の公開=使用するモジュールに応じて:

    1. ** /レポート/ cloc.xml
    2. ** /レポート/ sloccount.sc
  5. JUNITテスト結果レポートの公開= ** / reports / junit.xml( :プラグインの詳細設定では、空のテスト結果でビルドを失敗しないフラグを設定する必要があります。 )


この段階で、受信した.ipaファイルを必要な場所(サーバー、電子メールなど)に送信できます。 SFTP経由でサーバーにファイルを送信する場合、Publish Over SSHプラグインを使用する場合は、「ビルド環境」セクションに移動し、ビルドの実行後にファイルを送信するためのフラグを設定するか、SSH経由でコマンドを実行し、要件に従ってプラグインを構成する必要があります



追加する必要のある最後のステップはSlack Notificationです。これは、ご想像のとおり、Slackに通知を送信します。 プラグインの詳細設定では、現在のジョブの個々の設定を指定できます。 メッセージとして変数(例:$ MESSAGE)を指定できることに注意してください。変数の値は、アセンブリのさまざまな段階で変更する必要があり、それによりSlackにより有益なメッセージを送信できます。



これで、CIの実装は完了したと見なすことができます。 この記事がお役に立てば幸いです。また、コメントで質問、意見、コメントを共有してください。



All Articles