Android Jenkins+Git+Gradle持續(xù)集成-實在太詳細

在項目的上個版本,老大說將Android打包搞到服務(wù)器上栈暇,讓所有人都可以享受打包的樂趣嘶居,接著就有了這篇文章~Jenkins自動打包板乙,已經(jīng)用了一段時間了,奈何前段時間陷入了王者峽谷掷漱,所以一直懶得寫文章,現(xiàn)在終于找回狀態(tài),開擼弄匕。雖然Jenkins的文章又很多,但我覺得這篇會給你幾乎所有想要的沽瞭。
我用的是Jenkins+Git+Gradle實現(xiàn)自動打包

安裝

上來就是干的迁匠,首先到Jenkins的官網(wǎng)下載https://jenkins.io,點擊Download Jenkins按鈕會彈出兩個版本選擇:LTS Release(長期支持版本)驹溃,Weekly Release(每周更新版本)城丧。首先說一下這兩個版本,個人覺得和MIUI的更新類似豌鹤,一個開發(fā)版本一個穩(wěn)定版亡哄,大家可以自行選擇,功能上幾乎沒區(qū)別布疙。點擊尖角號會彈出操作系統(tǒng)蚊惯,可以選擇對應(yīng)的操作系統(tǒng)安裝,也可以直接下載2.xx.x.war包然后放在Tomcat(下文會詳細介紹Tomcat一些功能)的webapps目錄灵临,新建Jenkins文件夾再放入拣挪。

我選擇的是Windows安裝版的,首先安裝版和war版我都嘗試過俱诸,功能是沒區(qū)別的菠劝,主要的區(qū)別在于目錄上,安裝版指定安裝目錄以后幾乎所有的東西都會在對應(yīng)的文件夾下生成,比如Jobs(即存放工程目錄)赶诊,不會在其他磁盤再生成多余的文件夾笼平,而war版放在Tomcat目錄下以后,用瀏覽器打開舔痪,所有的東西會在C盤生成.Jenkins文件夾寓调。我自己是有一些強迫癥的,喜歡目錄整潔锄码,不生成多余文件夾的夺英。還有一個理由就是安裝版可以不依賴Tomcat,即使本機沒有安裝Tomcat滋捶,安裝版安裝完成后依然可以用本機ip:port啟動痛悯。大家可以自行選擇喜歡的版本。

由于安裝部分比較簡單重窟,就不上圖了载萌。

插件

1.進入管理插件

接下來就要說說,Jenkins最強大的部分之一了巡扇,那就是插件扭仁。Jenkins提供了非常多的插件,幾乎你想要的插件全有厅翔,前提是你能找的到~官網(wǎng)提供了插件搜索功能乖坠,選擇Plugins頁就可以各種搜索了。

重點來了(敲黑板刀闷,啪啪啪~):首次進入熊泵,首先要輸入一個密鑰來進入Jenkins,接下來...接下來...上圖

setup.png

一般選擇第一項即可涩赢,會自動安裝推薦的插件戈次,注意:這里并不是所有插件都能安裝成功轩勘,有的安裝失敗也不影響筒扒,所有的安裝完進行下一步就可以了。

But绊寻,有時候點擊以后會發(fā)生下面的情況

setup_error.png

怎么點擊Retry按鈕依然是錯誤花墩,這時候不要慌張,咱們選擇第一張圖中的第二項澄步,進行自己選擇冰蘑,這里系統(tǒng)推薦的插件默認也是選中的,直接點安裝即可村缸。But祠肥,個別情況依然會出現(xiàn)上圖的錯誤頁面,那么解決辦法就是:進入自行選擇頁面梯皿,清空選項即所有都不選仇箱,然后點安裝按鈕县恕,進入下一頁。

下一頁就是創(chuàng)建用戶頁面剂桥,這里建議創(chuàng)建用戶忠烛,下面提供了Continue as admin按鈕也可進入主頁,但是后期想創(chuàng)建用戶還是很麻煩的权逗,所以建議創(chuàng)建用戶美尸。

創(chuàng)建好用戶,就可以進入到主頁了~選擇系統(tǒng)管理->管理插件->可選插件來開始安裝我們需要的插件斟薇。

2.插件列表

注意:列表中為主要插件师坎,而Jenkins的插件是有依賴關(guān)系的,安裝一個插件可能要先安裝它依賴的插件奔垦,否則會安裝失敗屹耐。在可選插件勾選列表中的插件即可,依賴插件會自動下載椿猎,是不是很棒惶岭。

