Jenkins系列一:安装和简单配置

软件的持续集成工具之一,易上手,功能强大,话不多说,干货奉上。
我的博客地址:http://blog.lzoro.com 求关注~

Jenkins简单介绍

Jenkins是一个开源软件项目,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。

使用目的:

  • 持续、自动地构建/测试软件项目。

  • 监控一些定时执行的任务。

Jenkins拥有的特性包括:

1.易于安装-只要把jenkins.war部署到servlet容器,不需要数据库支持。

2.易于配置-所有配置都是通过其提供的web界面实现。有些配置如MAVEN_HOME和Email,只需要配置一次,所有的项目就都能用。当然也可以通过修改XML进行配置。

3.集成RSS/E-mail通过RSS发布构建结果或当构建完成时通过e-mail通知。

4.生成JUnit/TestNG测试报告。

5.分布式构建支持Jenkins能够让多台计算机一起构建/测试。

6.文件识别:Jenkins能够跟踪哪次构建生成哪些jar,哪次构建使用哪个版本的jar等。

7.插件支持:支持扩展插件,你可以开发适合自己团队使用的工具。

8.测试报告聚合,所有模块的测试报告都被聚合在一起,结果一目了然,使用其他CI,这几乎是件不可能完成的任务。

9.构件指纹(artifact fingerprint),每次build的结果构件都被很好的自动管理,无需任何配置就可以方便的浏览下载。

Jenkins的由来

目前持续集成(CI)已成为当前许多软件开发团队在整个软件开发生命周期内侧重于保证代码质量的常见做法。它是一种实践,旨在缓和和稳固软件的构建过程。并且能够帮助您的开发团队应对如下挑战:
  • 软件构建自动化 :配置完成后,CI系统会依照预先制定的时间表,或者针对某一特定事件,对目标软件进行构建。

  • 构建可持续的自动化检查 :CI系统能持续地获取新增或修改后签入的源代码,也就是说,当软件开发团队需要周期性的检查新增或修改后的代码时,CI系统会不断确认这些新代码是否破坏了原有软件的成功构建。这减少了开发者们在检查彼此相互依存的代码中变化情况需要花费的时间和精力(说直接一点也是钱啊,呵呵)。

  • 构建可持续的自动化测试 :构建检查的扩展部分,构建后执行预先制定的一套测试规则,完成后触发通知(Email,RSS等等)给相关的当事人。

  • 生成后后续过程的自动化 :当自动化检查和测试成功完成,软件构建的周期中可能也需要一些额外的任务,诸如生成文档、打包软件、部署构件到一个运行环境或者软件仓库。这样,构件才能更迅速地提供给用户使用。

  • 部署一个CI系统需要的最低要求是,一个可获取的源代码的仓库,一个包含构建脚本的项目。

下图概括了CI系统的基本结构:

upload successful

该系统的各个组成部分是按如下顺序来发挥作用的:

1)、开发者检入代码到源代码仓库。

2)、 CI系统会为每一个项目创建了一个单独的工作区。当预设或请求一次新的构建时,它将把源代码仓库的源码存放到对应的工作区。

3)、CI系统会在对应的工作区内执行构建过程。

4)、(配置如果存在)构建完成后,CI系统会在一个新的构件中执行定义的一套测试。完成后触发通知(Email,RSS等等)给相关的当事人。

5)、(配置如果存在)如果构建成功,这个构件会被打包并转移到一个部署目标(如应用服务器)或存储为软件仓库中的一个新版本。软件仓库可以是CI系统的一部分,也可以是一个外部的仓库,诸如一个文件服务器或者像Java.net、 SourceForge之类的网站。

6)、 CI系统通常会根据请求发起相应的操作,诸如即时构建、生成报告,或者检索一些构建好的构件。

Jenkins就是这么一个CI系统,前身是Hudson。

使用Jenkins的理由

1)、是所有CI产品中在安装和配置上最简单的。

2)、 基于Web访问,用户界面非常友好、直观和灵活,在许多情况下,还提供了AJAX的即时反馈。

3)、Jenkins是基于Java开发的(如果你是一个Java开发人员,这是非常有用的),但它不仅限于构建基于Java的软件。

4)、 Jenkins拥有大量的插件。这些插件极大的扩展了Jenkins的功能;它们都是开源的,而且它们可以直接通过web界面来进行安装与管理。

