Calm Hill My Random Thoughts

Fastlane with Jenkins on OS X

တခါတခါ App တွေ Build လုပ်ရမယ် Release လုပ်ရမယ်ဆိုရင် App မှာသုံးထားတဲ့ Library တွေများရင်များသလို အချိန်အတော်သုံးရတယ် နာရီဝက်တနာရီလောက် ကြာအောင်လုပ်လိုက်ပြီးမှ Store ပေါ်ကို Upload လုပ်တဲ့အချိန်လည်းရောက်ရော Build Number မေ့ပြီးတော့မပြောင်းလိုက်မိလို့ Store ပေါ်ကို Upload လုပ်လို့မရတာမျိုးတို့ Sign လုပ်တဲ့ Key မှားလာတာတို့ အသေးအမွှား ကိစ္စတွေထွက်လာရင် ပရိုဂရမ်မာကို ဆူရပြန်ပြီးတော့ အချိန်လည်းကုန်တယ် ပျင်းစရာလည်း ကောင်းတော့ ဘယ်သူမှလည်း မလုပ်ချင်ကြဘူး။ App တခုနှစ်ခုဆိုရင် မသိသာပေမယ့် App ၇−၈ ခုဆိုရင်တော့ အတော်ပြဿနာရှိတယ် ပရိုဂရမ်မာလည်း အားလားဆိုရင်မအားဘူး စောင့်မနေပဲနဲ့ အလုပ်ဆက်လုပ်မရတော့ တပတ်လောက်အထိ အလုပ်ပျက်ရတာကိုရှိတယ်။ မဖြစ်သေးဘူးလို့ Build လုပ်ဖို့တော့ နည်းလမ်းရှာဦးမှဆိုပြီး Build Process ကို Automate လုပ်ဖို့ စီစဉ်ရပြန်တယ်။ Internet Connection ပြဿနာရှိတော့ Online Services တွေက သုံးလို့အဆင်မပြေဘူး Xcode Server က iOS အတွက်တော့ အဆင်ပြေပေမယ့် ကိုယ်တွေမှာက Platform တွေက ပေါင်းစုံဖြစ်နေတော့ Generic Solution လိုတယ် အနည်းဆုံးတော့ iOS နဲ့ Android ၂ မျိုးတော့ အကောင်းဆုံး အဆင်ပြေရမယ်ဆိုပြီး လိုက်ရှာကြည့်တော့ Fastlane က Build - Screenshot - Sign - Upload စသည်ဖြင့် အသေအချာ Setup လုပ်ထားတယ်ဆိုရင် အတော်အဆင်ပြေတယ်။ Fastlane ကို စက်တလုံးပေါ်မှာ Setup လုပ်ထားပြီးတော့ Automate လုပ်ဖို့အတွက် Jenkins ကိုသုံးလိုက်တယ်။

Install Fastlane

brew cask install fastlane

အရင်ဆုံးအနေနဲ့ Setup လုပ်မယ့်စက်မှာ iOS အတွက် Xcode နဲ့ Android အတွက်လိုအပ်တဲ့ SDK တွေကိုတော့ Install လုပ်ဖို့လိုမယ်။ Fastlane ကို Install လုပ်ဖို့အတွက်က homebrew နဲ့ install လုပ်ရင်လွယ်ပါလိမ့်မယ်။ homebrew နဲ့ install လုပ်ထားတဲ့ Fastlane ဟာ $HOME Directory အောက်က .fastlane ထဲကို Install လုပ်တဲ့အတွက် $PATH ထဲကို Configure လုပ်ပေးမှပဲ Fastlane ကို Terminal မှာ သုံးလို့ရပါလိမ့်မယ်။ Fastlane ကို Configure လုပ်ပြီးပြီဆိုရင် Jenkins နဲ့မသုံးခင်မှာ အရင်ဆုံးစမ်းကြည့်ပါ Fastlane နဲ့ သိပ်ပြီးတော့ မရင်းနီးဖူးဆိုရင်တော့ အောက်မှပြထားတဲ့ Examples တွေကိုအရင်ဆုံး စမ်းကြည့်မယ်ဆိုရင် အဆင်ပြေပါလိမ့်မယ် သိပ်ပြီးတော့ ခက်ခက်ခဲခဲ မဟုတ်ပါဘူး iOS or Android Programmer အနေနဲ့ဆိုရင် Fastlane Initialization လုပ်တဲ့ Process တွေမှာမေးတဲ့ Information တွေကို ဘယ်လိုဖြေပေးရမယ် သိကြပါလိမ့်မယ် ဖြေပေးလိုက်ရင် Configure လုပ်ပြီးတော့ သုံးလို့အဆင်ပြေမှာပါ။