配置

插件安裝完畢,我們就可以來配置Jenkins了犯眠,打包又離我們近了一步按灶。

1.Global Tool Configuration

在系統(tǒng)管理選項中找到Global Tool Configuration進入,如果上面的插件安裝成功筐咧,在這里會看到三個板塊鸯旁,如圖


Global_Tool_Configuration.png

分別是JDK,Git量蕊,Gradle板塊铺罢,分別配置這三個的路徑。

  • JDK:別名=任意残炮,JAVA_HOME=JDK目錄
  • Git:別名=任意韭赘, Path to Git executable=Git安裝目錄\bin\git.exe
  • Gradle:別名=任意,GRADLE_HOME=Gradle下載目錄\Gradle\gradle-2.xx
    Gradle盡量配置多個势就,因為項目的gradle版本可能不一樣泉瞻,所以需要選擇不同的Gradle版本進行編譯

這個Gradle的目錄,可以是Android Studio默認下載的Gradle目錄苞冯,在用戶目錄的.gradle\wrapper\dists文件夾下袖牙,但是目錄不是很整潔;也可以到http://www.androiddevtools.cn找到gradle資源處下載常用的gradle版本舅锄,放到一個指定的文件夾鞭达,然后配置路徑即可,目錄比較整潔。

2.全局屬性

在這里最好配置一下全局屬性畴蹭,這里先說一個烘贴,就是配置Android SDK目錄,在打包是有可能會出現(xiàn)ANDROID_HOME not found的情況撮胧,所以在系統(tǒng)管理->系統(tǒng)設(shè)置->全局屬性版塊勾選上Environment variables選項桨踪,然后添加

android_home.png

記得更改值內(nèi)的路徑為本機sdk目錄。

注意:這里的鍵需要和本機環(huán)境變量內(nèi)的Android SDK目錄的鍵一致

打包

1.創(chuàng)建項目

距離開始打包又近了一步芹啥,接下來就開始創(chuàng)建新項目了锻离,點擊首頁的新建,進入下圖界面

create.png

給自己的項目起個名字墓怀,然后選擇構(gòu)建一個自由風(fēng)格的軟件項目汽纠,點擊OK按鈕,進入項目的配置界面傀履。

2.項目配置

直接選擇源碼管理tab或者向下滾動找到源碼管理虱朵,如圖;

source_manage.png

選中Git選項钓账,會出現(xiàn)上圖的界面碴犬,配置Git項目的URL,我測試用的是Github項目梆暮,并且傳輸協(xié)議選擇的是HTTP服协,需要選擇Credentials選項,選擇通行證啦粹,第一次需要點擊Add添加通行證偿荷,如圖:

credentials.png

Kind種類選擇默認的Username with password,然后在Username和Pasword處分別輸入Git賬戶的用戶名和密碼唠椭,然后滾動到下方點擊Add跳纳,然后在Credentials中選擇我們剛才添加的通行證。

接著滾動到構(gòu)建Tab贪嫂,點擊添加構(gòu)建步驟寺庄,然后選擇Invoke Gradle script,如圖:

build.png

然后配置構(gòu)建時的Gradle版本撩荣,和需要執(zhí)行的任務(wù)铣揉,如圖:

build1.png

這個Tasks是先clean工程饶深,然后打包所有渠道的Release版本餐曹,這是Gradle的命令,不多說了敌厘。然后點擊保存按鈕台猴,馬上就可以打包了。

3.開始構(gòu)建

點擊保存后,進入項目界面饱狂,如圖:

project.png

點擊左側(cè)菜單欄的立即構(gòu)建曹步,開始構(gòu)建項目,這時候Build History版塊會出現(xiàn)構(gòu)建任務(wù)列表休讳,點擊進入可以查看構(gòu)建詳情頁讲婚,如圖
project_build.png

又很多菜單可以選擇來查看狀態(tài),點擊Console Output來查看構(gòu)建輸出的日志俊柔,所有的信息都會顯示筹麸,日志最后輸出Finished: SUCCESS即構(gòu)建成功。

成功之后雏婶,返回項目地址就可以點擊工作空間物赶,在app的build目錄下面查看apk生成情況。

以上就是Jenkins打包最簡單的配置留晚,我知道大家想要的不止這些酵紫,更精彩的還在后面。

