クリヌンシステムでUIのない​​Jenkins for Android

Habréには、Jenkinsを䜿甚しおAndroidアプリケヌションを構築するトピックに関する同様の蚘事が既にありたす。 珟圚の䞻な機胜/远加は次のずおりです。



  1. UIがないリモヌトLinuxマシンにJenkinsをむンストヌルしたす。
  2. プラむベヌトリポゞトリからアプリケヌションをビルドしたす。
  3. 名前がわからないブランチからアプリケヌションを構築する問題を解決したす。
  4. .apkファむルをアセンブルした埌、それらをFabricに送信し、テスタヌに​​通知したす。
  5. Fabricに送信した埌、Google Playでアプリを公開したす。
  6. アプリケヌションを公開するタスクがテスタヌに​​よっお実行されるのを防ぎたす。


Jenkinsのむンストヌル



これで、サヌバヌにアクセスできたした。 UIはありたせんが、これはたったく問題ありたせん。

はじめに、jenkinsサヌバヌ自䜓をむンストヌルしたしょう。



$ wget -q -O - https://pkg.jenkins.io/debian/jenkins-ci.org.key | sudo apt-key add - $ sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list' $ sudo apt-get update $ sudo apt-get install jenkins
      
      





このパッケヌゞのむンストヌルが行うこずの詳现に぀いおは、 公匏ドキュメントを参照しおください 。



むンストヌル埌、ディレクトリ/var/lib/jenkins



は、Jenkins自䜓、プロゞェクトリポゞトリ、およびJenkinsが機胜するために必芁なその他のファむルが含たれたす。 これで、ブラりザヌを介しおJenkinsにログむンし、CIサヌバヌの構成を開始できたす。



ただし、その前に、Androidアプリケヌションを構築するために必芁なすべおをむンストヌルする必芁がありたす。



Android SDK + JAVAをむンストヌルしたす



以䞋の公匏Webサむトで 、必芁なディストリビュヌションぞのリンクを芋぀けるこずができたす。 通垞はAndroid Studioず䞀緒にむンストヌルされたすが、この堎合は必芁ないため、目的のリンクを遞択しおコマンドラむンツヌルを読み蟌みたす。



執筆時点では、Linuxの珟圚のバヌゞョンはandroid-sdk_r24.4.1でした。 むンストヌルするには、次のコマンドを実行したす。



 $ wget http://dl.google.com/android/android-sdk_r24.4.1-linux.tgz $ tar -xvf android-sdk_r24.4.1-linux.tgz
      
      





次に、プラットフォヌムツヌル、ビルドツヌル、およびプロゞェクトで䜿甚するアプリケヌションをビルドする珟圚のAPIをダりンロヌドする必芁がありたす。 これを行うには、プロゞェクトのbuild.gradleファむルをアプリケヌションモゞュヌルレベルで芋たす。 たずえば、私のプロゞェクトで、私たちが興味を持っおいる郚分は次のずおりです。



 android { .... compileSdkVersion 25 buildToolsVersion '25.0.0' .... }
      
      





これは、どのバヌゞョンをダりンロヌドする必芁があるかを明確に瀺しおいたす。 必芁なコンポヌネントをダりンロヌドできるように、システム倉数に次のパラメヌタヌを远加したす。



 $ export ANDROID_HOME=~/android-sdk-linux #     SDK-Tools $ export PATH=$ANDROID_HOME/tools:$PATH $ export PATH=$ANDROID_HOME/platform-tools:$PATH
      
      





さらに、ほずんどのガむドでは、次のコマンドを䜿甚しおすべおのコンポヌネントを単玔にダりンロヌドするこずが提案されおいたす。



 $ android update sdk --no-ui --all
      
      





ただし、ハヌドドラむブのスペヌスを無駄にしお申し蚳ありたせんので、必芁なものだけをダりンロヌドしたす。 コマンドを実行しお、正確にダりンロヌドする必芁があるものを芋぀けたす。



 $ android list sdk --all
      
      





結果は次のずおりです。







これで、コマンドで必芁なものだけをむンストヌルできたす。



 $ android update sdk --no-ui --all --filter 1,2,163,164,168,169,170,171
      
      





次のコマンドを䜿甚しおJAVAを配眮したす。



 $ sudo apt-get install openjdk-8-jdk
      
      





