iOS自動(dòng)化打包 Jenkins+fastlane+蒲公英+釘釘

一逞姿、Homebrew

Homebrew是一款Mac OS平臺(tái)下的軟件包管理工具

  1. 安裝Homebrew
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
  1. 檢測(cè)Homebrew是否安裝成功
brew -v
Homebrew版本
  1. 更新Homebrew
brew update

注意
1辞嗡、Homebrew的命令是以brew開(kāi)頭
2捆等、Homebrew的默認(rèn)安裝目錄為 /usr/local/Homebrew
3、通過(guò)brew 安裝的程序都會(huì)默認(rèn)安裝到 /usr/local/Cellar/程序名/版本號(hào)/ 目錄下

二续室、Java

  1. Jenkins需要依賴java環(huán)境栋烤,當(dāng)我們用最新的Homebrew來(lái)安裝Jenkins時(shí)會(huì)默認(rèn)先安裝 java11,但是我們最好使用java8猎贴,Java8比較穩(wěn)定班缎,而且后面流水線要用bugly,bugly不支持Java11她渴。
  2. brew安裝Java8
brew install --cask homebrew/cask-versions/adoptopenjdk8
  1. 檢測(cè)Java是否安裝成功
java -version

注意
1达址、JAVA的默認(rèn)安裝目錄為 /Library/Java,如果你安裝多個(gè)版本,/Library/Java/JavaVirtualMachines里面就可以看到多個(gè)版本文件夾

二趁耗、Jenkins

Jenkins是開(kāi)源軟件項(xiàng)目沉唠,基于Java開(kāi)發(fā)的持續(xù)集成工具,用于監(jiān)控持續(xù)重復(fù)的工作

  1. brew安裝Jenkins
brew install jenkins
  1. 檢測(cè)Jenkins是否安裝成功
jenkins --version
  1. 啟動(dòng)jenkins
jenkins

jenkins是在前臺(tái)啟動(dòng)關(guān)閉終端苛败,jenkins就關(guān)閉了

  1. 設(shè)置jenkins后臺(tái)啟動(dòng)满葛、開(kāi)機(jī)啟動(dòng)
設(shè)置開(kāi)機(jī)自啟動(dòng):sudo launchctl load -w /Library/LaunchDaemons/org.jenkins-ci.plist
取消開(kāi)機(jī)自啟動(dòng):sudo launchctl unload -w /Library/LaunchDaemons/org.jenkins-ci.plist
后臺(tái)啟動(dòng)(默認(rèn)端口):nohup java -jar jenkins.war &
后臺(tái)啟動(dòng)(指定端口):nohup java -jar jenkins.war -httpPort=88 &
后臺(tái)啟動(dòng)(HTTPS):nohup java -jar jenkins.war -httpsPort=88 &
  1. 根據(jù)提示輸入,安裝推薦的插件罢屈,注冊(cè)賬戶
  2. 你可以把所有的插件都安裝了嘀韧,常用的有g(shù)it相關(guān)Branch API Plugin、 Build With Parameters之類

