App的分發(fā)測試(六) —— GitHub, Fastlane & Jenkins集成(二)

版本記錄

版本號 時間
V1.0 2019.04.30 星期二

前言

我們在做App開發(fā)的時候导狡,開發(fā)人員開發(fā)完成以后就要交給QA進行測試了筹燕,有幾種方式,一種就是將QA的測試機加到賬號里面的Device里面密任,這個有個數(shù)限制(每種硬件類型不能超過100臺,即使刪除設備也不會重置)偷俭,然后利用三方平臺比如說蒲公英進行分發(fā)浪讳,還有一種方法就是使用TestFlight進行測試,這個專題就主要說一下App分發(fā)測試相關的內容涌萤。感興趣的看上面幾篇驻债。
1. App的分發(fā)測試(一) —— 淺談蒲公英平臺分發(fā)測試的使用(一)
2. App的分發(fā)測試(二) —— TestFlight集成和分發(fā)測試(一)
3. App的分發(fā)測試(三) —— fastlane自動化打包并上傳(一)
4. App的分發(fā)測試(四) —— fastlane自動化打包(一)
5. App的分發(fā)測試(五) —— GitHub, Fastlane & Jenkins集成(一)

Doing CI With Jenkins

Travis CI是一種即時感覺良好的體驗乳规,為什么你會看到其他地方? 好吧合呐,也許是因為您需要私有存儲庫的CI - 請查看Travis CI Plans & Pricing暮的。 或者,如果您的團隊或公司已經維護或租用服務器淌实,那么安裝Jenkins可能更具成本效益冻辩。

1. Installing Jenkins

Jenkins Docker圖像存在,但在Docker容器中運行的Jenkins將無法運行xcodebuild拆祈,因此您將直接在Mac上安裝Jenkins恨闪。 訪問the Jenkins download page并單擊Mac OS X,下載安裝程序放坏。

安裝程序下載時咙咽,請檢查是否安裝了適當?shù)?code>Java。 您需要Java 1.8才能安裝Jenkins淤年。 Mojave沒有預安裝Java钧敞,但如果您不確定,請輸入此命令以查看您是否已擁有它:

java -version

如果輸出不包含java version “1.8 …”麸粮,則需要安裝它溉苛。 雖然您可以從Oracle網站下載它,但使用Homebrew(一種流行的macOS包管理器)安裝它會更簡單弄诲。 如果您尚未安裝Homebrew愚战,請在終端中輸入以下命令:

/usr/bin/ruby -e \
  "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

如果有提示,請輸入密碼齐遵。 完成后寂玲,您應該看到Installation Successful

要安裝Java梗摇,請在終端中輸入以下命令:

brew cask install homebrew/cask-versions/java8

再次拓哟,如果出現(xiàn)提示,請輸入密碼留美。

安裝Java 1.8后,運行Jenkins安裝程序伸刃,該安裝程序現(xiàn)在應該已經完成下載谎砾。 安裝程序完成后,應該在瀏覽器中打開localhost:8080 - 它需要一個密碼:

查找初始管理員密碼(initial admin password)的最簡單方法是查看日志 - 輸入以下命令:

cat /var/log/jenkins/jenkins.log

此日志中有很多內容捧颅,但您只需從底部向上滾動一下即可查看兩行三行星號之間的密碼:

*************************************************************
*************************************************************
*************************************************************

Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:

<your initial admin password>

This may also be found at: /Users/Shared/Jenkins/Home/secrets/initialAdminPassword

*************************************************************
*************************************************************
*************************************************************

復制密碼并將其粘貼到管理員密碼(Administrator password)輸入框中景图。 單擊Continue以加載Customize Jenkins頁面:

注意:如果您獲得的頁面指示您的代理服務器配置不正確,而不是自定義Jenkins頁面碉哑,您就會遇到Jenkins組織的Web證書問題挚币。 要解決此問題亮蒋,請在終端中輸入以下命令:

sudo nano /Users/Shared/Jenkins/Home/hudson.model.UpdateCenter.xml

這將在簡單的文本編輯器中打開違規(guī)配置文件。 找到https并將其更改為http妆毕。 要退出編輯器并保存文件慎玖,請按Control-C,然后按Y笛粘,最后按Enter鍵趁怔。 現(xiàn)在,在瀏覽器中刷新頁面薪前,您應該看到正確的頁面润努。