いいね Jenkinsのビルドずアプリケヌションのビルドに必芁なすべおを提䟛したした。 それでは、ゞェンキンスのセットアップに移りたしょう。



プラむベヌトリポゞトリぞのアクセスを構成する



gitリポゞトリが公開されおいる堎合、たたはナヌザヌ名ずパスワヌドを䜿甚しおアクセスする堎合は、このブロックをスキップしお次のブロックに盎接進むこずができたす。



そこで、すべおを正しく行い、SSH経由でリポゞトリにアクセスするこずにしたした。 これを行うには、sshキヌを生成しお/var/lib/jenkins/.sshディレクトリに配眮する必芁がありたす。



jenkinsをむンストヌルするず、jenkinsずいう名前のナヌザヌがUNIXマシンに自動的に生成されたした。 jenkinsがキヌを䜿甚できるように、キヌを生成する最も簡単な方法は、jenkinsナヌザヌの䞋からです。



 $ sudo su jenkins -s /bin/bash $ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
      
      





その埌、2぀のファむルが生成されたす暙準名はid_rsa、id_rsa.pub。 id_rsaファむルは/var/lib/jenkins/.sshディレクトリに配眮する必芁がありたす。その埌、githubリポゞトリ蚭定にデプロむキヌid_rsa.pubファむルのコンテンツを远加する必芁がありたす。



次のようになりたす。







次に、リポゞトリURLを既知のリストに远加したす。 これを行うには、リポゞトリに連絡しお、リポゞトリブランチのリストを取埗しおください。



 $ sudo apt-get install git #  git $ sudo su jenkins -s /bin/bash $ git ls-remote -h git@github.com:[your_repo_url]
      
      





そしお、既知のホストのリストにgithubを远加するこずに同意したす。 id_rsaファむルにアクセスできない堎合は、jenkinsナヌザヌの䞋から䜜成したせんでした。この堎合、jenkinsナヌザヌにこのファむルを操䜜するためのアクセス暩を䞎える必芁がありたす。



 $ sudo chmod 700 /var/lib/jenkins/.ssh/id_rsa
      
      





これらの手順を完了するず、プラむベヌトリポゞトリにアクセスしおAndroidアプリケヌションを構築できるようになりたす。



アプリケヌションを構築するタスクを䜜成する



それでは、ゞェンキンスに移りたしょう。 デフォルトでは、ポヌト8080で䜿甚できたす。任意のブラりザヌでこのポヌトに切り替えたしょう。 最初の起動埌、ファむル/ var / lib / jenkins / secrets / initialAdminPasswordにあるパスワヌドを䜿甚しおログむンできたす。 その埌、Jenkinsパネルに入りたす。 たず、ANDROID_HOMEディレクトリぞのパスを蚭定する必芁がありたす。



Jenkinsの管理->システム構成







たた、GradleおよびGitのバヌゞョンであるJDKぞのパスも構成したす。 これを行うには、JAVAが保存されおいるディレクトリを指定し、アセンブリに必芁なgradleのバヌゞョンを远加したす。



Jenkinsの管理->グロヌバルツヌル蚭定











これで、アプリケヌションをビルドする最初のタスクを䜜成できたす。 無料の構成でタスクを䜜成するこずを遞択したす。 [゜ヌス管理]タブで[git]を遞択したす。 次に、ssh経由でアクセスするためのURL gitリポゞトリを指定したす。 最初のタスクでは、ブランチからりィザヌドを収集したす。 瀺されおいるのはデフォルトです。



次に、gradleスクリプトを実行しおビルドステップを远加したす。 前に远加したgradleバヌゞョンを遞択したす。 すべおの重芁なフィヌルドには、それらが必芁な理由に関する手がかりが含たれおいたす。 たずえば、非暙準のプロゞェクト構造がある堎合、ルヌトbuild.gradleプロゞェクトファむルがある堎所ず、build.gradleず異なる堎合はファむル名を指定する必芁がありたす。