Jenkins安装

  • 环境要求
  1. 需要JDK环境

  2. Jenkins官网下载地址:https://jenkins.io/download/

  • RPM安装(目前采取这种方式安装)
1.赋予执行权:
chmod +x *.rpm
2.执行RPM安装命令:
rpm -ivh *.rpm
3.修改启动端口:
vim  /etc/sysconfig/jenkins 
JENKINS_PORT="8091"
4.启动和关闭:
sudo service jenkins start/stop
  • war包安装
1. 安装tomcat
2. 下载war包
3. 修改相关配置后进行部署,war包部署比较简单,不再进行详细描述
  • 初始化


    upload successful

    upload successful

    upload successful
  • 本地化

  1. 安装插件


    upload successful
  2. 系统管理 -> 系统设置 ->配置该项


    upload successful
  • Jenkins插件介绍

BitKeeper Plugin — 为Jenkins添加BitKeeper(Linux 内核开发人员在全球使用的主要源代码工具)支持。

Visual SourceSafe Plugin — 该插件集成微软的VSS到Jenkins。

Git Plugin — 该插件允许使用GIT作为一个构建SCM(源代码控制管理系统),但必须使用Git 1.3.3及以上。

Team Foundation Server Plugin — 该插件集成了 MicrosoftTeam Foundation Server源码控制到Jenkins中。

CMVC Plugin — 该插件集成CMVC(IBM和许多跨国公司的缺陷管理工具。)到Jenkins。

File System SCM — Use File System as SCM.使用文件系统作为SCM。

StarTeam — 该插件把StarTeam(Starteam 是一个集合了版本控制和缺陷控制两种功能的软件,并且具有 CVS 没有的强大的图形界面,易学易用。2002年底被Borland公司收购。)和Jenkins集成在一起。

Subversion Plugin — 该插件增加Jenkins对svn(通过SVNKit)的支持。

Accurev Plugin — 该插件允许您在Jenkins中使用 AccuRev作为SCM。

Template Project Plugin — 该插件可以让您使用另一个项目中的构建人、发布人和SCM设置。

URL SCM — 该插件允许您使用URLs作为SCM。

Bazaar Plugin — 该插件集成Bazaar到 Jenkins,该插件需要确保Bazaar 库(bzr)已安装到目标机器上。

PVCS SCM — 该插件集成了Serena提供的PVCS SCM。

Mercurial Plugin — 该插件集成Mercurial version control system到Jenkins中。

Perforce Plugin — 该插件集成Perforce到Jenkins中。

Synergy Plugin — 该插件把CM/Synergy版本管理系统集成在Jenkins。

Dimensions — 该插件集成Dimensions SCM到Jenkins中。

ClearCase Plugin — 把ClearCase(IBM提供的版本控制系统)集成到Jenkins。

  • 跟SCM有关联的其它插件:

SVNCompat14 Plugin — 该插件强制内置SVNKit库使用Subversion 1.4工作拷贝格式(替代它最近支持的svn版本。)

Subversion Tagging Plugin —该插件在成功的构建中执行svn标签(也就是使用 svn copy)。

CVS Tagging Plugin — 该插件将在一个作业构建成功后执行cvs标签(也就是cvs rtag)。

  • 构建触发

Ivy Plugin — 该插件通过配置Apache Ivy自动化地配置一次构建并触发其有构建依赖的其他构建。

Join Plugin — 该插件允许一个作业在所有它下游的作业结束以后才开始运行它本身。

Log-Action plugin — 该插件在作业输出中按选定模式开始一系列动作,但这是一个统一的配置。

URL Change Trigger — 该网址变更触发器插件允许您当网址的内容发生变更时Jenkins触发一次构建。

Locks and Latches plugin —该插件允许你管理作业的并发执行。

IRC Plugin — 该插件在您选择的IRC 频道中安装Jenkins IRC 机器人,您可以通过IRC获得通知,并通过IRC与Jenkins互动。

Downstream-Ext Plugin — 该插件为下游触发器支持扩展配置。当前它增加一个选项,如果它们发生SCM改变时,仅仅触发下游的构建。

Jabber Plugin — 把Jabber即时消息协议集成在Jenkins中。注意您也需要安装instant-messaging 插件。

Naginator Plugin — 该插件允许您在一次构建失败后自动重建一次构建。

  • 构建工具
    Jenkins本身支持Maven、Ant、Shell脚本和Windows批处理命令。