選擇Install suggested plugins,然后去散步 - 這需要幾分鐘示括。

啊铺浇,你回來了! 現(xiàn)在創(chuàng)建您的管理員帳戶 - 為用戶名和密碼輸入admin

Instance Configuration頁面上垛膝,只需單擊Not now

在下一頁上鳍侣,單擊使用Jenkins開始:

2. Your First Jenkins Build

接下來,您將看到一個歡迎頁面繁涂,提示您create new jobs

點擊該鏈接拱她,您需要登錄:

只需使用您的admin/admin帳戶,然后選中Keep me signed in扔罪。

在下一頁上秉沼,輸入Numero作為項目名稱(item name),然后選擇Freestyle project

這是你的新項目頁面矿酵! 從側面菜單中選擇Configure以真正開始唬复! 當然,如果Jenkins沒有自動帶你進入配置頁面全肮!

項目配置頁面有幾個選項卡敞咧。 從第一個開始 - General - 您需要做的就是檢查GitHub project,然后將您的存儲庫URL粘貼到出現(xiàn)的Project url字段中辜腺。 為簡單起見休建,請確保使用HTTPS而不是對GitHubSSH訪問。

接下來评疗,向下滾動或單擊Source Code Management:選擇Git并再次粘貼您的Repository URL测砂。

注意:您不需要為本教程輸入Credentials,但是您可以提供這些憑據以授予Jenkins對私有存儲庫的訪問權限百匆。 另外砌些,請注意要構建的分支(Branches to build)部分 - 您不會在本教程中使用它,但它對您自己的項目很方便。

向下滾動構建觸發(fā)器(Build Triggers ) - 稍后您將返回此選項卡存璃。

下一節(jié)是構建環(huán)境(Build Environment):有時構建會繼續(xù)進行仑荐,即使在控制臺日志顯示已完成之后,因此纵东,請檢查Abort the build if it’s stuck并選擇No Activity作為超時策略(Time-out strategy)粘招。 如果您想知道事情何時發(fā)生,還要檢查添加時間戳到控制臺輸出(Add timestamps to the Console Output)篮迎。

最后男图,構建部分就是進行工作的一切! 在Add build step步驟菜單中甜橱,選擇Execute shell

在出現(xiàn)的Command字段中逊笆,粘貼此shell命令:

xcodebuild -scheme Numero -configuration Debug build test \
  -destination 'platform=iOS Simulator,name=iPhone 8'

單擊Save按鈕返回項目頁面,然后從側邊菜單中選擇Build Now

Build History部分開始發(fā)生一些事情 - 你的第一個版本出現(xiàn)了岂傲! 將光標懸停在#1上以顯示菜單按鈕难裆,然后從菜單中選擇Console Output

以下是我的控制臺日志中的一些亮點:

16:46:07 Test Suite 'ConverterTests' started at 2019-02-18 16:46:07.264
16:46:07 Test Case '-[NumeroTests.ConverterTests testConversionForOne]' started.
16:46:07 Test Case '-[NumeroTests.ConverterTests testConversionForOne]' passed (0.004 seconds).
...
16:46:07 Test session results and logs:
16:46:07    /Users/Shared/Jenkins/Library/Developer/Xcode/DerivedData/Numero-bhnpnysdndqcwobwddhndhxectdi/Logs/Test/Run-Numero-2019.02.18_16-45-19-+1100.xcresult
...
16:46:07 ** TEST SUCCEEDED **
16:46:07 
16:46:14 Testing started on 'iPhone 8'
16:46:16 Finished: SUCCESS

確實成功!

3. Notifying Jenkins With GitHub Webhook

太棒了镊掖,Jenkins拉了你的項目乃戈,建立它并運行測試。 但你必須告訴它Build Now - 這不是很自動化亩进。 一旦你按照Travis CI的方式推送GitHub症虑,你就希望Jenkins能夠拉動你的項目。 事實證明归薛,Travis CI自動與GitHub做了一些事情谍憔,你現(xiàn)在必須手動完成。