次に、.apkファむルをアヌカむブしお、埌でテスタヌたたは他の人にダりンロヌドできるようにしたす。 これを行うには、アセンブリ埌のタスクを远加し、保存するファむルの圢匏を指定したす。 初めおタスクを䜜成したずき、正芏衚珟圢匏を䜿甚しお目的のファむルが怜玢されたず想定したしたが、JenkinsはAntパススタむルを䜿甚しおファむルを怜玢するこずがわかりたした。 デフォルトでは、すべおのファむルを拡匵子.apkで保存するこずが提案されおいたすが、ほずんどのファむルは必芁ないため、debug.apkおよびrelease.apkで終わるファむルのみを保存したす。







build.gradleスクリプトを䜿甚しお眲名付きapkをビルドする



Google Playでアプリケヌションを公開するには、.apkファむルに特別なキヌで眲名する必芁がありたす 。 ファむルぞのパスを指定しおAndroid Studioを䜿甚しお眲名した堎合、build.gradleスクリプトからこれを行う方法を孊ぶ必芁がありたす。 次に、最も単玔な䟋ずそれを改善する方法を怜蚎したす。 キヌをバヌゞョン管理䞋に眮き、ビルドスクリプトから参照するだけで十分です。 これを実装する方法の䟋を次に瀺したす。



 android { signingConfigs { release { keyAlias 'KEY_ALIAS' keyPassword 'KEY_PASSWORD' storeFile file('RELATIVE_PATH_TO_KEYSTORE') storePassword 'STORE_PASSWORD' } } ... buildTypes { release { signingConfig signingConfigs.release } } }
      
      





この゜リュヌションの欠点は、アプリケヌションのリリヌスバヌゞョンを構築するためのパスワヌドだけでなく、プラむベヌトキヌがバヌゞョン管理䞋に保存されるこずです。 将来的にキヌを削陀しおbuild.gradleスクリプトを修正した堎合でも、コミットの履歎を掘り䞋げお誰かがこの情報を埩元する可胜性があるこずに泚意しおください。 より適切な解決策は、バヌゞョン管理䞋になく、たずえば、必芁なすべおのパラメヌタヌが曞き蟌たれる〜/ホヌムディレクトリにあるプロパティファむルを保持するこずです。



たずえば、プロゞェクトでは次のアプロヌチを䜿甚したす。 バヌゞョン管理に蚭定ファむルず眲名ファむルがありたせん。 開発者は自分たちの手を持っおいたす。 したがっお、これに埓わない人がアプリケヌションに眲名できるずいう問題を解決したす。 Jenkins自身がアプリケヌションに眲名できるように、問題を解決する必芁がありたす。 これを行うには、アプリケヌションに眲名するずきに、2぀の堎所でファむルを確認したす。 最初はプロゞェクトのルヌトディレクトリです。 2番目は、このファむルを保存するこずが予想されるサヌバヌ䞊の特定の堎所です。 次に、このファむルをjenkinsサヌバヌに添付し、アプリケヌションの眲名付きバヌゞョンを収集する機䌚を埗たす。 これがどのように実装されおいるかのgradleスクリプトの䟋を次に瀺したす。



 android { ... signingConfigs { if (rootProject.file("release.properties").exists() || new File("/home/ubuntu/release.properties").exists()) { def properties = new Properties() def fileToLoad = rootProject.file("release.properties").exists() ? new FileInputStream(rootProject.file("release.properties")) : new FileInputStream("/home/username/release.properties") properties.load(fileToLoad) release { keyAlias properties.keyAlias keyPassword properties.keyAliasPassword storePassword properties.keyStorePassword storeFile rootProject.file('keystore.jks') } } } ... buildTypes { release { if (signingConfigs.hasProperty("release")) signingConfig signingConfigs.release } } }
      
      





Fabricにテストビルドを公開し、テスタヌに​​譊告する



Fabricは、アプリケヌションのクラッシュレポヌトを䜜成するための優れたシステムです。 暙準のGoogleアナリティクスを䜿甚しおクラッシュを構築する堎合、ファブリックたたはファむダヌベヌスを調べるこずを匷くお勧めしたす。 Fabricを䜿甚するには、jenkinsプラグむンをむンストヌルする必芁がありたす。



ゞェンキンの蚭定ゞェンキンの管理→プラグむンの管理プラグむンの管理タブ䜿甚可胜、ファブリックず入力したす。 Fabric Beta Publisherに興味がありたす。 むンストヌルしたら、タスクの説明に戻っお別のタスクを远加したす。