Grails Plugin — 该插件允许Jenkins调用Grails 任务作为一个构建步骤。

PowerShell Plugin — 在Jenkins中集成Windows PowerShell。

Jython Plugin — 在JVM中增加执行Jython脚本的能力。

Post build task — 该插件允许用户依据构建日志的输出执行一个shell/批处理任务。

Ruby Plugin — 该插件允许用户在构建脚本中使用Ruby。

Gant Plugin — 该插件允许Jenkins调用Gant构建脚本作为主体构建的一个步骤。

Seleniumhq Plugin — 该插件允许您从Seleniumhq中运行和加载通过Selenium服务器生成的HTML Selenese套件结果。Jenkins将以此生成测试结果的趋势报告。

Groovy plugin — 该插件允许Jenkins直接执行Groovy代码。

Rake plugin — 该插件允许Jenkins调用Rake任务作为构建步骤。

NAnt Plugin — 该插件允许你在Jenkins中使用NAnt构建.NET项目。

Template Project Plugin — 该插件可以让您在Jenkins中使用另一个项目中的构建人、发布人和SCM设置。

Buckminster PlugIn — 该插件把Eclipse Buckminster做为一个新的构建步骤集成在Jenkins中。

Python Plugin — 添加执行Python脚本作为Jenkins的构建步骤。

SCons Plugin — 该插件允许Jenkins调用SCons构建脚本作为主体构建的步骤。

Selenium AES Plugin — 该插件能让Jenkins调用Selenium Auto Exec Server(AES) 来测试。

Kundo Plugin — 该插件允许你调用Kundo构建作为一个Jenkins构建步骤。

Gradle Plugin — 该插件允许Jenkins调用Gradle构建脚本作为主体构建的步骤。

EasyAnt Plugin — 该插件允许Jenkins调用EasyAnt构建脚本作为主体构建的步骤。.

RAD Builder Plugin — 该插件允许你调用IBM RAD7.0/7.5作为一个Jenkins构建步骤。

Phing Plugin — 该插件允许你在Jenkins中使用Phing构建PHP项目。

SCTMExecutor — 该插件允许您在Jenkins中使用Borland 的SilkCentral Test Manager 2008 R2 及以上版本。

MSBuild Plugin — 该插件允许您在Jenkins中使用MSBuild构建.NET项目。

Batch Task Plugin — 该插件增加一些不规律执行的批处理任务到项目中,诸如打包、集成、归档等等。

  • 构建封装

Xvnc Plugin — 该插件可以让您在一次构建时运行Xvnc会话。如果您的构建包括用户界面测试时需要一个可暴露的显示值这就非常方便。

ZenTimestamp Plugin — 该插件允许您在Jenkins BUILD_ID变量中自定义日期和时间模式。

VMware plugin — 该插件允许您在一次构建开始前启动VMware虚拟机,构建完成后又停止该虚拟机。

Build Secret Plugin — 让你通过一次构建上传可用的秘密文件。

M2 Release Plugin —这是一个能让您在Jenkins中使用maven-release-plugin 来执行发布功能的插件。

M2 Extra Steps Plugin — 该插件为Jenkins加入pre- 和post- 构建步骤到Maven 2类型的项目的能力。

Template Project Plugin — 该插件可以让您使用另一个项目中的构建人、发布人和SCM设置。

Locks and Latches plugin — 该插件允许您控制作业的并发执行。

Jenkins Distributed Workspace Clean plugin —该插件允许您在同一个隶属组中未使用的隶属机器来清理工作区。

Release Plugin — 该插件允许您在当一次发布构建是手动触发时,配置预前构建或后构建的执行动作。

Copy To Slave Plugin — This plugin allows to copy, to slave nodes running a job, a set of files that are required for the good execution of the job.

Setenv Plugin — 为一个项目设置环境变量,以备构建步骤引用。

  • 构建通知
    Jenkins本身支持电子邮件通知,但也有一个可扩展的电子邮件插件来支持扩展功能。

Status Monitor Plugin — 该插件能让您在Jenkins单独的屏幕上直观地显示您选定作业的状态。.

SameTime Plugin — 该插件允许您在Jenkins中使用SameTime作为构建通知。

Nabaztag Plugin — 该插件允许您在Jenkins中发布一次构建的结果到Nabaztag。