您需要創(chuàng)建一個GitHub webhook主籍,以便在您推送新提交時通知Jenkins服務器习贫。 webhook是一種GitHub機制,用于在GitHub存儲庫中發(fā)生特定事件時將通知發(fā)布到webhook的URL - 例如千元,每當您推送提交時苫昌。

首先,設置Jenkins項目以期待來自GitHub的通知:使用Numero菜單返回到Configure

選擇Build Triggers選項卡并選中GitHub hook trigger for GITScm polling

滾動到底部幸海,然后按Save祟身。

現(xiàn)在轉到GitHub頁面設置webhook

如果您想在存儲庫中禁用Travis-CI以避免在兩個位置都運行構建物独,則需要從存儲庫中卸載Travis袜硫。 這是可選的;看下面以顯示說明议纯。 或者父款,讓它保持運行并跳過為Jenkins創(chuàng)建webhook溢谤。

Numero存儲庫頁面上瞻凤,單擊Settings憨攒,選擇Integrations & Services,然后單擊Travis CI行中的Configure阀参。

滾動到底部肝集,然后單擊Uninstall。 單擊OK蛛壳,GitHub將安排工作以刪除Travis杏瞻。

要為Jenkins服務器添加webhook,請轉到Numero存儲庫頁面衙荐,然后單擊Settings捞挥。 從側邊菜單中選擇Webhooks,然后單擊Add webhook

您需要的第一件事是Payload URL - Jenkins服務器的URL忧吟。 但是砌函,除非您使用適當?shù)耐獠縐RL設置Jenkins,否則返回Instance Configuration步驟溜族,您將在使用本教程時使用localhost讹俊。 但GitHub需要一個真實的URL來發(fā)送通知 - 該怎么辦?

ngrok可以幫助你煌抒! 這是一個免費的應用程序仍劈,它使用安全隧道將localhost暴露給互聯(lián)網。GitHub’s webhooks tutorial使用它寡壮,所以一定是OK贩疙。 繼續(xù)download ngrok for Mac OS X

在終端,cdngrok所在的位置诬像,然后運行以下命令:

./ngrok http 8080

您的輸出看起來類似于:

ngrok by @inconshreveable                                       (Ctrl+C to quit)
                                                                                
Session Status                online                                            
Session Expires               7 hours, 59 minutes                               
Version                       2.2.8                                             
Region                        United States (us)                                
Web Interface                 http://127.0.0.1:4040                             
Forwarding                    http://4c94cdf1.ngrok.io -> localhost:8080        
Forwarding                    https://4c94cdf1.ngrok.io -> localhost:8080       
                                                                                
Connections                   ttl     opn     rt1     rt5     p50     p90       
                              0       0       0.00    0.00    0.00    0.00 

復制你的轉發(fā)網址(Forwarding URL) - 我的是http://4c94cdf1.ngrok.io屋群,接下來將近8個小時。

返回GitHub Add webhook頁面坏挠,將此URL粘貼到Payload URL字段中芍躏,并將/ github-webhook /添加到URL的末尾。 這是Jenkins服務器上的端點降狠,它響應來自GitHub的推送:

注意:默認事件設置是Just the push event对竣。 您可以隨時更改訂閱的事件列表。 可用事件的完整列表位于Webhooks documentation中榜配。

單擊Add Webhook否纬。 GitHub向URL發(fā)送測試POST請求,該請求以302 Found響應蛋褥,這意味著URL已被重定向临燃。 不要擔心GitHub會將此標記為失敗。

現(xiàn)在,在ConverterTests.swift中將這個新的單元測試添加到Numero膜廊,所以你可以推送到GitHub乏沸,它會通知你的Jenkins服務器:

func testConversionForTwo() {
  let result = converter.convert(2)
  XCTAssertEqual(result, "II", "Conversion for 2 is incorrect")
}

注意:我們回到了TDD的紅色步驟,所以這個測試將失敗 - convert(_:)返回“I”爪瓜,而不是“II”蹬跃。

提交并推送到GitHub,然后檢查你的Jenkins頁面 - Numero的菜單現(xiàn)在有一個項目GitHub Hook Log铆铆!