Fastlane Examples

https://github.com/fastlane/examples

Fastlane အဆင်ပြေသွားရင် တကယ်ကတော့ အလုပ်အတော်သက်သာပြီ Fastlane ရှိတဲ့စက်မှာ User Account တခုစီပေးထားရင် Build လုပ်ချင်တဲ့လူ အဲဒီကိုသွားပြီးတော့ Git ပေါ်ကနေ လိုအပ်တဲ့ Code တွေကို Pull လုပ်ပြီးတော့ Fastlane ကို Run ရင်ရတယ် Developer တွေ သူတို့စက်ကနေ Fastlane ရှိတဲ့စက်ကို Browser ကနေ Access လုပ်ပြီး Pull လိုမျိုး Manual အလုပ်တွေပါ ထပ်ပြီးတော့ လျှော့လို့ရအောင် Jenkins ကို Install လုပ်ပေးရင် ပိုပြီးတော့ အဆင်ပြေတယ်။ Jenkins အတွက်က Java ကို Install အရင်လုပ်ရမယ် Android အတွက် SDK တွေ Setup လုပ်ပြီးသားဆိုရင်တော့ Java က ရှိပြီးသား ဖြစ်ကောင်းဖြစ်မှာပါ မရှိသေးရင်တော့ Oracle ဆီကနေ Download လုပ်ပြီးတော့ Install အရင်လုပ်ပါ။ Jenkins အတွက် အလွယ်တကူပဲ Homebrew နဲ့ Install လုပ်ပြီးတော့ brew services နဲ့ LaunchAgents ထဲမှာ Service တခုအနေနဲ့ Install လုပ်လိုက်တယ်။ Jenkins ကို 127.0.0.1:8080 ကနေတဆင့် Access လုပ်ပြီးတော့ Setup လုပ်ရပါလိမ့်မယ် အကြံပေးရရင်တော့ Initial Plugins တွေကို Install လုပ်ပါ User Accounts တွေကို Create လုပ်ပါ။ Initial Configuration တွေပြီးပြီဆိုရင်တော့ Jobs တွေကိုစပြီးတော့ Create လုပ်ပြီးတော့ သုံးလို့ရတဲ့ အခြေအနေကို ရောက်ပါပြီ။ Jenkins ရဲ့ Configuration တွေဟာ $HOME Directory အောက်က .jenkins ထဲမှာရှိလိမ့်မယ်။

Install Jenkins

brew install jenkins
brew services start jenkins

Jenkins ရဲ့ ပြဿနာတခုက Port 8080 မှာ Run နေပေမယ့် Listen လုပ်နေတဲ့ IP က 127.0.0.1 မှာပဲဖြစ်တဲ့အတွက် တခြားစက်တွေကနေ Access လုပ်လို့မရပါဘူး တခြားစက်တွေကနေ သုံးလို့ရဖို့အတွက် Webserver တခုခုကနေတဆင့် Port ကို Forward လုပ်ပြီးတော့ သုံးဖို့လိုအပ်ပါတယ် ကိုယ်ကတော့ သုံးနေကျဖြစ်တဲ့ Nginx ကိုပဲသုံးထားတယ် Homebrew ကိုသုံးပြီးတော့ပဲ Install လုပ်ပြီး LaunchAgents မှာ Install လုပ်ပါတယ်။ Nginx ကို Install လုပ်ပြီးရင်တော့ nginx.conf မှာ Port ကို 9090 ကနေတဆင့် 127.0.0.1:8080 ကို Access လုပ်ခွင့်ပေးဖို့အတွက် Configure လုပ်ပေးဖို့လိုလိမ့်မယ် Port 80 စသည်ဖြင့်အခြား Port ကို သုံးချင်လို့ ပြောင်းသုံးလည်းရတယ် အောက်မှပြထားတဲ့ နမူနာကိုကြည့်ပါ။ ဒါတွေပြီးရင်တော့ Local Network ထဲမှာ Install လုပ်ထားတဲ့စက်ကို http://xxx.xxx.xxx.xxx:9090 ဆိုပြီးတော့ လှမ်းပြီးတော့ Access လုပ်လို့ရလိမ့်မယ် Network ထဲမှာ Domain Controller ရှိတယ် Configure လုပ်ချင်ရင် Name နဲ့ Access လုပ်ဖို့အတွက် ဆက်လုပ်လို့ရပါတယ် အဲဒါကတော့ Network တခုနဲ့တခု မတူတဲ့အတွက် အကြံပေးလို့မရဘူး ကိုယ့်ဟာကိုယ် အဆင်ပြေသလို ကြည့်လုပ်ပါ။