Google Calendar Plugin — 该插件允许Jenkins发布当前作业状态到谷歌日历。

JenkinsTracker — A cross-platform application that sits in your system tray and monitors Jenkins builds via its RSS feeds. See JenkinsTracker for more details. No Jenkins server config required!

TuxDroid Plugin — 该插件允许您在Jenkins发布一个构建的结果到TuxDroid(Tux Droid是一个强大的Linux玩具,它可以通过配套的软件与你电脑中的很多应用程序相关联)。

IRC Plugin — 该插件在您选择的IRC 频道中安装Jenkins IRC 机器人,您可以通过IRC获得通知,并通过IRC与Jenkins互动。

Email-ext plugin — This plugin allows you to configure every aspect of email notifications. You can customize when an email is sent, who should receive it, and what the email says.

Instant Messaging Plugin — This plugin provides generic support for IM notifications. This plugin itself is of no use. Please use one of the derived plugins like (at the moment only) Jabber !

Blame Upstream Commiters Plugin — This is a very simple plugin that adds a post build action to mail upstream commiters when a build fails.

Campfire Plugin — This plugin allows your team to setup build notifications to be sent to Campfire rooms.

The new EMailer — Merge of the Core EMailer and email-ext plugin

Twitter Plugin — This plugin posts build results to Twitter.该插件支持Jenkins发送构建报告到Twitter。

Jabber Plugin — 把Jabber即时消息协议集成在Jenkins中。注意您也需要把安装 instant-messaging plugin 。

  • 隶属(机器)激活和控制
    Jenkins本身支持通过JNLP或者命令启动隶属,以及支持尽可能保持隶属连接,或者按需连接。

SSH Slaves plugin — 该插件允许您在SSH外的隶属* nix机器上运行和管理Jenkins。

  • 构建报告
    Jenkins本身支持Junit报告和JavaDoc。

Serenitec Plugin — 在您的项目中执行Serenitec重构方案。

Violations — 该插件为checkstyle、 pmd、 cpd、 findbugs、 fxcop、 stylecop和simian等静态代码分析工具生成报告。

NUnit Plugin — 该插件允许你发布NUnit测试结果。

WebTest Presenter Plugin — This plugin publishes the reports generated by the Canoo WebTest tool for each build.

MSTest Plugin — 该插件允许您发布MSTest的测试结果。

Crap4J Plugin — This plugin reads the "crappy methods" report from Crap4J. Jenkins will generate the trend report of crap percentage and provide detailed information about changes.

FindBugs Plugin — 该插件主要收集项目模块中FindBugs(静态分析源代码中可能会出现的Bug的Eclipse插件工具)的分析结果,并以视图的方式呈现已发现的警告。

Seleniumhq Plugin — 该插件允许您从Seleniumhq中运行和加载通过Selenium服务器生成的HTML Selenese套件结果。Jenkins将以此生成测试结果的趋势报告。

Cppcheck Plugin — 该插件为CppCheck(静态的C/C++ 代码分析工具)生成趋势报告。

NCover Plugin — 该插件允许Jenkins从NCover中归档和发布.NET代码覆盖率的HTML 报告。

JDepend Plugin— 该JDepend插件是一个为构建生成JDepend 报告的插件。

Plot Plugin — 该插件为Jenkins提供通用的测绘(或图表)的能力。

Checkstyle Plugin — 该插件主要收集项目模块中Checkstyle (自动化代码检查工具)的分析结果,并以视图的方式呈现已发现的警告。

JavaNCSS+Plugin — 该插件允许您使用JavaNCSS构建报告工具。

SLOCCount Plugin — 该插件能为SLOCCount生成趋势报告,它是一个开源程序,能为超过25种不同的语言统计代码行的数量,包括C/C++、Ada、COBOL、 Fortran、SQL、 Ruby、 Python等等。

JavaTest Report Plugin — 该插件把JavaTest(一个通过Sun公司发布的TCK应用的 框架)中解析成XML结果文件,并以此方式显示它们。

Emma Plugin — 该插件在Jenkins中集成EMMA code coverage reports (检测和报告 JAVA 代码覆盖率的开源工具)。Jenkins will generate the trend report of coverage.

Warnings Plugin — This plugin generates the trend report for compiler warnings in the console log or in log files.

Gallio Plugin — 该插件允许您发布Gallio/MbUnit的测试结果。