選擇GitHub Hook Log:來自您的ngrok URL的事件導致Jenkins輪詢您的GitHub存儲庫以查找更改蝶缀,它發(fā)現(xiàn):

你對GitHub的推動觸發(fā)了構建#2 - 它的亮度為紅色,因為單元測試失敗了薄货。 使用彈出菜單查看構建#2Console Output

完全向下滾動以查看測試結果:

13:48:12 Test Suite 'All tests' started at 2019-02-19 13:48:12.227
13:48:12 Test Suite 'NumeroTests.xctest' started at 2019-02-19 13:48:12.228
13:48:12 Test Suite 'ConverterTests' started at 2019-02-19 13:48:12.228
13:48:12 Test Case '-[NumeroTests.ConverterTests testConversionForOne]' started.
13:48:12 Test Case '-[NumeroTests.ConverterTests testConversionForOne]' passed (0.002 seconds).
13:48:12 Test Case '-[NumeroTests.ConverterTests testConversionForTwo]' started.
13:48:12 /Users/Shared/Jenkins/Home/workspace/Numero/NumeroTests/ConverterTests.swift:32: error: -[NumeroTests.ConverterTests testConversionForTwo] : XCTAssertEqual failed: ("I") is not equal to ("II") - Conversion for 2 is incorrect
...
13:48:15 Failing tests:
13:48:15    ConverterTests.testConversionForTwo()
13:48:15 ** TEST FAILED **
13:48:15 
13:48:21 Testing started on 'iPhone 8'
13:48:21 Build step 'Execute shell' marked build as failure
13:48:21 Finished: FAILURE

祝賀你自己 - 你已經建立了從GitHubJenkins的溝通翁都! Travis CI為您自動神奇地做了些什么。 好吧谅猾,Travis CI有一個固定的URL荐吵,因此更容易 - 不需要ngrok

Travis CI還有另一個有用的默認行為:它發(fā)送電子郵件通知您構建結果赊瞬。 您可以設置Jenkins來執(zhí)行此操作先煎,但您必須做一些工作。

4. Emailing From Jenkins

首先巧涧,您需要一個SMTP(簡單郵件傳輸協(xié)議)服務器(SMTP (Simple Mail Transfer Protocol) server)悄但。 您可以使用Postfix配置一個漆改,但本教程使用smtp.gmail.com - 您需要一個Google帳戶才能跟進。

這一次,您必須配置項目和Jenkins系統(tǒng)栗恩。

Configuring Your Project

從項目開始:使用Numero菜單返回Configure蕴纳,然后選擇Post-build Actions選項卡爵卒。

Add post-build action菜單中锌仅,選擇Editable Email Notification

在顯示的表單中,您不必編輯任何內容瞎抛,但請注意項目收件人列表的值為$ DEFAULT_RECIPIENTS - 您需要確保在找到該字段時編輯該字段艺演。

在此表單下方,單擊Advanced Settings…以查看更多選項:默認觸發(fā)器是Failure – Any桐臊,因此您無需執(zhí)行任何操作來阻止成功發(fā)送電子郵件胎撤。

要復制Travis CI的默認行為,請從Add Trigger菜單中選擇Always

單擊Always部分中的Advanced…并將您的電子郵件地址添加到Recipient List

注意:這只是保險断凶,以確保收件人列表不為空伤提。

單擊Save返回項目頁面。

Configuring Your Jenkins System

現(xiàn)在配置Jenkins系統(tǒng):使用Jenkins菜單選擇Manage Jenkins ? Configure System

向下滾動到擴展電子郵件通知并安頓下來進行大量填寫表格认烁!

  • 1) 對于SMTP服務器肿男,鍵入smtp.gmail.com介汹,然后單擊Advanced…
  • 2) 選中Use SMTP Authentication舶沛,然后鍵入您的Google用戶名和密碼痴昧。
  • 3) 選中使用SSL
  • 4) 對于SMTP端口冠王,請鍵入465
  • 5) 對于默認收件人(Default Recipients)(ahaI嘞狻)柱彻,請鍵入您的電子郵件地址。
  • 6) 單擊Apply以保存您的條目餐胀,但請保留在此頁面上哟楷。

完全向下滾動到(普通舊的)E-mail Notification,然后單擊Advanced…:您的所有電子郵件設置應該已經在這里否灾;如果沒有卖擅,請再次輸入。