Install Nginx

brew install homebrew/nginx/nginx-full
brew services start nginx-full

Configure Nginx − /usr/local/etc/nginx/nginx.conf

server {
   listen 9090;
   server_name localhost;
   location / {
      proxy_set_header        Host $host:$server_port;
      proxy_set_header        X-Real-IP $remote_addr;
      proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header        X-Forwarded-Proto $scheme;
      proxy_pass          http://127.0.0.1:8080;
      proxy_read_timeout  90;
   }
}

ဒီအခြေအနေရောက်ရင် သုံးလို့ရတဲ့အခြေအနေကို ရောက်နေပြီဖြစ်ပေမယ့် ပြဿနာတခုက LaunchAgents ဖြစ်နေတဲ့အတွက် Install လုပ်ထားတဲ့ User Login ဝင်ထားမှပဲ Services တွေစတဲ့အတွက် Auto Login ကို သက်ဆိုင်ရာ User Account နဲ့ဝင်ထားမှပဲ တခြားစက်တွေကနေ သုံးလို့ရပါလိမ့်မယ် ဒီအခြေအနေနဲ့ အဆင်ပြေတယ် ဆက်ပြီးတော့ အလုပ်မရှုပ်ချင်ရင် ဒီနေရာမှာပဲ ရပ်လို့ရပါတယ်။

LaunchAgents အနေနဲ့မဟုတ်ပဲ LaunchDaemons နဲ့ /System/Library/LaunchDaemons အောက်မှာ Install လုပ်ပေးရလိမ့်မယ် အရင်ကတော့ Homebrew က sudo နဲ့ brew services ကို Run ရင် LaunchDaemons မှာ Install လုပ်ပေးပေမယ့် အခုနောက်ပိုင်းမှာ sudo ကို သုံးလို့မရတော့တဲ့အတွက် Manually ပဲ Install လုပ်ရမယ်။ အရေးကြီးတဲ့အချက် LaunchDaemons ဟာ UserName ကို Configure မလုပ်ထားရင် root အနေနဲ့ run နေမှာဖြစ်တဲ့အတွက် Install မလုပ်ခင်မှာ Config တွေမှာ UserName ကို ထည့်ပေးရမယ် အောက်မှာပြထားတဲ့ နမူနာကိုကြည့်ပါ ~/Library/LaunchAgents ထဲက homebrew.mxcl.jenkins.plist နဲ့ homebrew.mxcl.nginx-full.plist ကို သင့်လျော်သလိုပြင်ပြီး /System/Library/LaunchDaemons အောက်ကို ရွှေ့လိုက်ရင်ပြီးပါပြီ။

Config: jenkins.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>homebrew.mxcl.jenkins</string>
    <key>ProgramArguments</key>
    <array>
      <string>/usr/bin/java</string>
      <string>-Dmail.smtp.starttls.enable=true</string>
      <string>-jar</string>
      <string>/usr/local/opt/jenkins/libexec/jenkins.war</string>
      <string>--httpListenAddress=127.0.0.1</string>
      <string>--httpPort=8080</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>UserName</key>
    <string>configure_username_here</string>
  </dict>
</plist>

Config: nginx-full.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>homebrew.mxcl.nginx-full</string>
    <key>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>
    <false/>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/opt/nginx-full/bin/nginx</string>
        <string>-g</string>
        <string>daemon off;</string>
    </array>
    <key>WorkingDirectory</key>
    <string>/usr/local</string>
    <key>UserName</key>
    <string>configure_username_here</string>
  </dict>
</plist>

LaunchDaemons တွေကို Install လုပ်ပြီးတဲ့အခါ အခန့်မသင့်ရင် Service တွေက အလုပ်မလုပ်တာရှိတယ် Jenkins ဟာ Java Server ဖြစ်တဲ့အတွက် တခါတလေလည်း Boot လုပ်တာ အတော်ကြာတယ် launchctl နဲ့ restart လုပ်လည်း တခါတလေကြာနေတော့ Error တက်နေတယ် ထင်ရတတ်တယ် အကောင်းဆုံးကတော့ အားလုံး Configure လုပ်ပြီးပြီဆိုရင် Restart လုပ်ပြီးတော့ မိနစ်အနည်းငယ်လောက် စောင့်ပြီးတော့မှ တခြားစက်ကနေပြီး Access လုပ်ကြည့်ပါ အဆင်ပြေပါလိမ့်မယ်။

References

  • https://docs.fastlane.tools/
  • https://github.com/fastlane/examples
  • https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+behind+an+NGinX+reverse+proxy