一、Jenkins自動打包配置 目標:1. 自動打包;2. 自動上傳;3. 友好下載 1. Jenkins簡介 Jenkins是基於Java開發的一種持續集成工具,用於監控持續重覆的工作。 減少重覆勞動,減少人工成本。 持續、自動地構建/測試軟體項目; 監控一些定時執行的任務; ...
一、Jenkins自動打包配置
目標:1. 自動打包;2. 自動上傳;3. 友好下載
1. Jenkins簡介
Jenkins是基於Java開發的一種持續集成工具,用於監控持續重覆的工作。
減少重覆勞動,減少人工成本。
- 持續、自動地構建/測試軟體項目;
- 監控一些定時執行的任務;
2. Jenkins配置
- 添加git plugin和 role插件
- 設置人員許可權,根據角色授權
- 啟動訪問http://ip/8080即可,見下
3.1 開機自啟腳本
- 添加git項目,配置腳本,見下
3.2 項目打包腳本
和3.3 Apk上傳腳本
3. 自動化腳本
3.1 開機自啟腳本
- jenkins.sh
#! /bin/sh
# chkconfig: 2345 10 90
# description: jenkins ....
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.
#prefix=/Users/laifeng/jenkins
#nohup $prefix/jenkins_start.sh >> $prefix/jenkins.log 2>&1 &
JENKINS_ROOT=/Users/laifeng/jenkins
JENKINSFILENAME=jenkins.war
stop(){
echo "Stoping $JENKINSFILENAME "
ps -ef|grep $JENKINSFILENAME |awk '{print $2}'|while read pid
do
kill -9 $pid
echo " $pid kill"
done
}
case "$1" in
start)
echo "Starting $JENKINSFILENAME "
nohup java -jar $JENKINS_ROOT/jenkins.war --httpPort=8080 >> $JENKINS_ROOT/jenkins.log 2>&1 &
;;
stop)
stop
;;
restart)
stop
start
;;
status)
ps -ef|grep $JENKINSFILENAME
;;
*)
printf 'Usage: %s {start|stop|restart|status}\n' "$prog"
exit 1
;;
esac
- jenkins_start.sh
#!/bin/bash
export ANDROID_HOME=/usr/local/android-sdk
export GRADLE_HOME=/usr/local/gradle-2.2.1
export JENKINS_HOME=/Users/laifeng/.jenkins
/Users/laifeng/jenkins/jenkins.sh start
/usr/local/apache-tomcat-7.0.67/bin/startup.sh
- Mac上開機自啟
sudo defaults write com.apple.loginwindow LoginHook /path/to/script
設置/path/to/script = /Users/laifeng/jenkins/jenkins_start.sh
3.2 自動化打包和上傳
項目打包腳本
目前是直接運行Gradle命令,可腳本完成複雜需求
./gradlew clean assembleDebug
Apk上傳腳本
- deploy.sh
#!/bin/sh
echo "deploy begin......"
apkName=$1
currDay=$(date +%Y-%m-%d)
currTime=$(date +%H-%M-%S)
deployPath="/Users/laifeng/jenkins/android-apks/${currDay}"
#echo "$deployPath"
# 創建文件夾
if [ ! -d "$deployPath" ]; then
mkdir "$deployPath"
fi
# 拷貝文件到目錄
workspaceApkFile="${WORKSPACE}/crazytogether/build/outputs/apk/crazytogether-debug.apk"
deployApkFile="${deployPath}/${apkName}-${currTime}.apk"
#echo "$workspaceApkFile"
#echo "deployApkFile"
cp ${workspaceApkFile} ${deployApkFile}
echo "deploy success......"
Tomcat 文件伺服器
1. 在tomcat安裝目錄\conf\Catalina\localhost下建立任意文件名xml文件,比如:download.xml
<?xml version="1.0" encoding="UTF-8"?>
<Context path="/download" docBase="D://download" crossContext="true">
</Context>
2. 修改tomcat配置文件,文件目錄\conf\web.xml,要將紅色的false改為true
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
3. 重啟tomcat,訪問http://127.0.0.1:8080/download
遇到的問題
- 添加git 項目無法獲得許可權,創建ssh key ,把本地ssh key 公鑰上傳到你用戶的git server ,在Jenkins 添加認證,ssh 私鑰。
- 自啟動腳本無法順利執行,缺少環境變數,啟動的用戶不一致,啟動順序有先後,在啟動腳本里添加必須的環境變數
自啟動的腳本是系統啟動的,和登陸用戶不是一個環境
- 先在本地運行保證腳本的正確性
根據Log 查看什麼錯誤
二、Jenkins郵件配置
目標:1. 構建自動發郵件;2. 郵件模板;3. 組織友好下載鏈接;
1. 郵件配置
- 添加插件:Email Extension Plugin
- 設置SMTP伺服器:系統管理->系統設置->在Extended E-mail Notification項設置smtp service。註意設置的不是jenkins郵件通知項。
- 設置job郵件配置:
- 在“增加構建後操作步驟”選擇“Editable Email Notification”
- Project Recipient List,設置接受郵箱,多個郵箱空格隔開即可
- Content Type,選擇為HTML
- Default Subject,郵件標題
- Default Content,郵件內容,可以寫html
- 註意:這些選項裡面都可以使用“全局郵件變數”,參見鏈接
- 如何設置友好的下載鏈接:
- 下載地址每次都會發生變化,主要是“時間變數”
- “時間變數”,Day,Time需要設置到jenkins的環境變數中,這樣後續執行才能共用這些變數,使用
- “構建環境”:勾選“Inject environment variables to the build process”,在下麵"Evaluated Groovy script"選項中設置groovy腳本,添加到環境變數
- 修改“構建 Excute shell“ deploy.sh腳本,腳本中的時間變數不在是本地定義,而是使用上面設置的構建變數 ${CURR_DAY}, ${CURR_TIME}
- 修改“Editable Email Notification”-> "Default Content",當前版本根據“時間變數”${CURR_DAY}, ${CURR_TIME}動態生產下載地址
Evaluated Groovy script 添加如下腳本內容,後續的腳本中,可以引用${CURR_DAY}, ${CURR_TIME}
TimeZone.setDefault(TimeZone.getTimeZone('Asia/Shanghai')) def now = new Date() def map = [CURR_DAY: now.format('yyyy-MM-dd'), CURR_TIME: now.format('HH-mm-ss')] return map
Email Default Content 內容
文件下載:<br/><hr/>
當前版本:<a href="http://10.155.59.205:8081/download/${CURR_DAY}/branch-2.6.1-${CURR_TIME}.apk" target="_blank">點擊下載</a><br/>
歷史版本:<a href="http://10.155.59.205:8081/download" target="_blank">http://10.155.59.205:8081/download</a><br/><br/>
構建信息:<br/><hr/>
項目名稱:$PROJECT_NAME<br/>
構建編號:$BUILD_NUMBER<br/>
構建狀態:$BUILD_STATUS<br/>
觸發原因:${CAUSE}<br/>
構建日誌地址:<a href="${BUILD_URL}console">${BUILD_URL}console</a><br/>
構建地址:<a href="$BUILD_URL">$BUILD_URL</a><br/>
變更集:${JELLY_SCRIPT,template="html"}<br/><hr/>
(本郵件是程式自動下發的,請勿回覆!<br >
2. 其他問題
- smtp郵件服務一致無法正常發生,原因可能出在,ssl授權,smtp埠等問題上
- 時區問題預設獲得的時間少8小時,需要TimeZone為“Asia/Shanghai”