在底部墨技,選中Test configuration by sending test e-mail惩阶,然后填寫您的電子郵件地址。

在單擊Test configuration之前扣汪,還需要做一件事断楷。 由于Google已加強安全性,請轉到Less secure app access并將開關彈至ON

現(xiàn)在返回Jenkins并單擊Test configuration崭别。 稍等一下冬筒,您應該看到“Email was successfully sent”。 查看您的電子郵件茅主,找到:

注意:如果收到有關Username and Password not accepted的錯誤消息舞痰,請在兩個位置檢查SMTP驗證用戶名(SMTP Authentication User Name)和密碼。 同時將安全應用程序訪問權限關閉然后打開诀姚,可能不止一次响牛。

Pushing to GitHub

現(xiàn)在編輯Converter.swift中的代碼,使您的第二個單元測試通過赫段。 編輯convert(_ :)方法娃善,使其返回一個String,其中包含正確數(shù)量的“I”字符:

func convert(_ number: Int) -> String {
  return String(repeating: "I", count: number)
} 

提交并推送到GitHub瑞佩,然后觀察您的構建的控制臺日志 - 它應以“2 tests, with 0 failures”結束聚磺,并將電子郵件發(fā)送到您的電子郵件地址:

20:54:28 Test Suite 'ConverterTests' passed at 2019-02-19 20:54:28.700.
20:54:28     Executed 2 tests, with 0 failures (0 unexpected) in 0.002 (0.003) seconds
20:54:28 Test Suite 'NumeroTests.xctest' passed at 2019-02-19 20:54:28.701.
20:54:28     Executed 2 tests, with 0 failures (0 unexpected) in 0.002 (0.003) seconds
20:54:28 Test Suite 'All tests' passed at 2019-02-19 20:54:28.701.
20:54:28     Executed 2 tests, with 0 failures (0 unexpected) in 0.002 (0.004) seconds
20:54:29 
20:54:29 
20:54:29 Test session results and logs:
20:54:29    /Users/Shared/Jenkins/Library/Developer/Xcode/DerivedData/Numero-bhnpnysdndqcwobwddhndhxectdi/Logs/Test/Run-Numero-2019.02.19_20-54-23-+1100.xcresult
20:54:29 
20:54:29 2019-02-19 20:54:29.034 xcodebuild[49013:36278327] [MT] IDETestOperationsObserverDebug: 1.783 elapsed -- Testing started completed.
20:54:29 2019-02-19 20:54:29.034 xcodebuild[49013:36278327] [MT] IDETestOperationsObserverDebug: 0.000 sec, +0.000 sec -- start
20:54:29 2019-02-19 20:54:29.034 xcodebuild[49013:36278327] [MT] IDETestOperationsObserverDebug: 1.783 sec, +1.783 sec -- end
20:54:29 ** TEST SUCCEEDED **
20:54:29 
20:54:29 Testing started on 'iPhone 8'
20:54:29 Email was triggered for: Always
20:54:29 Sending email for trigger: Always
20:54:29 Sending email to: audrey.tam@xxxxxxx
20:54:33 Finished: SUCCESS

還有電子郵件:

呼! 這比Travis CI花費的時間要長一些炬丸,但你已經完成了基本的CI工作流程瘫寝,推動了GitHub觸發(fā)Jenkins構建蜒蕾,觸發(fā)了電子郵件通知。 休息一下吧焕阿!

注意:請務必關閉Gmail帳戶中安全性較低的應用訪問權限(Less secure app access)咪啡。

5. Using fastlane With Jenkins

要使用帶有Jenkinsfastlane,你需要在你的Mac上安裝它暮屡。輸入ruby -v檢查你有Ruby 2.0xcode-select --install以確保你有Xcode命令行 工具(CLT)(Xcode Command Line Tools (CLT))撤摸,然后輸入此命令在/ usr / local / bin中安裝fastlane

sudo gem install -n /usr/local/bin fastlane --verbose

安裝fastlane時,在Jenkins項目的Build?Command字段中褒纲,將xcodebuild命令替換為:

fastlane scan

安裝fastlane后准夷,cdNumero的根目錄,然后輸入以下命令:

fastlane init

fastlane詢問“What would you like to use fastlane for?”時莺掠,請選擇4. Manual setup衫嵌。 這只是將Gemfilefastlane文件夾添加到您的項目中。 提交并推送到GitHub彻秆,開始下一個構建楔绞。

注意:如果Jenkins說它不知道fastlane的位置,請在Command字段中指定完整路徑唇兑。 您可以在終端Terminal找到完整路徑酒朵,使用哪個快速通道(which fastlane)

6. Cleaning Up

Jenkins作為啟動守護程序運行扎附,因此它可以在您退出甚至終止進程后重新啟動耻讽。 要停止Jenkins,請在終端中運行此命令:

sudo launchctl unload /Library/LaunchDaemons/org.jenkins-ci.plist

重啟Mac時帕棉,啟動守護程序會重新啟動针肥,只有當您嘗試在localhost:8080上公開其他服務并發(fā)現(xiàn)它已在使用時才會發(fā)現(xiàn)! 要完全卸載Jenkins香伴,請運行以下命令:

/Library/Application Support/Jenkins/Uninstall.command

檢查這是否已刪除Applications / Jenkins/ Users / Shared / Jenkins慰枕,以及System Preferences ? Users & Groups中的未命名標準用戶 - 當您重新啟動Mac時,您不應該看到以Jenkins身份登錄的選項即纲。

在本教程中具帮,您開始使用Travis CIJenkinsTravis CI是開始使用CI的超級簡單途徑低斋,所以不再有任何借口蜂厅! Jenkins需要更多的努力來建立,但私人存儲庫沒有額外的成本膊畴,而且它比Travis CI更靈活掘猿。

以下是Travis CI,Jenkinsfastlane的一些有用的參考資料:

還有許多其他CI服務或產品唇跨。 fastlane文檔包括與fastlane集成的簡短列表short list稠通。

除了CI就是CDContinuous Delivery衬衬,您可以自動執(zhí)行發(fā)布流程,以便隨時準備將更改部署到用戶改橘,以及持續(xù)部署(Continuous Delivery)滋尉,您可以自動部署每個更改。您可以使用Jenkins管道和fastlane的組合轉移到CD飞主∈ㄏВ或者您可能會發(fā)現(xiàn)Travis CI的部署(deploy)命令已足夠 - 例如,自動部署到Heroku( deploy to Heroku)碌识。

后記

本篇主要講述了GitHub, Fastlane & Jenkins集成碾篡,感興趣的給個贊或者關注~~~

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市丸冕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌薛窥,老刑警劉巖胖烛,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異诅迷,居然都是意外死亡佩番,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門罢杉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來趟畏,“玉大人,你說我怎么就攤上這事滩租「承悖” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵律想,是天一觀的道長猎莲。 經常有香客問我,道長技即,這世上最難降的妖魔是什么著洼? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮而叼,結果婚禮上身笤,老公的妹妹穿的比我還像新娘。我一直安慰自己葵陵,他們只是感情好液荸,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著脱篙,像睡著了一般莹弊。 火紅的嫁衣襯著肌膚如雪涤久。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天忍弛,我揣著相機與錄音响迂,去河邊找鬼。 笑死细疚,一個胖子當著我的面吹牛蔗彤,可吹牛的內容都是我干的。 我是一名探鬼主播疯兼,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼然遏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了吧彪?” 一聲冷哼從身側響起待侵,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎姨裸,沒想到半個月后秧倾,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡傀缩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年那先,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赡艰。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡售淡,死狀恐怖,靈堂內的尸體忽然破棺而出慷垮,到底是詐尸還是另有隱情揖闸,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布料身,位于F島的核電站楔壤,受9級特大地震影響,放射性物質發(fā)生泄漏惯驼。R本人自食惡果不足惜蹲嚣,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望祟牲。 院中可真熱鬧隙畜,春花似錦、人聲如沸说贝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽乡恕。三九已至言询,卻和暖如春俯萎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背运杭。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工夫啊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人辆憔。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓撇眯,卻偏偏與公主長得像,于是被迫代替她去往敵國和親虱咧。 傳聞我的和親對象是個殘疾皇子熊榛,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內容