Doxygen Plugin —该插件可发布通过Doxygen工具生成的报告。

Testability Explorer Plugin —该插件为Testability Explorer生成趋势报告,这是一个能使用字节码分析以在Java代码中寻找可测性缺陷的开放源码程序。

DRY Plugin — 该插件为像 CPD那样的重复代码检查器生成趋势报告。

Japex Plugin — 该插件为Jenkins 增加了Japex 支持,以使Jenkins 能够显示其趋势报告和其他有用的数据。

PMD Plugin — 该插件主要收集项目模块中PMD(程序代码检查工具)的分析结果,并以视图的方式呈现已发现的警告。

Selenium AES Plugin — 该插件调用Selenium Auto Exec Server(AES) 来测试。

Task Scanner Plugin — 该插件为开放任务扫描工作区文件,并生成一个趋势报告。

PureCoverage plugin — PureCoverage plugin reports coverage results from Rational PureCoverage tool (c++ coverage tool).

Gnat Plugin — 该插件允许Jenkins集成Gnat的功能来作为ADA(Ada是一种表现能力很强的通用程序设计语言,它是美国国防部为克服软件开发危机,耗费巨资,历时近20年研制成功的。)语言。

Grinder Plugin — 该插件从Grinder 执行测试中读取输出结果,并生成报告,其中包括显示每次构建的测试结果和对应的构建显示执行结果的趋势报告。

JSUnit plugin — This plugin allows you publish JSUnit test results

Cpptest Plugin — This plugin allows you publish Parasoft C++test test results.

Clover Plugin — 该插件是在Jenkins中集成 Clover code coverage reports(代码覆盖测试分析工具)。Jenkins will generate and track code coverage across time. This plugin can be used without the need to modify your build.xml.

Cobertura Plugin — 该插件允许您从Cobertura中获取代码覆盖率报告。Jenkins将生成覆盖率趋势报告。

eXtreme Feedback Panel Plugin — This plugin provides an eXtreme Feedback Panel that can be used to expose the status of a selected number of Jobs.

CppUnit Plugin — 该插件允许您发布CppUnit测试结果。

Ruby metrics plugin — 该插件添加Ruby统计报告( Rcov, Saikuro, Rails stats...)的捆绑包到Jenkins中。

  • 构件上传

SCP plugin — 该插件允许你使用SFTP (SSH)协议上传一些构件到仓库站点。

FTP-Publisher Plugin — 该插件能上传项目构件和整个目录到一个FTP服务器。

SFEE Plugin — 依赖于Collabnet Source Forge Enterprise Edition (SFEE是SourceForge发布的项目协作管理软件) 服务器验证用户并发布构件。

java.net uploader Plugin — 该插件使用java.net 任务库,以使Jenkins有能力发送构件到 java.net。

SVN Publisher — This plugin allows you to upload artifacts to a subversion repository. This is done via a delete/import of the items requested.

  • 其他构建后操作
    Parameterized Trigger Plugin — 该插件可以让你在构建完成后触发新的构建,并为这次新构建使用不同的方式指定一些参数。

Build Publisher Plugin — 该插件允许您把一个Jenkins的记录发布到另一个Jenkins中。

Post build task — 该插件允许用户依据构建日志的输出执行一个shell/批处理任务。Java regular expression are allowed.

Description Setter Plugin — 该插件为每次构建设置描述信息,它是一个基于正则表达式校验的构建日志文件。

Deploy Plugin — This plugin takes a war/ear file and deploys that to a running remote application server at the end of a build

DocLinks Plugin — 该插件允许您发布在构建步骤中创建的文档。

Subversion Tagging Plugin — This plugin performs subversion tagging (technically speaking svn copy) on successful build.

CVS Tagging Plugin — 该插件将在一个作业构建成功后执行cvs标签(也就是cvs rtag)。

CopyArchiver Plugin — 该插件的目标是从几个作业中把已归档的构件集中到一个共享目录。每个作业中只有最后一次成功构建的归档构件才会被复制。

Text-finder Plugin — 该插件是用来在工作区文件中搜索字符串。这个搜索结果可以用来标记该构建是正常或者失败。

下回预告

下一篇博客介绍Jenkins的使用:自动从svn上checkout项目->构建->部署到服务器。

参考资料

插件部分参考网上博客,由于找不到来源,无法贴出。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容