jenkins + gitlab自動部署

一.基礎(chǔ)知識

GitLab:是一個基于Git實現(xiàn)的在線代碼倉庫托管軟件,是用來提供代碼托管的。我們可以用在企業(yè)內(nèi)部網(wǎng)絡(luò)搭建私服。

jenkins:基于Java開發(fā)的一種持續(xù)集成工具,用于監(jiān)控持續(xù)重復(fù)的工作。在提供一個開放易用的軟件平臺,使軟件的持續(xù)集成變成可能。

maven:項目管理工具,在這里我們可以執(zhí)行maven命令來幫我們打包

jdk: Java 語言的軟件開發(fā)工具包

tomcat:輕量級應(yīng)用服務(wù)器

git:版本控制器

二.整合目的

在日常開發(fā)中,以前的流程是需要把項目從gitlab上復(fù)制到本地,再打成war包,然后部署到tomcat服務(wù)器上運行。開發(fā)項目的過程中會經(jīng)常部署測試環(huán)境來驗證,重復(fù)以上操作會顯得很繁瑣,浪費大量時間,所以使用jenkins來實現(xiàn)持續(xù)集成,對整個開發(fā)項目的過程有著重要的戰(zhàn)略意義。我們開發(fā)軟件為了什么?對,簡化步驟,提高開發(fā)效率,節(jié)省時間。

三:流程示意圖

請叫我靈魂畫師~

四:軟件安裝

前提:這次整合,我是只使用2臺機器,服務(wù)器A裝jenkins,jdk,maven,服務(wù)器B裝gitlab和tomcat,其實應(yīng)該是要個服務(wù)器C裝tomcat,這樣思路就更清楚了,具體情況各位根據(jù)實際需求來定哈。

1)B服務(wù)器上gitLab安裝

1. 安裝依賴

sudo yum install curl policycoreutils openssh-server openssh-clients policycoreutils-python

sudo systemctl enable sshd

sudo systemctl start sshd

sudo yum install postfix

sudo systemctl enable postfix

sudo systemctl start postfix

注意:sudo systemctl start postfix 如果報錯,如下面所示

Job for postfix.service failed because the control process exited with error code. See "systemctl status postfix.service" and "journalctl -xe" for details.

解決辦法:修改 vi /etc/postfix/main.cf的設(shè)置

inet_protocols = all

inet_interfaces = all

2. yum 配置鏡像加速

我推薦清華大學(xué)鏡像源 :?https://mirror.tuna.tsinghua.edu.cn/help/gitlab-ce

操作如下:vi /etc/yum.repos.d/gitlab_gitlab-ce.repo

[gitlab-ce]

name=Gitlab CE Repository

baseurl=https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el$releasever/

gpgcheck=0

enabled=1

3. 更新本地云緩存`

sudo yum makecache`

