Jenkins+GitLab+蒲公英_持續整合
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了.如下圖:
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
點選"新建",
Item名稱最好和你的工程名字一樣.點選"OK".
點選左上角的"Jenkins",回到Jenkins首頁,此時你就可以看到你剛剛新建的Item了.
配置"Credentials"
點選Credentials,進入如下頁面:
點選新增
注意:新增你的Private Key,這裡沒配置好,有可能連線不上你的GitLab的工程,提示無法連線到git@xxx.git,沒有許可權.ssh key路徑是:
/Users/xuequan/.ssh
.弄好後點選儲存.
繼續點選你新建的工程,進入到下圖頁面:
點選"配置".
設定"原始碼管理"
找到"原始碼管理"一欄,並進行如下設定.
"Repository URL"填寫GitLab上的工程URL.
"Branches to build"可根據需要填寫.
設定"Keychains and Provisioning Profiles Management"
在"系統管理"中找到"Keychains and Provisioning Profiles Management",點選進去.
如下圖:
上傳"login.keychain"檔案(路徑:/Users/xuequan/Library/MobileDevice/Provisioning Profiles)和".mobileprovision"檔案(/Users/xuequan/Library/Keychains/login.keychain).點選儲存.
配置"構建環境"
回到剛才設定找到"構建環境"一欄,並進行如下設定.
配置"構建"
找到"構建"一欄,點選"增加構建步驟",選擇"Execute shell"
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設定
設定好後儲存.
設定增加構建後操作步驟
繼續你剛剛新建的專案的配置,找到增加構建後操作步驟.
選擇圖上紅框內容.
找到"Execute a set of scripts"下的
新增如下:
設定Send build artifacts over FTP
找到"Send build artifacts over FTP",設定
點選儲存.
完成後,可以點選"立即構建".
注意:如果你的是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登入許可權)
以上.
相關文章
- 持續整合、持續部署、持續交付、持續釋出
- 持續整合持續部署持續交付_持續整合與持續部署之間的真正區別
- 持續整合、持續交付、持續部署簡介
- 整合持續整合工具
- iOS 持續整合iOS
- 淺談持續整合(CI)、持續交付(CD)、持續部署(CD)
- 對持續整合、 持續交付、持續部署和持續釋出的介紹
- Jenkins持續整合Jenkins
- 從持續整合到持續交付——DockerCloud概覽DockerCloud
- 談談持續整合,持續交付,持續部署之間的區別
- 通過Docker容器執行持續整合/持續部署Docker
- 持續整合配置之Nuget
- Taro 小程式持續整合
- 持續整合JenkinsBlueOcean初探Jenkins
- Jenkins持續整合配置Jenkins
- 淺談持續整合的理解以及實現持續整合,需要做什麼?
- 使用流水線外掛實現持續整合、持續部署
- 我們正在路上—從持續整合到持續釋出
- Flutter web 持續整合實踐FlutterWeb
- Jenkens+Docker+Git 持續整合DockerGit
- jenkins+docker 持續整合JenkinsDocker
- iOS持續整合(一)——fastlane 使用iOSAST
- 持續整合 Jenkins 簡介Jenkins
- 小程式的持續整合方案
- iOS 持續整合系列 – 開篇iOS
- Jenkins 持續整合使用教程Jenkins
- 持續整合(三):最佳實踐
- CI 持續整合 - 阿里云云效阿里
- 持續整合及部署利器:GoGo
- 使用GitLabCI持續整合Gitlab
- 持續整合開源軟體
- SAP開源的持續整合-持續交付的解決方案
- CI/CD 持續整合部署實踐
- 微服務容器部署與持續整合微服務
- ick:一個持續整合系統
- iOS使用fastlane實現持續整合iOSAST
- 持續整合Jenkins+GitlabJenkinsGitlab
- 微服務化的基石——持續整合微服務