定制想要的功能

1.參數(shù)化構(gòu)建

在我們打包的時候错维,我們大多時候不想只是簡簡單單打一個版本的包奖地,我們想通過配置一下參數(shù),來滿足一些需求赋焕,比如根據(jù)渠道打不同版本的包鹉动、根據(jù)Tag打不同的包等,下面就來說一下Jenkins參數(shù)化構(gòu)建宏邮。

在我們項目中需要配置的選項有:版本(Release 或 Debug)泽示,版本號,渠道包蜜氨,根據(jù)Tag打包械筛。另外我們還需要加上打包途徑,AS打包還是Jenkins打的包飒炎,還要加一個時間戳埋哟。所有的參數(shù)列出來了,下面就配置Jenkins的參數(shù)化構(gòu)建吧~

在Jenkins項目主頁選擇配置郎汪,進入配置頁赤赊,在General tab將參數(shù)化構(gòu)建過程選中,如圖:

General.png

接下來就可以添加參數(shù)了煞赢,下面我先列出參數(shù)表格:

參數(shù)名 參數(shù)類型 參數(shù)值列表
BUILD_TYPE Choice Release or Debug
IS_JENKINS Choice true
PRODUCT_FLAVORS Choice Xiaomi 抛计、Wandoujia等
BUILD_TIME Dynamic Parameter 2016-12-21-11-11
APP_VERSION Choice 1.0.0、1.0.1等
GIT_TAG Git Parameter tag1.0.0等

下面直接放我的配置截圖:

build_type.png
product_flavor.png
app_version.png
is_jenkins.png
build_time.png

git_tag.png

配置完參數(shù)還不算完照筑,我們要在下方構(gòu)建時候引用吹截,首先找到構(gòu)建標簽處瘦陈,將Tasks屬性值修改為:

clean assemble${PRODUCT_FLAVORS}${BUILD_TYPE} --stacktrace --debug

其中${PRODUCT_FLAVORS}&{BUILD_TYPE}分別對應(yīng)上面的參數(shù)名。配置如圖:

build2.png

看了圖大家肯定留意到了紅色框內(nèi)的選項而且很好奇吧波俄,這個選項是APP_VERSION晨逝、IS_JENKINS、BUILD_TIME需要用到的懦铺,因為這三個參數(shù)需要注入到Android項目中的配置一樣捉貌,而紅色框中的這個選項可以幫我們侵入到gradle.properties文件中替換值,并且build.gradle文件能夠直接引用gradle.properties文件中的屬性冬念,所以起到了侵入的效果昏翰。下面分別是我的gradle.properties和主項目的build.gradle文件全代碼:

//gradle.properties

# Project-wide Gradle settings.
# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.org.gradle.jvmargs=-Xmx1536m
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
#http://www.gradle.org/docs/current/userguide/multi_project_builds.html
#sec:decoupled_projects
#org.gradle.parallel=true
APP_VERSION=1.0.1
IS_JENKINS=true
BUILD_TIME=''

//build.gradle

