Jenkins+GitLab+蒲公英_持續整合

weixin_33978044發表於2016-03-01

Jenkins+GitLab+蒲公英_持續整合

本文旨在自動完成打ipa包及上傳蒲公英及傳送郵件通知測試.

1.安裝Jenkins

安裝Jenkins有兩種方式:一種是直接下載Jenkins安裝包安裝.另一種是使用命令列安裝.
本文使用命令列安裝Jenkins.使用命令列安裝前首先下載安裝Homebrew.
安裝Homebrew:開啟終端視窗, 貼上指令碼:
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
參考網站:http://brew.sh/index_zh-cn.html
Homebrew安裝好後,再安裝Jenkins.
安裝Jenkins:$ brew install jenkins
安裝好Jenkins後,還需要安裝Java,因為Jenkins是執行在java上的.
安裝java:$ brew install Caskroom/cask/java
以上完成後,就可以啟動Jenkins了.
啟動jenkins:$ java -jar /usr/local/opt/jenkins/libexec/jenkins.war --httpPort=8888
(上述埠號預設是8080,可修改)
啟動jenkins完成後,在瀏覽器輸入http://localhost:8888便可開啟Jenkins了.如下圖:

1503319-3028284b8d37ae82.png
圖片

2.安裝必要外掛

安裝外掛可以讓Jenkins功能更強大,配置更方便.
git外掛(GIT plugin)

ssh外掛(SSH Credentials Plugin)

Xcode外掛(Xcode integration)

可能會用到的其他外掛:

Credentials Binding Plugin

GitLab Plugin

Gitlab Hook Plugin

Keychains and Provisioning Profiles Management

Post-Build Script Plug-in

Publish Over FTP

Role-based Authorization Strategy

Translation Assistance plugin

點選"系統管理"->"管理外掛",在"可選外掛"中查詢並安裝上述外掛.
安裝時老失敗,可以嘗試重啟Jenkins.
安裝時一直進度條中,重新整理頁面就好了.

3.新建及配置一個Item

點選"新建",

1503319-2d3be57bd3fb4635.png
圖片

Item名稱最好和你的工程名字一樣.點選"OK".
點選左上角的"Jenkins",回到Jenkins首頁,此時你就可以看到你剛剛新建的Item了.

配置"Credentials"

點選Credentials,進入如下頁面:

1503319-ee75bb4fa11148e6.jpg
圖片

點選新增
1503319-36944369ae982880.jpg
圖片

注意:新增你的Private Key,這裡沒配置好,有可能連線不上你的GitLab的工程,提示無法連線到git@xxx.git,沒有許可權.ssh key路徑是:/Users/xuequan/.ssh.弄好後點選儲存.

繼續點選你新建的工程,進入到下圖頁面:

1503319-63ce09531ff83fa9.jpg
圖片

點選"配置".

設定"原始碼管理"

找到"原始碼管理"一欄,並進行如下設定.


1503319-57adb22b1b1012a0.jpg
圖片

"Repository URL"填寫GitLab上的工程URL.


1503319-9ae2d89880f6f9ff.jpg
圖片

"Branches to build"可根據需要填寫.

設定"Keychains and Provisioning Profiles Management"

在"系統管理"中找到"Keychains and Provisioning Profiles Management",點選進去.
如下圖:

1503319-e9911159b259b4ec.jpg
圖片

上傳"login.keychain"檔案(路徑:/Users/xuequan/Library/MobileDevice/Provisioning Profiles)和".mobileprovision"檔案(/Users/xuequan/Library/Keychains/login.keychain).點選儲存.

配置"構建環境"

回到剛才設定找到"構建環境"一欄,並進行如下設定.


1503319-b68d1f0d43f29627.jpg
圖片

配置"構建"

找到"構建"一欄,點選"增加構建步驟",選擇"Execute shell"

1503319-32bf650c144c2b89.jpg
圖片

1503319-bb2607afdf8075cf.jpg
圖片

shell命令:

