Jenkins + Fastlane on CentOS 7

本篇要記錄一下如何安裝 Jenkins 與 Fastlane 到 Linux CentOS 7 上面,Jenkins 是一個市面上常用的 Continuous Delivery 的工具,從 2011 年開發到現在已經被廣泛採用,Fastlane 則是一個在開發 iOS 與 Android 手機程式自動化發佈新版手機程式的工具,放在 Linux Server 上面可以加快手機程式部署的速度,不多說快看內容吧!

安裝 Jenkins 到 CentOS7  

關於安裝 Jenkins 的部分我們主要參考:連結,這邊我們並沒有將 Jenkins 安裝到 Docker 上面主要來是考量到檔案的共享性,如果你的檔案已經全部都儲存在 Git 裡面的話,其實可以考慮 Docker,主要的安裝指令為以下所列:

安裝 Java 並且同步 Jenkins 的 Repository

sudo yum install java-1.8.0-openjdk-devel
curl --silent --location http://pkg.jenkins-ci.org/redhat-stable/jenkins.repo | sudo tee /etc/yum.repos.d/jenkins.repo
sudo rpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.key

安裝 Jenkins 並且利用 systemctl [start|stop|restart|status] 做管理,如果需要在開機時自動啟動 jenkins 的話再利用 systemctl enable jenkins.

sudo yum install jenkins
sudo systemctl start jenkins
systemctl status jenkins

● jenkins.service - LSB: Jenkins Automation Server
   Loaded: loaded (/etc/rc.d/init.d/jenkins; bad; vendor preset: disabled)
   Active: active (running) since Fri 2019-11-29 22:42:35 CET; 11h ago
     Docs: man:systemd-sysv-generator(8)
  Process: 14583 ExecStop=/etc/rc.d/init.d/jenkins stop (code=exited, status=0/SUCCESS)
  Process: 14881 ExecStart=/etc/rc.d/init.d/jenkins start (code=exited, status=0/SUCCESS)
    Tasks: 47
   Memory: 1.0G
   CGroup: /system.slice/jenkins.service
           └─14907 /etc/alternatives/java -Dcom.sun.akuma.Daemon=daemonized -Djava.awt.headless=true -DJENKINS_HOME=/var/lib...

啟動之後可能需要設定 Firewall 才能夠利用網頁介面做設定,網址 http://URL:8080,設定時可能會需要改動一些參數或是需要密碼可以參考以下的位址:

cat /var/lib/jenkins/secrets/initialAdminPassword
cat /etc/sysconfig/jenkins

例如可能會需要修改:

JENKINS_USER="****"
JENKINS_PORT="****"

下圖為網頁設定過程所需要提供的 initialAdminPassword

安裝並設定 Fastlane

在安裝與設定 Fastlane 的時候遇到比較多的問題,簡單介紹一下 fastlane 他其實是 gem 的一個應用程式,主要運行的平台在 Ruby 上面,所以如果 Linux 沒有 Ruby 平台的話需要先安裝,這邊我們參考的網頁為連結

安裝 RVM (Ruby Version Manager) 利用 RVM 來管理 Ruby 安裝的版本,如果直接安裝 yum install ruby 的話可能在安裝 fastlane 的時候會有版本上的問題。

curl -sSL https://rvm.io/mpapis.asc | gpg2 --import -
curl -sSL https://rvm.io/pkuczynski.asc | gpg2 --import -
curl -L get.rvm.io | bash -s stable
source /etc/profile.d/rvm.sh
rvm reload

安裝 Ruby 2.6 版本

rvm requirements run
rvm list known

MRI Rubies
[ruby-]1.8.6[-p420]
[ruby-]1.8.7[-head] security released on head
[ruby-]1.9.1[-p431]
[ruby-]1.9.2[-p330]
[ruby-]1.9.3[-p551]
[ruby-]2.0.0[-p648]
[ruby-]2.1[.10]
[ruby-]2.2[.10]
[ruby-]2.3[.8]
[ruby-]2.4[.6]
[ruby-]2.5[.5]
[ruby-]2.6[.3]
[ruby-]2.7[.0-preview1]
ruby-head

rvm install 2.6

選擇並確認版本

rvm list
=* ruby-2.6.3 [ x86_64 ]
=> - current
=* - current && default
 * - default

rvm use 2.6 --default
ruby --version
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-linux]

which ruby
/usr/local/rvm/rubies/ruby-2.6.3/bin/ruby

利用 gem 安裝 fastlane:在安裝完 Ruby 之後利用 gem 安裝 Fastlane 安裝的指令很簡單就是

gem install fastlane -v 2.115.0

關於版本的相關資訊可以到連結去查詢,其中我們遇到以下的問題:

/usr/local/var/rbenv/versions/2.6.3/lib/ruby/2.6.3/rubygems/specification.rb:2325:
in `raise_if_conflicts': Unable to activate google-cloud-storage-1.17.0, because google-api-client-0.23.9 conflicts with google-api-client (~> 0.26)
(Gem::ConflictError)

主要是版本的衝突發生在 google-api-client 這一本版本之上,因為 fastlane 跟底下的 google-cloud-storage 都需要但是版本上有衝突,解決方法是重新調整安裝順序為以下

gem install google-api-client -v 0.23.9
gem install google-cloud-storage -v 1.16.0
gem install fastlane -v 2.115.0

fastlane (2.115.0) 需要 google-api-client >= 0.21.2, < 0.24.0
google-cloud-storage (1.16.0) 需要 google-api-client ~> 0.23

剛好有 Overlap 所以選擇 google-api-client -v 0.23.9,fastlane 的社群連結裡面有稍微提到相關的問題但是沒有完整的解答。

Jenkins Jobs 問題

理論上此時在 Linux Server 上已經可以執行 fastlane,可以利用 fastlane env 去查看環境的參數,記得此時在 pipeline 要加入環境變數的設定

environment {
    PATH = "/usr/local/rvm/gems/ruby-2.6.3/bin:/usr/local/rvm/rubies/ruby-2.6.3/bin:$PATH"
}

筆者在安裝的時候利用 Jenkins pipeline 執行 fastlane 指令的時候卻還是不斷發生

fastlane env
/usr/local/rvm/rubies/ruby-2.6.3/lib/ruby/site_ruby/2.6.0/rubygems.rb:284:in `find_spec_for_exe': can't find gem fastlane (>= 0.a) with executable fastlane (Gem::GemNotFoundException)
	from /usr/local/rvm/rubies/ruby-2.6.3/lib/ruby/site_ruby/2.6.0/rubygems.rb:303:in `activate_bin_path'
	from /usr/local/rvm/gems/ruby-2.6.3/bin/fastlane:23:in `<main>'
	from /usr/local/rvm/gems/ruby-2.6.3/bin/ruby_executable_hooks:24:in `eval'
	from /usr/local/rvm/gems/ruby-2.6.3/bin/ruby_executable_hooks:24:in `<main>'

如下圖 Jenkins Job 所示:

其原因主要是因為在 jenkins job 執行的環境中 gem 找不到 fastlane 的應用程式,所以在 pipeline 中暫時加入一個安裝指令執行過後就可以拿掉了。

gem install fastlane -v 2.115.0

之後就一切正常了,以上分享給大家!