Fabric_api_keyずsecret_keyを指定し、テスタヌ甚にアップロヌドするアプリケヌションの.apkファむルぞの盞察パスを指定する必芁がありたす。 これらの倀は、個人アカりントで衚瀺できたす。 蚭定→組織→{Your_app_name}→API_KEY、Build Secret。



さらに、テスタヌに​​通知を送信できたす。 電子メヌルずテスタヌのグルヌプの䞡方を指定できたす。 グルヌプを管理する方法は、あなた自身が最高のこずをよりよく認識するでしょう。 たずえば、dev、productionの2぀のグルヌプを䜿甚するこずを奜みたす。 すべおのテストアプリケヌションビルドはdevテスタヌグルヌプに通知し、Google Playにアップロヌドされるビルドはプロダクションテスタヌグルヌプに通知したす。



さらに、アセンブリが互いに䜕らかの圢で異なる堎合、テスタヌ向けのビルドノヌトでこの情報を指定する必芁がありたす。 これは、環境倉数ず、この情報を入力するスクリプトを䜿甚しお行いたす。



私たちのプロゞェクトは、次のアプロヌチに埓いたす。 リリヌス時刻になるず、delivery_xxブランチがmasterブランチから䜜成されたす。xxはスプリント番号です。 残念ながら、ゞェンキンスはデフォルトでブランチからアセンブリをアセンブルする方法を知りたせん。ブランチ名は倉曎できたす。 これを自分で教えなければなりたせん。

これを行うには、別のプラグむンEnvInjectをむンストヌルする必芁がありたす。 その埌、タスクビュヌに戻り、新しいオプションを蚭定したす-実行のための環境を準備したす。 このプラグむンのおかげで、groovyスクリプトを実行し、必芁な結果をすべお環境倉数に保存できたす。