apply plugin: 'com.android.application'
def getDate() {    
    def date = new Date()    
    def formattedDate = date.format('yyyy-MM-dd-HH-mm')    
    return formattedDate
}
def verCode = 14
android {    
    compileSdkVersion 25    
    buildToolsVersion "25.0.0"    
    defaultConfig {        
        applicationId "com.zyyoona7.autobuildtest"        
        minSdkVersion 15        
        targetSdkVersion 23        
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"        
        multiDexEnabled true        
        versionCode verCode        
        versionName APP_VERSION    
    }    
    signingConfigs {        
        signingConfig {            
            //由于本地打包使用的是本機上的KeyStore            
            //而Jenkins打包用的是服務(wù)器上的KeyStore            
            //兩個路徑不一樣           
            if("true".equals(IS_JENKINS)){                
                storeFile file("服務(wù)器上KeyStore的路徑")            
            }else {                
                storeFile file(STORE_FILE_PATH)            
            }            
            keyAlias KEY_ALIAS            
            keyPassword KEY_PASSWORD            
            storePassword STORE_FILE_PASSWORD        
        }    
    }    
    buildTypes {        
        release {           
            minifyEnabled true            
            zipAlignEnabled true            
            shrinkResources true            
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'            
            signingConfig signingConfigs.signingConfig        
        }        
        debug {  }    
    }    
    dexOptions {        
        javaMaxHeapSize "2g"    
    }    
    //渠道Flavors   
    productFlavors {        
        wandoujia {            
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]        
        }        
        xiaomi {            
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]        
        }    
    }    
    //修改生成的apk名字及輸出文件夾    
    applicationVariants.all { variant ->        
        variant.outputs.each { output ->            
            //新名字            
           def newName            
           //時間戳            
           def timeNow            
           //輸出文件夾            
           def outDirectory            
           //是否為Jenkins打包,輸出路徑不同           
            if ("true".equals(IS_JENKINS)) {                
               //Jenkins打包輸出到服務(wù)器路徑                
               timeNow = BUILD_TIME                
               //BUILD_PATH為服務(wù)器輸出路徑                
               outDirectory = BUILD_PATH                
               //AutoBuildTest-v1.0.1-xiaomi-release.apk                
               newName = 'AutoBuildTest-v' + APP_VERSION + '-' + variant.productFlavors[0].name + '-' + variant.buildType.name + '.apk'            
           } else {                
               //本機打包輸出在本機路徑                
               timeNow = getDate()                
               outDirectory = output.outputFile.getParent()                
               if ('debug'.equals(variant.buildType.name)) {                    
                   newName = "AutoBuildTest-v${APP_VERSION}-debug.apk"                
               } else {                    
                   //AutoBuildTest-v1.0.1-xiaomi-release.apk                    
                   newName = 'AutoBuildTest-v' + APP_VERSION + '-' + variant.productFlavors[0].name + '-' + variant.buildType.name + '.apk'                
               }            
           }            
           output.outputFile = new File(outDirectory+'/'+timeNow, newName)        
       }    
    }
}

dependencies {    
    compile fileTree(dir: 'libs', include: ['*.jar'])    
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {        
        exclude group: 'com.android.support', module: 'support-annotations'    
    })    
    compile 'com.android.support:appcompat-v7:25.0.0'    
    testCompile 'junit:junit:4.12'
}

這樣在Jenkins打包的時候上面三個參數(shù)就會隨著選擇變化而變化了刘急。

GIT_TAG參數(shù)使用配置棚菊,只需在源碼管理處的Branch引用改為$GIT_TAG引用參數(shù)名,如圖:

git_tag_use.png

參數(shù)配置完畢叔汁,看一下主頁面的效果吧统求,現(xiàn)在立即構(gòu)建選項變成了_ Build with Parameters_,完成圖:

build_with_parameters.png

提示:

  • 如果選中了GIT_TAG中的任意版本都無法取消選中据块,只能刷新码邻;
  • 還有使用GIT_TAG時最好選擇tag版本大于等于支持Jenkins打包的版本,因為之前版本代碼中沒加需要侵入的屬性

2.按時打包

由于篇幅原因加上這個功能我沒用在項目中另假,所以請參考使用Jenkins搭建iOS/Android持續(xù)集成打包平臺配置構(gòu)建觸發(fā)器部分像屋。

3.構(gòu)建命名

每次構(gòu)建的時候,Build History模塊顯示是這樣的边篮,如圖:

build_history.png