xcodebuild -workspace yourProjectName.xcworkspace -scheme "yourScheme" -destination generic/platform=iOS -configuration Release(or Debug,if you like) archive -archivePath  ${WORKSPACE}/builds/${BUILD_NUMBER}/archive
xcodebuild -exportArchive -exportFormat ipa -archivePath ${WORKSPACE}/builds/${BUILD_NUMBER}/archive.xcarchive -exportPath ${WORKSPACE}/builds/${BUILD_NUMBER}/${JOB_NAME}_${BUILD_NUMBER}.ipa -exportProvisioningProfile 'yourProfileName'

上述命令需要根據你的實際情況設定的,這裡只是示例.
其中命令:-exportProvisioningProfile 'yourProfileName',這裡的"yourProfileName"應該填寫你的xcode專案的配置檔名字.
提示:這一步也可以是選擇下拉框裡的"Xcode"進行配置,如果你不喜歡用shell的話.

設定Publish over FTP

在設定此項之前,先開啟Mac FTP-server.
Mac電腦本身是支援FTP服務的,只不過系統預設關閉了,Mountain Tweaks 這款軟體可以很方便的修改系統的一些設定,比如是否開啟開啟 Window 動畫,是否顯示使用者的 Library 資料夾,其中有一個選項就是是否開啟系統的FTP-server 功能。下載好Mountain Tweaks將FTP-server功能使能即可.
回到Jenkins,在"系統管理"中找到"系統設定",點選進去.並找到Publish over FTP設定

1503319-5998bc47f39e7858.jpg
圖片

設定好後儲存.

設定增加構建後操作步驟

繼續你剛剛新建的專案的配置,找到增加構建後操作步驟.

1503319-df997ebb1bf18a83.jpg
圖片

選擇圖上紅框內容.
找到"Execute a set of scripts"下的
1503319-47195591fda88da2.jpg
圖片

新增如下:
1503319-3751a6b827b25aa8.jpg
圖片

設定Send build artifacts over FTP

找到"Send build artifacts over FTP",設定


1503319-50ba9df1bcecf19a.jpg
圖片

點選儲存.
完成後,可以點選"立即構建".
注意:如果你的是CocoaPods的工程,可能會遇到列印日誌一直卡住不動,此時需要在你的工程target後面的share勾選上.

附Execute a set of scripts下的Python檔案內容:

# coding=utf-8

"""
    * User:  answer.huang
    * Email: aihoo91@gmail.com
    * Date:  15/3/31
    * Time:  18:33
    * Blog:  answerhuang.duapp.com
    """

import time
import urllib2
import time
import json
import mimetypes
import os
import smtplib
import datetime

from email.MIMEText import MIMEText
from email.MIMEMultipart import MIMEMultipart

#蒲公英應用上傳地址
url = 'http://www.pgyer.com/apiv1/app/upload'
#蒲公英提供的使用者Key
uKey = 'xxxxxx'
#上傳檔案的檔名(這個可隨便取,但一定要以ipa結尾)
file_name = 'xxxx.ipa'
#蒲公英提供的 API Key
_api_key = 'xxxx'
#安裝應用時需要輸入的密碼,這個可不填
installPassword = '123456'

# 執行時環境變數字典
environsDict = os.environ
#此次 jenkins 構建版本號
jenkins_build_number = environsDict['BUILD_NUMBER']

#專案名稱,用在拼接tomcat檔案地址
project_name = 'yourProjectName'

#ipa檔案在tomcat伺服器上的地址
#ipa_file_tomcat_http_url = 'http://10.1.95.5:8080/' + project_name + '/static/' + jenkins_build_number + '/' + jenkins_build_number + '.ipa'

#獲取 ipa 檔案路徑
def get_ipa_file_path():
    #工作目錄下面的 ipa 檔案
    ipa_file_workspace_path = '/Users/xuequan/.jenkins/jobs/' + project_name + '/workspace/builds/' + jenkins_build_number + '/' + project_name + '_' + jenkins_build_number + '.ipa'
    #tomcat 上的 ipa 檔案
#    ipa_file_tomcat_path = '/usr/local/tomcat/webapps/' + project_name + '/static/' + jenkins_build_number + '/' + jenkins_build_number + '.ipa'

    if os.path.exists(ipa_file_workspace_path):
        return ipa_file_workspace_path
#    elif os.path.exists(ipa_file_tomcat_path):
#        return ipa_file_tomcat_path