三缠捌、流水線

  1. 創(chuàng)建新的流水線任務(wù)锄贷,名字你自己取


  2. 配置Discard old builds選項(xiàng),就是多久釋放舊的構(gòu)建


  3. 勾選This project is parameterized曼月,選擇Choice Parameter谊却,這邊的environment名字和內(nèi)容,其實(shí)你都可以按需配置哑芹,只要和下面腳本里對(duì)的上就可以炎辨。這邊就是選擇對(duì)應(yīng)的環(huán)境,開(kāi)發(fā)聪姿、測(cè)試碴萧、生產(chǎn)


  4. 選擇Git Parameter,就是可以選擇對(duì)應(yīng)的Git分支


  5. Git源碼管理,填入你的源碼地址末购,我這邊用的是https的勿决,點(diǎn)這個(gè)添加,輸入你的git賬號(hào)和密碼就可以了招盲。



  6. 如果你是SSH,你就選擇SSH Username with private key,把ssh私鑰填進(jìn)去
    6.1 前往文件夾 ~/.ssh 可以看到本機(jī)是否已經(jīng)生成過(guò)低缩,有的話可以直接用,也可以生成新的
    6.2 ssh-keygen -t rsa -C "youremail@example.com" 生成秘鑰;不需要更名稱和不需要密碼的話直接敲回車就行了咆繁。
    6.3 生成成功之后讳推,前往 ~/.ssh,里面三個(gè)文件id_rsa(私鑰)玩般、id_rsa.pub(公鑰)银觅、known_hosts

    6.4 將id_rsa.pub(公鑰)配置到git,將id_rsa(私鑰)配置到j(luò)enkins里坏为。

  7. 構(gòu)建->增加構(gòu)建步驟->Execute shell
  8. 在填腳本究驴,我們先把釘釘弄一下
    8.1 釘釘和測(cè)試?yán)瓊€(gè)群
    8.2 群設(shè)置->智能群助手->添加自定義機(jī)器人


    8.3 安全設(shè)置,必須要選一個(gè)匀伏,我選擇了關(guān)鍵詞 比較簡(jiǎn)單一點(diǎn)洒忧,這個(gè)關(guān)鍵詞就是你機(jī)器人自動(dòng)發(fā)的文字里必須要有這個(gè)關(guān)鍵詞才會(huì)發(fā),例如發(fā)布够颠。復(fù)制Webhook備用
  9. 查看蒲公英的apikey,在個(gè)人設(shè)置
  10. 因?yàn)閤codebuild打包需要ExportOptions.plist文件熙侍。所以前往文件夾~/.jenkins/workspace,在這個(gè)目錄下創(chuàng)建文件夾ExportOptions履磨。
  11. 先手動(dòng)導(dǎo)出你的IPA包蛉抓,類型的話你就選ad-hoc,導(dǎo)出的文件里有個(gè)ExportOptions.plist,把它c(diǎn)opy出來(lái)剃诅,放到剛剛的文件夾里巷送,再?gòu)?fù)制一份然后修改里面的method屬性為development,把這個(gè)文件重命名為ExportOptions_dev.plist矛辕。



  12. 因?yàn)槲液灻亲詣?dòng)的惩系,所以我不需要配證書(shū)什么的,比較方便如筛,直接用了jenkins的腳本,如果你是手動(dòng)的抒抬。還是用fastlane比較方便
  13. 輸入腳本,把腳本復(fù)制出來(lái)杨刨,你全局搜一下****,有****的地方就是你需要自己替換的
echo -e $(pwd)
## !/bin/sh
## 項(xiàng)目名
TARGET_NAME=****
## Scheme名
SCHEME=****

echo -e "============Pod Install============"

cd ${TARGET_NAME}
echo -e $(pwd)
pod install

##=======================
## 編譯類型
if [[ "${environment}" == "生產(chǎn)環(huán)境" ]]; then
# 生產(chǎn)環(huán)境
BUILD_TYPE=Release
## ExportOptions.plist文件的存放路徑擦剑,該文件要存放在這個(gè)路徑下內(nèi)容如下
EXPORTOPTIONSPLIST=${JENKINS_HOME}/workspace/ExportOptions/ExportOptions.plist
else
# 測(cè)試環(huán)境
BUILD_TYPE=Debug
## ExportOptions.plist文件的存放路徑妖胀,該文件要存放在這個(gè)路徑下內(nèi)容如下
EXPORTOPTIONSPLIST=${JENKINS_HOME}/workspace/ExportOptions/ExportOptions_dev.plist
fi