4. 安裝`

? sudo yum install gitlab-ce

5. 修改配置項

默認是80端口,如果想要修改端口號的話,打開gitlab.rb文件,修改如下:

sudo vim /etc/gitlab/gitlab.rb

#修改配置項

external_url 'http://<你的服務(wù)器地址或域名>:<你想要設(shè)置的端口號>'

unicorn['port'] = <你想要設(shè)置的端口號>

prometheus['listen_address'] = 'localhost:<你想要設(shè)置的端口號>'

sudo gitlab-ctl reconfigure # 重新配置服務(wù);

6. 重啟gitlab

gitlab-ctl restart

打開http://<你的服務(wù)器IP>:<80>,會彈出一個設(shè)置初始密碼的界面,按照要求輸入初始密碼,就會跳轉(zhuǎn)到登錄頁面。gitlab管理員用戶名為root。

我這邊是自己創(chuàng)建了用戶,下圖是注冊,完成后登陸。

7. 服務(wù)器A上配置免密碼登錄

客戶端命令行生成ssh

ssh-keygen -t rsa

它會生成公鑰id_rsa.pub和私鑰id_rsa,存放在.ssh目錄下。復(fù)制公鑰到Gitlab的用戶設(shè)置中的SSH Keys中,點擊保存。操作如下圖所示

有人問這樣做的目的是什么?問得好!這樣我們就能建立服務(wù)器A跟gitLab的安全連接,我們就可以通過git將gitlab倉庫里的代碼拉下來或者推送到倉庫。

2)A服務(wù)器上安裝jdk

centOS安裝jdk有三種,隨便選一種都可以,網(wǎng)上一大堆。我選中的是手動解壓安裝包。

卸載系統(tǒng)自帶的jdk(此步驟建立在centOS7自帶jdk1.8的情況,可以跳過,也可以自己安裝想要的jdk)

查看當(dāng)前系統(tǒng)jdk的版本:java -version。(如下圖的話則代表自帶,繼續(xù)下面步驟)

列舉匹配已安裝的java的軟件包:

yum list installed | grep java

卸載安裝的jdk

yum -y remove java-1.7.0-openjdk*?

yum -y remove java-1.8.0-openjdk*

當(dāng)結(jié)果出現(xiàn)了完畢!,就表示卸載成功。

輸入java -version 查看,驗證是否卸載成功。

2. 下載jdk1.8安裝包

jdk下載地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

下載 jdk-8u152-linux-x64.tar.gz(根據(jù)自己的系統(tǒng)位數(shù)選擇對應(yīng)的包)

然后使用Xftp將下載好的jdk-8u152-linux-x64.tar.gz上傳到CentOs上去,我選擇的是在usr下創(chuàng)建一個文件夾來專門放壓縮包。

3. 在user/local目錄下新建java文件夾

# cd /usr/local/

# mkdir java

# cd java

4.解壓

進到壓縮包所在的目錄,將jdk-8u152-linux-x64.tar.gz 解壓到我所創(chuàng)建的java文件中。

tar -zxvf jdk-8u152-linux-x64.tar.gz -C /usr/local/java

5.配置環(huán)境變量

export JAVA_HOME=/usr/local/java/jdk1.8.0_212

export JRE_HOME=${JAVA_HOME}/jre

export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib

export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin

注釋:

JAVA_HOME指明JDK安裝路徑,就是剛才安裝時所選擇的路徑,此路徑下包括lib,bin,jre等文件夾(tomcat,Eclipse的運行都需要依靠此變量)。

PATH使得系統(tǒng)可以在任何路徑下識別java命令

特別注意:環(huán)境變量值的結(jié)尾沒有任何符號,不同值之間用:隔開(windows中用;)

6.使配置文件生效

source /etc/profile

7.測試配置是否成功

java -version

3 )Maven安裝

1. 獲取安裝包:鏡像。

wget https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.tar.gz

2. 提前創(chuàng)建好maven文件夾,解壓tar包至maven文件夾

tar -zxvf apache-maven-3.5.4-bin.tar.gz -C /usr/local/maven

3.配置環(huán)境變量

修改 profile 文件

vim /etc/profile

export MAVEN_HOME=/usr/local/maven/apache-maven-3.5.4

export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$MAVEN_HOME/bin

修改完重載這個文件使文件立即生效,否則重啟計算機即可生效。

source /etc/profile

4. 驗證 版本

mvn? -v

顯示如下則代表成功

Apache Maven 3.5.4 (1edded0938998edf8bf061f1ceb3cfdeccf443fe; 2018-06-18T02:33:14+08:00)

Maven home: /usr/local/maven/apache-maven-3.5.4

Java version: 1.8.0_212, vendor: Oracle Corporation, runtime: /usr/local/java/jdk1.8.0_212/jre

Default locale: zh_CN, platform encoding: UTF-8

OS name: "linux", version: "3.10.0-957.el7.x86_64", arch: "amd64", family: "unix"

4 )安裝jenkins

1. 安裝

wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo

rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key

yum install -y jenkins

2. 關(guān)閉防火墻

systemctl stop firewalld.service

systemctl disable firewalld.service

3. 配置文件

vi /etc/sysconfig/jenkins

#修改下面內(nèi)容

JENKINS_USER="root"

...

端口設(shè)置成為被占用的

JENKINS_PORT="xxxx"

4. 啟動jenkins

systemctl daemon-reload

systemctl start jenkins

systemctl status jenkins

5 )安裝git

1. 獲取源碼包

wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.18.0.tar.gz

2. git構(gòu)建時需要的環(huán)境

yum groupinstall "Development Tools"

3. 安裝各種devel包

yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker

openssh-clients

4. 編譯并安裝,同時輸出執(zhí)行路徑到環(huán)境變量中

make prefix=/usr/local/git all

make prefix=/usr/local/git install

echo "export PATH=$PATH:/usr/local/git/bin" >> /etc/bashrc

source /etc/bashrc

5. 驗證能否正常運行:

git --version

五:詳細步驟

1. 解鎖jenkins

按照提示將代碼復(fù)制到下面,然后點繼續(xù)。

2. 點擊左邊的安裝推薦的插件

好吧,等了好幾分鐘才裝完,耐心等待吧。

3. 創(chuàng)建管理員用戶,實例配置

注意!安裝配置jenkins的時候,會出現(xiàn)插件安裝失敗的情況。

原因:升級站點問題,站點位于國外,訪問起來比較吃力。

解決方式:更換為國內(nèi)的jenkins鏡像就可以了。

操作:系統(tǒng)管理>>管理插件>>高級

將 [升級站點] 更換為

http://mirror.xmission.com/jenkins/updates/current/update-center.json

隨后提交即可解決,如下圖。

如果是告訴你需要升級jenkins才能搞定,那就在線升級jenkins。

yum安裝的升級方法

1、service jenkins stop

2、yum update jenkins

3、service jenkins start

升級完就應(yīng)該沒問題了。

4. 配置jdk,maven,git

首先我們要配置jenkins編譯所需要的jdk,maven,順便把git也配置了。最后點擊保存。

注意:jdk home和maven home 可以輸入vim /etc/profile看到,直接復(fù)制粘貼就行。git的話輸入whereis git就可以查到了,一般是git/bin/git這個結(jié)尾的。

5. 在jenkins上系統(tǒng)設(shè)置gitlab和git

安裝Gitlab插件,Gitlab Hook插件,Git插件。打開設(shè)置,選擇插件管理。點擊可選插件,然后在搜索框里輸入就可以了,搜索到后點擊直接安裝。沒看懂的可以看我第六那個步驟。

安裝完之后,點擊系統(tǒng)設(shè)置。

找到Gitlab這個配置。

這邊需要添加憑證,我選用的類型是gitlab API token。

從哪里獲取呢?打開gitlab,用戶設(shè)置里面有個訪問令牌選項。

成功后會如下顯示。然后復(fù)制這個令牌,保存在你自己知道的地方,不保存就以后就看不到了。

接著把剛才復(fù)制的訪問令牌粘貼到添加的憑證那里去,點擊添加,然后前面的下拉框里選擇你剛才添加的憑證。

配置完gitlab后要配置git,2個選項一填就可以了,用戶名和郵箱。好了,配置結(jié)束。

6. 在jenkins上創(chuàng)建一個maven項目

點擊新建Item,或者開始創(chuàng)建一個新任務(wù),然后選擇新建maven項目。很多人說沒有,比如下圖。

那是因為沒有安裝一個Maven插件。在可選插件里輸入Maven Integration,點擊安裝,不好意思我安裝的比較快,沒來得及截圖。已經(jīng)在我安裝列表里了。

返回到主頁面,點擊新建,任務(wù)名字隨便起,選擇構(gòu)建一個maven項目,最后點擊確定。

7. 配置源碼管理

這里我們用來讓jenkins連接gitlab倉庫的。

首先打開gitlab,新建一個倉庫。這里我喜歡叫倉庫,但它翻譯成項目。用過github的朋友應(yīng)該喜歡叫倉庫吧。隨意啦,強迫癥。

寫倉庫名字,設(shè)置私有的,描述可寫可不寫,然后創(chuàng)建。

倉庫列表中就有了你新建的倉庫,點擊它進入倉庫。

復(fù)制倉庫url。

注意:一開始這個倉庫是空的,我這邊是剛才上傳了個helloworld的maven項目,用來測試下git能不能上傳代碼到這個倉庫,大家試下,后面jenkins配置需要這倉庫主分支不能為空。

我是自己windows上安裝了git,通過配置idea中的git來push代碼,當(dāng)然也需要生成ssh鑰匙在gitlab上添加sshkey。(前面步驟一開始我生成的ssh鑰匙是在我安裝jenkins的那臺服務(wù)器A上操作的,和這邊的是兩回事)。不懂的朋友可以百度下window安裝git和生成ssh鑰匙。

總結(jié)下:因為我們平時寫代碼是在windows下的idea里進行pull和push的,所以這邊生成ssh鑰匙并配置是為了能讓我們在idea上傳代碼push到服務(wù)器B的gitlab里。而前面那個在jenkins服務(wù)器上生成ssh鑰匙并配置是為了讓服務(wù)器A能和服務(wù)器B的gitlab安全連接,也就是可以pull和push。

切回jenkins,在源碼管理里,粘貼url上去,第二個是添加分支,點擊添加,類型選擇用戶名和密碼,輸入你gitlab用戶名和密碼。其實類型可以選擇ssh秘鑰驗證,gitlab訪問令牌啊什么的,看你喜歡。

添加完證書后選擇證書,如果不報紅色的字就說明ok,報的話說明錯誤。

注意:第三步中,jenkins job默認對master分支進行構(gòu)建,你也可以自定義分支。這要求你的Gitlab代碼倉庫中要存在這個分支,一般來說,就是要向代碼倉庫提交一次更改,請 自行完成(Gitlab項目剛創(chuàng)建時是空的,一個分支也沒有,這樣的話,自動構(gòu)建時會出錯),這也就是上面先試試上傳代碼到gitlab是否成功的原因啦。

8. 配置構(gòu)建觸發(fā)器

如下圖所示操作。我選了當(dāng)一個push到gitlab的時候就會自動構(gòu)建,使用鉤子webhook,構(gòu)建URL是jenkins上創(chuàng)建的那個maven項目。記住這個url,后面會用到!

點擊高級,出現(xiàn)下圖所示。

生成的口令其實就是webhook的安全令牌,等會配置gitlab的時候要用到。

打開gitlab,配置鉤子。點擊設(shè)置,然后集成。把上面記下來的jenkins項目url和webhook安全令牌寫進去。

取消掉ssl驗證,然后點擊add webhook。

點擊test中的第一個選項push events模擬push,看看是否成功。

下圖表示成功,如果報錯自己上網(wǎng)查下為何報錯,因為局域網(wǎng)的問題,需要在gitlab上登陸管理員賬號,配置里面有個選項就是說允許webhook發(fā)送本地指令之類的。

9. 配置build命令

使用maven命令來打包。

10. Post Steps

暫時不用寫,注意下面提到的模塊六檢驗成果中開頭提到的東西就行,再根據(jù)實際情況來定。

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

我使用的是tomcat熱部署。首先要安裝Deploy to container插件!!!, 該功能是“將成功編譯的War/Jar包部署到遠程的應(yīng)用服務(wù)器上。

我們先來配置tomcat遠程部署賬號,在tomcat目錄下conf文件內(nèi)tomcat-users.xml 文件增加以下配置。

<role rolename="manager-gui"/>

<role rolename="manager-script"/>

<role rolename="manager-jmx"/>

<role rolename="manager-status"/>

<user username="tomcat" password="tomcat" roles="manager-gui,manager-script,manager-jmx,manager-status"/>

在conf文件中的context.xml里context標簽中改成<Context antiResourceLocking="true">,這個是為了自動刪除之前舊版本的war包。

打開tomcat解壓目錄找到webapps/manager/META-INF里的context.xml ,需要注釋掉這個Value節(jié)點。

注意:配置完后驗證是否生效,啟動tomcat后點擊Manager App。輸入上面配置的用戶名密碼看看能不能進入。

選擇Deploy war/ear to a container,操作如下。因為jenkins從git上拉下來代碼并且打了war在jenkins的target目錄下,所以如下圖所示。

好了 我們可以開始正片了!

## 六:檢驗成果

注意!!!!!!!!!!!!!!!!!!!:

這邊先講下,我是建立在tomcat已經(jīng)啟動的情況下操作的,所以我沒有寫那個第10步。

commit push ,自動構(gòu)建,成功。

成功了。

那么有些人想要在tomcat沒有啟動的情況下怎么辦呢?那肯定是要寫腳本來啟動tomcat。具體看模塊七血淚坑!

## 七:血淚坑

失敗的例子1。

我在構(gòu)建后操作里使用Deploy war/ear to a container,上面的步驟都有顯示,也就是tomcat熱部署,然后又在Post Steps里寫了腳本,就是關(guān)閉tomcat和開啟tomcat。但是構(gòu)建會報錯。

參考了這篇文章,但是沒什么用,依然構(gòu)建報錯。報錯跟下面鏈接里的一樣,我就不貼出來了。

https://blog.csdn.net/weixin_33767813/article/details/86028814

后來我看了下,tomcat熱部署 用tomcat manager 本來就有很多漏洞,所以我決定舍棄熱部署。

失敗的例子2。

舍棄熱部署,改用Send build artifacts over SSH,構(gòu)建成功,tomcat啟動失敗,那種我也不知道怎么解決。我看網(wǎng)上是說在執(zhí)行的腳本上加一句export BUILD_ID=dontkillme,因為jenkins是會殺掉tomcat進程的。但是還是沒用!

成功的例子。

我們需要執(zhí)行shell腳本,先關(guān)閉tomcat,然后啟動tomcat。注意,這邊tomcat是裝在服務(wù)器B的,所以先要實現(xiàn)服務(wù)器A免登錄服務(wù)器B。

方法:先在服務(wù)器B的/root/.ssh下創(chuàng)建文件authorized_keys,然后把服務(wù)器A的生成的ssh公鑰(id_rsa.pub)復(fù)制到那個文件上。

注意 authorized_keys 文件的權(quán)限必須是600,如果權(quán)限不對會影響登錄。所以最后輸入指令:chmod 600 authorized_keys 就可以了。注意空格!

如下圖在postSteps中輸入shell命令。意思是ssh連接服務(wù)器B,執(zhí)行B服務(wù)器(192.168.31.222)上的restart.sh

#!/bin/bash

echo "執(zhí)行腳本開始"

TOMCAT_HOME="/root/app/tomcat8.5.42"

ssh root@192.168.31.222? > /dev/null 2>&1 << eeooff

${TOMCAT_HOME}/bin/restart.sh

eeooff

echo done!

echo "執(zhí)行腳本結(jié)束"

下圖是restart.sh的腳本內(nèi)容,這個文件是放在tomcat那臺服務(wù)器上的,也就是服務(wù)器B。

#!/bin/bash

# export BUILD_ID=dontkillme

function shutdown_tomcat () {

? ? #tomcat_id=`jps | grep Bootstrap | awk '{print $1}'`

tomcat_id=`lsof -i:8765 | awk 'NR==2''{print $2}'`

if [ ! $tomcat_id ];then

echo "tomcat process in ${ip} is not exist."

else

echo "shoutdown ${ip} tomcat"

/bin/kill -9 $tomcat_id

fi

}

function start_tomcat () {

echo "start $ip tomcat"

/bin/sh /root/app/tomcat8.5.42/bin/catalina.sh start

/root/app/jdk1.8.0/bin/jps

}

function restart_tomcat () {

shutdown_tomcat

start_tomcat

}

restart_tomcat

echo "腳本執(zhí)行完畢"

接著需要安裝下Publish over SSH這個插件,然后在全局設(shè)置里設(shè)置Publish over SSH,密碼是你jenkins所在的服務(wù)器生成ssh鑰匙時設(shè)置的,沒有設(shè)置就不填,Key里填的是你的私鑰。

這邊填的是ssh連接的主機IP,名字隨便取,賬號名稱就寫root,路徑寫/就行,因為這是全局配置,下面每個項目都有路徑配置,會重合一起,注意拼接。填完后測試下連接,成功就ok。

接著回到j(luò)enkins項目的配置里,找到構(gòu)建后操作,把前面步驟中配置好的Deploy war/ear to a container 刪掉,我們不用tomcat熱部署。我們使用Send build artifacts over SSH。配置如下。

這樣就可以了,點擊保存,然后看下構(gòu)建效果吧。腳本執(zhí)行成功了,這樣tomcat開啟了。

大功告成。其實方法有很多種,熱部署肯定是行得通的,但是沒做出來。謝謝大家閱讀。有什么錯誤幫我指出來,我們一起討論

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,461評論 6 532
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,538評論 3 417
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,423評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,991評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,761評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,207評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,268評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,419評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,959評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,653評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,901評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,678評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 47,978評論 2 374

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