#ipa 檔案路徑
ipa_file_path = get_ipa_file_path()
print ipa_file_path

#請求字典編碼
def _encode_multipart(params_dict):
    boundary = '----------%s' % hex(int(time.time() * 1000))
    data = []
    for k, v in params_dict.items():
        data.append('--%s' % boundary)
        if hasattr(v, 'read'):
            filename = getattr(v, 'name', '')
            content = v.read()
            decoded_content = content.decode('ISO-8859-1')
            data.append('Content-Disposition: form-data; name="%s"; filename="kangda.ipa"' % k)
            data.append('Content-Type: application/octet-stream\r\n')
            data.append(decoded_content)
        else:
            data.append('Content-Disposition: form-data; name="%s"\r\n' % k)
            data.append(v if isinstance(v, str) else v.decode('utf-8'))
    data.append('--%s--\r\n' % boundary)
    return '\r\n'.join(data), boundary

#處理 蒲公英 上傳結果
def handle_resule(result):
    json_result = json.loads(result)
    if json_result['code'] is 0:
        send_Email(json_result)

#傳送郵件
def send_Email(json_result):
    appName = json_result['data']['appName']
    appKey = json_result['data']['appKey']
    appVersion = json_result['data']['appVersion']
    appBuildVersion = json_result['data']['appBuildVersion']
    appShortcutUrl = json_result['data']['appShortcutUrl']
    #郵件接受者
    mail_receiver = ['receiverEmail@xx.com']
    #根據不同郵箱配置 host,user,和pwd
    mail_host = 'smtp.exmail.qq.com:465'
    mail_user = 'senderEmail@xx.com'
    mail_pwd = 'senderEmailPassword'
    mail_to = ','.join(mail_receiver)
    
    msg = MIMEMultipart()
    
    environsString = '<h3>移動端iOS安裝包</h3><p>'
    #environsString += '<p>ipa 包下載地址 : ' + ipa_file_tomcat_http_url + '<p>'
    environsString += '<p>蒲公英網站線上安裝 : ' + 'http://www.pgyer.com/' + str(appShortcutUrl) + '   密碼 : ' + installPassword + '<p>'
    #environsString += '<li><a href="itms-services://?action=download-manifest&url=https://ssl.pgyer.com/app/plist/' + str(appKey) + '">點我直接安裝</a></li>'
    message = environsString
    body = MIMEText(message, _subtype='html', _charset='utf-8')
    msg.attach(body)

    msg['To'] = mail_to
    msg['from'] = mail_user
    #獲得當前時間
    now = datetime.datetime.now()  #這是時間陣列格式
    #轉換為指定的格式
    otherStyleTime = now.strftime("%Y%m%d")
    msgSubject = 'iOS' + '_' + otherStyleTime + '_' + jenkins_build_number +'安裝包'
    msg['subject'] = msgSubject
    
    try:
        s = smtplib.SMTP_SSL()  #使用SMTP_SSL()
        s.connect(mail_host)
        s.login(mail_user, mail_pwd)
        s.sendmail(mail_user, mail_receiver, msg.as_string())
        s.close()
        print '傳送郵件成功'
    except Exception, e:
        print e

#############################################################
#請求引數字典
params = {
    'uKey': uKey,
    '_api_key': _api_key,
    'file': open(ipa_file_path, 'rb'),
    'publishRange': '2',
    'password': installPassword
}

coded_params, boundary = _encode_multipart(params)
req = urllib2.Request(url, coded_params.encode('ISO-8859-1'))
req.add_header('Content-Type', 'multipart/form-data; boundary=%s' % boundary)
try:
    resp = urllib2.urlopen(req)
    body = resp.read().decode('utf-8')
    print body
    handle_resule(body)
except urllib2.HTTPError as e:
    print(e.fp.read())

上述程式碼中一些東西需要根據你的實際配置更改的. 這裡面需要改動的基本上就是路徑, 如果你的路徑不對,你不可能成功.
回到你的工程,點選立即構建.就可以完成自動打包了.

參考:
http://answerhuang.duapp.com/index.php/2015/04/19/jenkins/
http://www.jianshu.com/p/c69deb29720d
http://www.techv5.com/topic/363/(設定Jenkins登入許可權)
以上.

相關文章