## 當(dāng)前目錄
SORCEPATH=${WORKSPACE}
## workspace名
SPACE=${WORKSPACE}/${TARGET_NAME}/${TARGET_NAME}.xcworkspace
##xcarchive文件的存放路徑
ARCHIVEPATH=$SORCEPATH/build/$SCHEME.xcarchive
## ipa文件的存放路徑
EXPORTPATH=$SORCEPATH/build/$SCHEME
## 導(dǎo)出后的ipa路徑
EXPORTPATHIPA=$SORCEPATH/build/${TARGET_NAME}/****.ipa



echo -e "============First Build Clean============"
## 清理緩存
## 如果工程使用的是cocoapods,則'-project %s.xcodeproj'替換為'-workspace %s.xcworkspace'
xcodebuild clean -workspace $SPACE -scheme ${SCHEME} -configuration ${BUILD_TYPE}

DELETEIPAFILE=$SORCEPATH/build/$SCHEME/****.ipa
rm -f ${DELETEIPAFILE}

echo -e "============Build Clean============"

## 輸出關(guān)鍵信息
echo -e "  TARGET_NAME    : ${TARGET_NAME}"
echo -e "  BUILD_TYPE    : ${BUILD_TYPE}"
echo -e "  SORCEPATH    : ${SORCEPATH}"
echo -e "  ARCHIVEPATH    : ${ARCHIVEPATH}"
echo -e "  EXPORTPATH    : ${EXPORTPATH}"
echo -e "  EXPORTOPTIONSPLIST    : ${EXPORTOPTIONSPLIST}"
echo -e "============Build Archive============"

## 導(dǎo)出archive包
xcodebuild archive -workspace ${SPACE} -scheme ${SCHEME} -configuration ${BUILD_TYPE} -quiet -archivePath $ARCHIVEPATH
echo -e "============Build Archive Success============"

echo -e "============Export IPA============"
## 導(dǎo)出IPA包
xcodebuild -exportArchive -archivePath $ARCHIVEPATH -quiet -exportPath ${EXPORTPATH} -exportOptionsPlist ${EXPORTOPTIONSPLIST}
echo -e "============Export IPA SUCCESS============"

## 編譯完成時(shí)間
BUILD_DATE="$(date +'%Y%m%d_%H%M')"

## 上傳蒲公英
## apiKey和userKey需要在蒲公英的賬號(hào)設(shè)置中查找https://www.pgyer.com/account/api
apiKey="****"
MSG=`git log -1 --pretty=%B`

#蒲公英打包
result=$(curl -F "file=@${EXPORTPATHIPA}" \
-F "_api_key=${apiKey}" \
-F "buildUpdateDescription=${environment}惠勒;${MSG}" \
https://www.pgyer.com/apiv2/app/upload)

code=`echo $result | jq '.code'`

if [ $code = 0 ];then
    echo "蒲公英打包 Success"
    data=`echo $result | jq '.data'`
    #APP名 需要帶上-r 要不然數(shù)據(jù)會(huì)有""
    buildName=`echo $data | jq -r '.buildName'` 
    #APP版本號(hào)
    buildVersion=`echo $data | jq -r '.buildVersion'` 
    #APP下載二維碼
    buildQRCodeURL=`echo $data | jq -r '.buildQRCodeURL'` 
    #釘釘通知
    message="#### 【iOS${buildName}】${environment}赚抡;V${buildVersion} 發(fā)布成功 \n 更新說(shuō)明:${MSG} \n>掃描二維碼安裝:![screenshot](${buildQRCodeURL}) \n #### @****釘釘群里你需要at的人的手機(jī)號(hào)碼 請(qǐng)注意查收"
    MSG_JSON='{"msgtype":"markdown","markdown":{"title":"'${buildName}'App發(fā)布通知","text":"'${message}'"},"at":{"atMobiles":["****釘釘群里你需要at的人的手機(jī)號(hào)碼"]}}'

    curl 'https://oapi.dingtalk.com/robot/send?access_token=****釘釘機(jī)器人webhook' \
        -H  'Content-Type:application/json' \
        -d  "${MSG_JSON}"
else
    echo "蒲公英打包 Failed"
fi
  1. 構(gòu)建任務(wù)



  2. 如果你需要在git push的時(shí)候自動(dòng)執(zhí)行,那就設(shè)置構(gòu)建觸發(fā)器纠屋,然后將這個(gè)GitLab webhook URL復(fù)制到你的項(xiàng)目設(shè)置里涂臣,一般叫網(wǎng)絡(luò)回調(diào)鉤子


四、分配角色權(quán)限

因?yàn)橐o后端和測(cè)試同學(xué)使用符欠,需要配置一下權(quán)限仅胞,給他們指定某些任務(wù)可以操作短条,具體的操作也只能是運(yùn)行和取消。

  1. 安裝插件Role-based Authorization Strategy
  2. Manage Jenkins->Manage Users->新增用戶test




  3. Manage Jenkins->Configure Global Security->勾選Role-Based Strategy 哭尝,保存(如果你沒(méi)有安裝Role-based Authorization Strategy插件是沒(méi)有這個(gè)選項(xiàng)的)


  4. Manage Jenkins->Manage and Assign Roles 進(jìn)入角色管理
    4.1 選擇Manage Roles,這邊我的理解是用戶組的意思剖煌,你輸入一個(gè)用戶組的名字材鹦,選擇讀權(quán)限

    4.2 輸入4.1你輸?shù)?code>用戶組名,然后在Pattern輸入對(duì)應(yīng)的任務(wù)名字耕姊,進(jìn)行綁定桶唐,選擇對(duì)應(yīng)的權(quán)限。相當(dāng)于你這個(gè)組下的用戶只能操作這個(gè)任務(wù)

    4.3 選擇Assign Roles箩做,給對(duì)應(yīng)的用戶組莽红,分配用戶

    4.4 綁定用戶組和用戶,拉到最下面有個(gè)保存
  5. 登錄test賬號(hào)邦邦,發(fā)現(xiàn)只能看到那一個(gè)任務(wù)安吁,也只有運(yùn)行和停止的操作 就OK了


五、外網(wǎng)映射

  1. 因?yàn)闇y(cè)試同學(xué)不一定和咱們處于同一個(gè)區(qū)域網(wǎng)燃辖,咱們需要給個(gè)外網(wǎng)地址給他們鬼店,那我們需要用到一個(gè)工具 花生殼 ,自行搜索下載黔龟「局牵花生殼默認(rèn)是開(kāi)機(jī)自啟的,這個(gè)軟件有時(shí)候后端在測(cè)支付的時(shí)候 也是可以用它的氏身。
  2. 添加映射


    3-1.png
  3. 輸入你本機(jī)的IP地址(按住option巍棱,去點(diǎn)擊你的WiFi圖標(biāo),可以看到你的IP)蛋欣,端口是8080航徙,保存


    3-2.png
  4. 將生成的訪問(wèn)地址,發(fā)給測(cè)試他們?cè)囋嚢?/p>

六陷虎、Fastlane的使用

fastlane可以簡(jiǎn)化我們的操作到踏,之前的shell腳本那么長(zhǎng) 很不方便。在集成fastlane之前尚猿,咱們先創(chuàng)建一個(gè)新的jenkins任務(wù)窝稿,里面把上面講的git等相關(guān)的東西先弄好。

  1. 安裝fastlane
brew install fastlane
  1. 查看fastlane版本
fastlane --version
  1. 進(jìn)入你的工程目錄下,初始化凿掂,選擇4 然后下一步確認(rèn)鍵就可以了
fastlane init

  1. 成功后會(huì)生成fastlane文件夾伴榔,里面有Appfile、Fastfile兩個(gè)文件
  2. Appfile主要是填寫(xiě)你的app_identifier和apple_id賬號(hào)的, Fastfile就是你的操作文件了潮梯,里面包含了多個(gè)lane ,每個(gè)lane你就可以想成是個(gè)任務(wù)或者方法骗灶。
  3. 進(jìn)入你的工程目錄下,添加蒲公英插件,然后會(huì)多Gemfile Gemfile.lock Pluginfile文件
fastlane add_plugin pgyer

  1. 填寫(xiě)Appfile賬號(hào)信息
app_identifier "****"
apple_id "****"
  1. 編寫(xiě)fastlane任務(wù)秉馏,gym(clean:true,scheme:"XMHealth",configuration:"Release",export_method:"ad-hoc")耙旦,configuration有release和debug,export_method即導(dǎo)出參數(shù)有app-store, package, ad-hoc, enterprise, development, 和developer-iddevelopment。你搜一下里面有****的做一下替換萝究。至于lane傳參數(shù)免都,你可以看一下官網(wǎng)傳參的介紹
default_platform(:ios)
platform :ios do

  desc "build adhoc ipa"
  lane :XMHealth_adhoc do
     gym(clean:true,scheme:"****",configuration:"Release",export_method:"ad-hoc")
  end

  desc "build dev ipa"
  lane :XMHealth_dev do
     gym(clean:true,scheme:"****",configuration:"Debug",export_method:"development")
  end

  desc "upload to pgyer"
  lane :uploadToPgyer do |options|
     pgyer(api_key: "****", user_key: "****", update_description: options[:msg])
  end

  desc "upload to dingdingTalk"
  lane :dingdingTalk do |options|
     updatemsg = options[:msg]
     buildName = get_info_plist_value(path: "./XMHealth/Other/Info.plist", key: 'CFBundleDisplayName')
     puts buildName
     curl = %Q{
        curl 'https://oapi.dingtalk.com/robot/send?access_token=****' \
        -H 'Content-Type:application/json' \
        -d '{
          "msgtype":"markdown",
          "markdown":{
            "title":"iOS#{buildName}App發(fā)布通知??????",
            "text":"#### ??????iOS#{buildName}App發(fā)布成功\n說(shuō)明:#{updatemsg}\n###### 掃碼安裝↓↓↓\n![screenshot](https://www.pgyer.com/app/qrcode/****)\n#### @**** @**** 請(qǐng)注意查收"
          },
          "at":{
            "atMobiles":["****","****"]
          }
      }'
    }
    system curl
  end

  desc "release"
  lane :release do |options|
    if options[:submit]
      XMHealth_adhoc() 
      uploadToPgyer(msg:options[:msg])
      dingdingTalk(msg:options[:msg])
      puts "生產(chǎn)ad-hoc流水線成功"
    else
      XMHealth_dev() 
      uploadToPgyer(msg:options[:msg])
      dingdingTalk(msg:options[:msg])
      puts "測(cè)試dev流水線成功"
    end
  end
end
  1. jenkins里execute shell
## 項(xiàng)目名
TARGET_NAME=****
GITMSG=`git log -1 --pretty=%B`
MSG="${environment}帆竹、${GITMSG}"
cd ${TARGET_NAME}
pod install

## 編譯類型
if [[ "${environment}" == "生產(chǎn)環(huán)境" ]]; then
# 生產(chǎn)環(huán)境
fastlane release submit:true msg:${MSG}
else
# 測(cè)試環(huán)境
fastlane release submit:false msg:${MSG}
fi
  1. 專門搞一臺(tái)閑置的Mac天天開(kāi)著绕娘,在上面部署好,然后用花生殼栽连,開(kāi)放給測(cè)試险领、后臺(tái)他們使用

常見(jiàn)問(wèn)題

  1. 如果有Java相關(guān)的報(bào)錯(cuò),記得檢查你本地的環(huán)境變量還有安裝的Java秒紧,JAVA的默認(rèn)安裝目錄為 /Library/Java绢陌,看看里面是不是安裝了多個(gè),建議使用java8熔恢,jenkins默認(rèn)是Java11的脐湾,
    1.1 檢查. zshrc文件的里的環(huán)境變量JAVA_HOME,前往->文件夾-> ~/. zshrc
    1.2 如果有缺JAVA_HOME叙淌,請(qǐng)?zhí)砑幽銓?duì)應(yīng)的Java地址
    1.3 命令行里source .zshrc秤掌,保存一下
export JAVA_HOME="/Library/Java/JavaVirtualMachines/jdk1.8.0_311.jdk/Contents/Home"
  1. 輸出里看到如下錯(cuò)誤
DVTPortal: Error:
Error Domain=DVTPortalServiceErrorDomain Code=1100 "Your session has expired. Please log in."

解決: Xcode —>Preference—> Accounts 重新登錄,注意如果有多個(gè)賬號(hào)鹰霍,要確保所有的賬號(hào)都是登錄狀態(tài)闻鉴。

  1. 在jenkins里執(zhí)行xcodebuild -exportArchive 導(dǎo)出IPA命令的時(shí)候,會(huì)報(bào)錯(cuò)
error: exportArchive: The data couldn’t be read because it isn’t in the correct format.

Error Domain=NSCocoaErrorDomain Code=3840 "No value." UserInfo={NSDebugDescription=No value., NSFilePath=/var/folders/qx/qs4cc3pn0sgddxqjh7dj_k300000gn/T/ipatool-json-filepath-~~~FH2VEz}

** EXPORT FAILED **

Build step 'Execute shell' marked build as failure
Finished: FAILURE

解決: 將對(duì)應(yīng)打包的證書(shū)ExportOptions.plist文件的compileBitcode內(nèi)容由 true 改為 false 就可以

1茂洒、Could not find action, lane or variable 'pgyer'. Check out the documentation for more details: https://docs.fastlane.tools/actions

找不到蒲公英插件孟岛,原來(lái)是安裝目錄錯(cuò)了,應(yīng)該在工程目錄下安裝:fastlane add_plugin pgyer

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末获黔,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子在验,更是在濱河造成了極大的恐慌玷氏,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件腋舌,死亡現(xiàn)場(chǎng)離奇詭異盏触,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門赞辩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)雌芽,“玉大人,你說(shuō)我怎么就攤上這事辨嗽∈缆洌” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵糟需,是天一觀的道長(zhǎng)屉佳。 經(jīng)常有香客問(wèn)我,道長(zhǎng)洲押,這世上最難降的妖魔是什么武花? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮杈帐,結(jié)果婚禮上体箕,老公的妹妹穿的比我還像新娘。我一直安慰自己挑童,他們只是感情好累铅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著炮沐,像睡著了一般争群。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上大年,一...
    開(kāi)封第一講書(shū)人閱讀 51,688評(píng)論 1 305
  • 那天换薄,我揣著相機(jī)與錄音,去河邊找鬼翔试。 笑死轻要,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的垦缅。 我是一名探鬼主播冲泥,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼壁涎!你這毒婦竟也來(lái)了凡恍?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤怔球,失蹤者是張志新(化名)和其女友劉穎嚼酝,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體竟坛,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡闽巩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年钧舌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涎跨。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡洼冻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出隅很,到底是詐尸還是另有隱情撞牢,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布外构,位于F島的核電站普泡,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏审编。R本人自食惡果不足惜撼班,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望垒酬。 院中可真熱鬧砰嘁,春花似錦、人聲如沸勘究。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)口糕。三九已至缅阳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間景描,已是汗流浹背十办。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留超棺,地道東北人向族。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像棠绘,于是被迫代替她去往敵國(guó)和親件相。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

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