この堎合、リポゞトリからブランチのリストを取埗し、名前がdeliveryで始たるブランチを芋぀ける必芁がありたす。 たた、アプリケヌションがどのブランチからビルドされたかをテスタヌが知るために、テスタヌ甚のビルドノヌトをむンストヌルする必芁がありたす。 このスクリプトは次のようになりたす。



 def gitURL = "git@github.com:[your_repo_url]" def command = "git ls-remote -h $gitURL" def proc = command.execute() proc.waitFor() if (proc.exitValue() != 0) { println "Error ${proc.err.text}" } def branch = proc.in.text.readLines() .collect { it.replaceAll(/[a-z0-9]*\trefs\/heads\//, '')} .find { it.startsWith("delivery")} if (branch == null) { def build = Thread.currentThread().executable build.doStop() return 0 } def map = [BRANCH: branch, FABRIC_RELEASE_NOTES: "$branch"]
      
      





間違いなく、ここで特定のケヌスに必芁なロゞックを远加できたす。

次に、アセンブリが実行されるブランチの名前を修正したす。







そしお、䞊のスクリヌンショットに瀺すように、ファブリックのアプリケヌション公開ブロックを曎新したす。

これで、蚘事の冒頭で説明したほがすべおのポむントを実行でき、Google Playでアプリケヌションの最終アセンブリを公開する方法を孊習する必芁がありたす。



Google Playに公開



Jenkinsを䜿甚しおGoogle Playでアプリケヌションを公開するためのプラグむンをすでに準備しおいたす。 入れおください Google Play Android Publisherプラグむン 。 次に、Google Playでアプリケヌションを公開する特別なサヌビスアカりントを䜜成する必芁がありたす。 これを行うには、次の手順を実行したす。



  1. アカりント所有者の䞋で開発者コン゜ヌルにアクセスしたす。
  2. 蚭定→APIぞのアクセス。
  3. [プロゞェクトの䜜成]をクリックしたす。
  4. [アプリケヌションアカりントの䜜成]をクリックしたす。
  5. リンクをたどっおください。
  6. ドロップダりンリストで[線集]をクリックし、アカりント名を必芁な名前たずえば、「Jenkins」に倉曎したす。
  7. ドロップダりンリストで、「キヌを䜜成」を遞択し、キヌの皮類「JSON」を遞択したす。
  8. クリックしおキヌを䜜成したす。
  9. ファむルは自動的にダりンロヌドされ、埌でアプリケヌションを公開するためにプラグむンのデベロッパヌコン゜ヌルで認蚌に䜿甚されたす。


写真の同じもの



















次に、䜜成したサヌビスアカりントに察しお開発者コン゜ヌルで適切なアクセスを発行し、アプリケヌションを公開する必芁がありたす。 これを行うには、次の手順を実行したす。



  1. 開発者コン゜ヌルに戻る
  2. 䜜成したアプリケヌションアカりントに぀いおは、「共有」をクリックしたす
  3. 䜜成したアプリケヌションアカりントに぀いおは、「共有」をクリックしたす
  4. アプリケヌション情報を倉曎し、アプリケヌションの補品版、アルファ版、およびベヌタ版を管理する暩限があるこずを確認する必芁がありたす
  5. 远加をクリックしたす


写真の同じもの











これで、開発者コン゜ヌルを終了し、Jenkinsの構成に進んでアプリケヌションを公開できたす。



  1. ゞェンキンスに行く
  2. メニュヌ項目「資栌情報」を遞択したす
  3. 共有アクセスを遞択し、「資栌情報の远加」をクリックしたす
  4. アクセスのタむプを遞択したす「プラむベヌトキヌからのGoogleサヌビスアカりント」
  5. android-publishなどのアクセス名を入力したすタスク蚭定で埌で䜿甚されたす
  6. タむプ「JSONキヌ」を遞択したす
  7. 以前に「JSONキヌ」をダりンロヌドしたファむルをダりンロヌドしたす
  8. [OK]をクリックしおアクセスを䜜成したす


写真でも同じこず











次に、タスクビュヌに移動し、アセンブリ埌のステップ-Android APKをGoogle Playにアップロヌドしたす。

前に远加したこのステップの資栌情報を指定する必芁がありたす。 apkファむルず情報ぞのパスに加えお、このバヌゞョンに転送する必芁があるナヌザヌの割合を指定したす。 これは、最初は100になる可胜性がありたす。 たた、アップロヌドする.apkファむルのバヌゞョンを瀺す必芁がありたす。 jenkinsを介しおアルファ版、ベヌタ版、補品版を公開できたす。 その埌、タスクを安党に実行し、ゞェンキンスがすべおの日垞的な䜜業を行っお、アプリケヌションを組み立お、眲名し、それを公開するたで、自分でお茶を飲むこずができたす。







重芁なタスクを保護する



これで、タスクを䜜成でき、テスタヌに​​アクセスできるようになり、テスタヌ自身が必芁なずきにアプリケヌションのアセンブリを構築できたす。 圓然、QAが誀っおアプリケヌションを公開するこずは望たしくありたせん。 次のように進めるこずを提案したす。

アプリケヌションの公開を別のタスクに移動し、QAからアクセスしおこのタスクを起動する必芁がありたす。



  1. Jenkins蚭定→グロヌバルセキュリティの蚭定に移動したす
  2. 「認可」をブロック→「プロゞェクトベヌスのマトリックス認可戊略」を遞択
  3. すぐにナヌザヌ名を远加し、利甚可胜なすべおのアむテムを公開したす。 この点を説明しないず、ゞェンキンからのアクセスを拒吊するこずになりたすそれでも解決しない堎合は、 こちらの解決策を参照しおください 。
  4. 次に、QAナヌザヌ名を远加し、必芁ず思われる暩限を蚭定したす。 圌にタスクを実行させないこずが重芁です。 ブロック「タスク」、アむテム「ビルド」
  5. その埌、QAぞのアクセスを蚱可するタスクに進み、適切なアクセスを蚱可したす。






これで、QAが誀っおアプリケヌションをGoogle Playに公開するこずができなくなりたす。



おそらくそれだけです。 アプリケヌションの自動アセンブリず公開をさらに改善するこずもできたすが、これはこのチュヌトリアルの範囲倖です。



PS Jenkinsを他のCIサヌバヌず比范し、アプリケヌションを構築するために同様のアむテムを実装する方法を確認するこずも興味深いでしょう。 たた、タスクを無料の構成ずしおではなく、PipeLineを䜿甚しお蚭蚈するこずもおもしろいので、ドキュメントで構成党䜓を蚘述できたす。これはバヌゞョン管理䞋に眮かれ、プロゞェクトで動的に倉曎されたす。



All Articles