每次構(gòu)建都只顯示數(shù)字(#xx)己莺,這樣很不好看,我們想要它顯示更多的信息怎么辦呢戈轿?比如加入構(gòu)建者姓名凌受、構(gòu)建的app版本、構(gòu)建的類型等思杯。請看下圖:

set_build_name.png

配置完以后再次打包胜蛉,變成了這個樣子,如圖:
build_history1.png

是不是很Nice色乾,當然大家還可以根據(jù)需求自行發(fā)揮~

4.Tomcat配置下載地址

打完包放在服務(wù)器上誊册,我們得配置一下下載環(huán)境才能下載,首先是Tomcat的安裝暖璧,這里對Tomcat安裝就不做詳細的介紹了案怯,如果不熟悉的請自行谷歌或百度,下面內(nèi)容需基于Tomcat環(huán)境進行漆撞,我的Tomcat版本為8.0+殴泰。

這里說一下如何使用Tomcat配置下載地址,首先進入Tomcat目錄下的conf文件夾浮驳,然后打開server.xml文件在最后添加如圖代碼:

erver.png
<!-- docBase為絕對路徑即板寸apk文件的文件夾悍汛,path為相對地址即在地址欄訪問的地址-->
<Context  reloadable="true" docBase="C://android/downloadApk" crossContext="true" path="/downloadApk"/>

添加完這句話以后啟動Tomcat服務(wù),打開瀏覽器輸入IP:Port/downloadApk至会,就可以訪問了點擊你想要的文件下載吧离咐。

5.二維碼下載

二維碼下載功能,現(xiàn)在網(wǎng)上大多數(shù)的做法是通過蒲公英或者fir.im來生成二維碼奉件,這兩個都是內(nèi)測平臺宵蛀,我體驗過蒲公英,需要將文件傳到蒲公英網(wǎng)站然后他們生成二維碼返回县貌,傳到別處總感覺怪怪的术陶,于是我決定自己生成二維碼然后放在下載地址的文件夾中,通過鏈接顯示煤痕。

首先要在電腦上安裝python環(huán)境梧宫,請看http://www.cnblogs.com/yuanzm/p/4089856.html(Python問題一)python 安裝PIL (Python Imaging Library )來進行安裝,如果已經(jīng)安裝繼續(xù)往下看摆碉。生成二維碼我用了qrcode這個庫塘匣,感謝大神的分享,這個庫如何使用就不介紹了巷帝,我只說一下Jenkins如何執(zhí)行python忌卤。

添加python的環(huán)境變量到Jenkins的環(huán)境變量中,文章前面有提到過楞泼,在系統(tǒng)管理->系統(tǒng)設(shè)置中驰徊,如圖添加python環(huán)境變量:

python.png

注意:鍵名需要和電腦上系統(tǒng)環(huán)境變量內(nèi)的鍵名保持一致。

然后打開項目配置頁面堕阔,在構(gòu)建版塊點擊添加構(gòu)建步驟辣垒,如圖:

add_build.png

在編輯框內(nèi)輸入qrcode項目的使用命令

python_build.png

注意:下載地址需要自己拼接,生成路徑也需要自己拼接印蔬。

這樣每次打包后都會在生成apk的文件夾內(nèi)生成一個對應(yīng)的二維碼勋桶。掃一掃就可以下載啦~~~

6.構(gòu)建后操作

構(gòu)建完成后,我希望將下載地址和二維碼放在Build History的版塊中侥猬,方便下載例驹,那么我們就來設(shè)置一下,打開項目配置頁退唠,如圖操作:

build_after.png

Description輸入框內(nèi)添加

<!-- 需替換鏈接地址 -->
![](http:/192.168.1.88:8088/downloadApk/${BUILD_TIME}/qrcode.png)<br>
<a >下載連接</a>

7.郵件通知

打完包鹃锈,我想通知需要下載的人怎么辦?發(fā)郵件~~Jenkins自帶了郵件功能瞧预,但是不太好用屎债,所以我選擇了Email Extension Plugin這個插件來實現(xiàn)發(fā)郵件功能(已經(jīng)在插件列表中)仅政。進入系統(tǒng)管理->系統(tǒng)設(shè)置頁面,如圖:

mail.png

郵件格式:

[Jenkins構(gòu)建通知]$PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS!

(郵件由Jenkins自動發(fā)出盆驹,請勿回復(fù)~)<br>
項目名稱:$PROJECT_NAME<br>
構(gòu)建編號:$BUILD_NUMBER<br>
構(gòu)建狀態(tài):$BUILD_STATUS<br>
觸發(fā)原因:${CAUSE}<br>
構(gòu)建地址:<A HREF="${BUILD_URL}">${BUILD_URL}</A><br>
構(gòu)建輸出日志:<a >http://192.168.1.201:8090/job/${PROJECT_NAME}/${BUILD_NUMBER}/console</a><br>
下載地址:<a >http://192.168.1.88:8088/downloadApk</a><br><br>
二維碼下載:![](http://192.168.1.88:8088/downloadApk/${BUILD_TIME}/qrcode.png)<br>
最近修改:<br>${CHANGES, showPaths=false, format="%a:\"%m\"<br>", pathFormat="\n\t- %p"}

注意:請自行修改對應(yīng)的地址圆丹,關(guān)于最近修改請參照http://stackoverflow.com/questions/7773010/how-to-include-git-changelog-in-jenkins-emails

最終的效果圖是介個樣子的:

mail1.png

遇到的錯誤

1.AAPT err(Facade for 26390200):build-tools/23.0.1/aapt: /lib/libc.so.6: version `GLIBC_2.11' not found /23.0.1/aapt)####

在將Jenkins部署到linux服務(wù)器的時候出現(xiàn)了這個錯誤,lib/libc.so.6是linux系統(tǒng)的c庫躯喇,由于我們公司服務(wù)器的linux系統(tǒng)太老辫封,導(dǎo)致最高支持GLIBC_2.5,雖然可以通過升級內(nèi)核來解決廉丽,但是有風(fēng)險倦微,所以最后決定還是部署到了Windows服務(wù)器上面。所以在部署到Linux服務(wù)器上面之前先檢查你的Linux系統(tǒng)所支持的GLIBC_2.xx的版本正压,Android Build-Tools 25.0.0的需要GLIBC_2.14欣福。

2.local.properties:sdk.dir not found or ANDROID_HOME not found

不好意思,因為沒及時記錄所以這個錯誤我只記了大概焦履,而且配置完以后劣欢,想出現(xiàn)這個錯誤竟然沒復(fù)現(xiàn),所以只能看個大概了裁良。這個錯誤主要是配置Android SDK路徑為ANDROID_HOME環(huán)境變量沒有配置凿将。Windows上面配置一下環(huán)境變量;名字ANDROID_HOME:值為Android SDK路徑牧抵。還有一種方法,配置Jenkins的環(huán)境變量名字和值和上面一樣犀变,添加到系統(tǒng)管理->系統(tǒng)設(shè)置->全局屬性下面有一個Environment variables 勾上秋柄,然后添加環(huán)境變量即可

總結(jié)

Jenkins打包并不難,最難的地方就是安裝插件骇笔,由于公司網(wǎng)絡(luò)不太給力導(dǎo)致安裝插件至少半天,坑啊~~~

如果在Linux系統(tǒng)上和Mac上使用Jenkins的化設(shè)置起來幾乎無差別笨触,只是需要的文件格式大同小異而已。

由于篇幅比較多粗俱,希望大家看完多多反饋,有什么問題也可以留言寸认。

參考

使用Jenkins搭建iOS/Android持續(xù)集成打包平臺
利用Jenkins玩轉(zhuǎn)Android自動打包發(fā)包

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市偏塞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌烛愧,老刑警劉巖油宜,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件掂碱,死亡現(xiàn)場離奇詭異怜姿,居然都是意外死亡,警方通過查閱死者的電腦和手機疼燥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門沧卢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人醉者,你說我怎么就攤上這事但狭。” “怎么了撬即?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵立磁,是天一觀的道長。 經(jīng)常有香客問我剥槐,道長唱歧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任粒竖,我火速辦了婚禮颅崩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蕊苗。我一直安慰自己沿后,他們只是感情好,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布朽砰。 她就那樣靜靜地躺著尖滚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瞧柔。 梳的紋絲不亂的頭發(fā)上熔掺,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機與錄音置逻,去河邊找鬼券坞。 笑死,一個胖子當著我的面吹牛宇驾,可吹牛的內(nèi)容都是我干的课舍。 我是一名探鬼主播筝尾,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼筹淫,長吁一口氣:“原來是場噩夢啊……” “哼损姜!你這毒婦竟也來了摧阅?” 一聲冷哼從身側(cè)響起棒卷,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤娇跟,失蹤者是張志新(化名)和其女友劉穎苞俘,沒想到半個月后吃谣,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體岗憋,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡仔戈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年晋修,在試婚紗的時候發(fā)現(xiàn)自己被綠了凰盔。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片户敬。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡忠怖,死狀恐怖屁倔,靈堂內(nèi)的尸體忽然破棺而出锐借,到底是詐尸還是另有隱情钞翔,我是刑警寧澤席舍,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布汰扭,位于F島的核電站萝毛,受9級特大地震影響滑黔,放射性物質(zhì)發(fā)生泄漏略荡。R本人自食惡果不足惜汛兜,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望衡创。 院中可真熱鬧璃氢,春花似錦一也、人聲如沸椰苟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽性锭。三九已至草冈,卻和暖如春怎棱,著一層夾襖步出監(jiān)牢的瞬間拳恋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工讳苦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留鸳谜,地道東北人咐扭。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓袜爪,卻偏偏與公主長得像辛馆,于是被迫代替她去往敵國和親豁延。 傳聞我的和親對象是個殘疾皇子诱咏,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容