Jenkins实践文档(4)

Jenkins应用管理

激活

  1. 安装Jenkins之后访问 172.16.246.207:8080

  2. 根据页面提示输入管理员密码解锁Jenkins配置

    通常密码在页面上都有所提示,例如 /var/lib/jenkins/secrets/initialAdminPassword

管理界面

登陆Jenkins之后, Jenkins -> Manage Jenkins,

通常对应的url是 http://172.16.246.207:8080/manage

manage_jenkins.png

插件管理

通常我们刚刚安装完Jenkins之后,在主界面的通知栏,或Jenkins管理界面前面看到许多错误的信息,一般都是由于缺失某些插件造成,这时候可以按照提示,到插件管理的页面,将对应插件安装。

进入 Jenkis 管理界面 之后, Manage Jenkins ->Manage Plugins,

通常对应的url是 http://172.16.246.207:8080/pluginManager/

manage_plugins.png

手动安装插件

如果有插件一直安装失败的情况,可以从jenkins官网下载插件,然后导入到jenkins。

Manage Jenkins ->Manage Plugins ->高级 ->上传插件,

通常对应的url是:http://172.16.246.207:8080/pluginManager/advanced

manage_plugins_upload.png

作业管理

注:这里的作业,有时候也称作任务。

前提

  1. 待触发的构建脚本

    发生相应触发条件(比如后面监视的Git项目被更新等等),执行特定的脚本,这里暂时也称构建脚本。

    这里给出一个例子,假设脚本路径: 172.16.246.207:/var/lib/jenkins/myshell/test/test_trigger1.sh, 属于jenkins用户,脚本内容:

    #!/bin/bash
    echo "测试触发执行1"
    sleep 2
    echo "脚本执行工作路径为:$(pwd)"
    A=1
    while [ $A -le 13 ];
    do
        echo "Step $A"
        sleep 1
        A=$(expr $A + 1)
    done
    echo "测试执行完毕"
    

    当然随着需求,不同的任务作业可能会执行不同的触发脚本,后面需要时会提及。

  2. 监视的Git项目

    此处假设被监视项目源码地址为: ssh://szic@172.16.246.207:/home/szic/test/jenkins_git_repo, 在此项目上发生一定条件会触发执行构建脚本。

  3. 权限添加

    因为有些过程需要通过ssh远程执行,而jenkins自动执行的过程中要求不能在执行过程中交互输入密码验证,所以需要提前添加好需要远程访问的用户与主机的授权信息以实现免密直接远程执行。

    1. 用于执行构建脚本的权限

      jenkins@vmcnszs207:~$ ssh-copy-id jenkins@172.16.246.207
      

      因为将要执行172.16.246.207下jenkins用户目录中的一个脚本,所以需要将远程访问jenkins@172.16.246.207的授权信息添加。(注意:这里,其实本身访问者就是jenkins@172.16.246.207,直接用本地路径而不用ssh访问即可,这里只是为通用起见,采用了远程ssh执行的方式进行。

    2. 用于获取待监视Git项目代码的权限

      jenkins@vmcnszs207:~$ ssh-copy-id szic@172.16.246.207
      

      这样会自动将当前 jenkins 用户的 .ssh/id_rsa.pub 文件内容追加至在 172.16.246.207szic 用户目录下 .ssh/authorized_keys 文件中,实现免密ssh登陆(即 ssh szic@172.16.246.207),因此可以后面的过程中直接连接添加的 172.16.246.207 下的git项目。

    3. 其它权限

      如果需要用ssh访问其它主机对应的其它用户,需要同样用 ssh-copy-id 的方式添加授权,实现免密执行。

添加新任务作业

这里讲述的任务作业主要有三种类型:

  • 触发式任务作业: 发生一定条件自动触发构建脚本。
  • 参数任务作业: 执行构建时需要传入一个参数。
  • 计划任务作业: 按照一定周期定期自动构建(属于触发式构建的一种)。
  1. 通用设置

    1. 在登录界面执行 Jenkins ->新建任务, 通常对应的界面为: http://172.16.246.207:8080/view/all/newJob

      根据需求,输入Job基本信息,如:名称、类型。

      如图:

      newjob1.png

    2. 选择监视的项目源码

      这里选择监控git项目,项目路径若在本地直接填写本地路径,若在远程需ssh下载,则需前面 ssh-copy-id 添加的信息。

      添加操作如图:

      newjob2.png

    3. 设置执行的构建脚本

      同样,如果远程执行脚本,也需要用 ssh-copy-id 添加相应的授权信息。

      设置操作如图:

      newjob3.png

  2. 触发式任务设置

    假设需求是:某Git项目如果发生变化,就触发执行某脚本,这个时候,就需要添加触发式任务了。

    在前面添加任务(参见: 添加任务 (参见第2.3.4.2节) ),或者编辑任务(参见: 编辑已有任务作业 (参见第2.3.4.5节) )的时候,可以添加触发式任务的属性。

    1. 设置构建触发器

      这样可以通过特定的URL触发构建过程,对于有些时候利用 git hook 脚本检测的用户提交代码后,自动访问该URL,导致触发,很有用。

      1. 选择 触发远程构建 ,并通过添加 token name 来标识触发任务构建的特定URL,如下:

        newjob4.png

      2. 如上设置之后,点击 保存 ,即可创建好对应的触发式任务,并获取触发执行的URL。

        假设这里设置的触发token名称如图为 trigger_test1_token, 实践发现,此时在浏览器中,直接按照提示键入URL: http://172.16.246.207:8080/job/trigger_test1/build?token=trigger_test1_token, 即可触发构建脚本(此时跳转到一个空白页面),但是如果事先浏览器中没有登陆过,键入如上URL后需要登陆用户才可触发,在外部工具如 curl 等直接向该URL发送请求,并不会触发任务执行,需要特定用户特定令牌环信息才可通过外部工具直接发送URL触发,参见后面 添加用户令牌 (参见第2.3.4.2.2.2节)。

    2. 添加用户令牌

      主要是为了设置用户触发特定触发器URL的TOKEN,以防所有人都能通过构建触发器的特定URL触发构建。

      设置好构建触发器之后,需要再为特定的用户获取一个授权token,然后通过外部工具向触发器的特定URL触发作业构建的时候,加入这个用户token的授权信息才能触发。

      1. 选择 Jenkins->用户列表

        newjobtoken1.png

      2. 再选择 设置, 并创建用户对应的令牌

        newjobtoken2.png

      3. 拷贝令牌:

        newjobtoken3.png

        拷贝之后,不用点击页面上的 保存 也可(注意,需要自行记录拷贝的token,因为之后将无其它方式再次获取此token只能更新重新获取新的)。

      安全起见,建议令牌环每隔一段时间更新一次。

      至此,获取到用户的Token,可以利用如curl等工具,结合该token与任务作业的触发器URL,触发构建脚本。具体参见 测试触发执行任务 (参见第2.3.4.4节) 部分。

    3. 设置执行的构建脚本

      这里直接使用 设置执行的构建脚本 (参见第2.3.4.2.1.3节) 的设置。

  3. 参数式任务设置

    假设需求是: 执行任务时,会将参数传入构建脚本,并执行。

    这里创建的任务是参数式任务,假设前面通用过程中设置的任务名称是 param_test

    1. 设置参数信息

      包括参数名称、默认值、以及描述信息,过程如下:

      newpjob1.png

      newpjob2.png

      newpjob3.png

    2. 设置执行的构建脚本

      这里,脚本的设置与前面不同,需要带有参数信息,可以将前面的参数名称传递给脚本,待执行的脚本内容如下:

      #!/bin/bash
      echo "测试参数执行"
      echo "脚本执行工作路径为:$(pwd)"
      echo "脚本执行参数为:$1"
      echo "测试执行完毕"
      

      设置如下:

      newpjob4.png

      newpjob5.png

      注:最后点击 保存 即可。

  4. 计划式任务设置

    假设需求是: 按照一定的周期执行任务。

    这里创建的任务是计划式任务,假设前面通用过程中设置的任务名称是 cron_test

    1. 设置构建触发器

      这样可以按照特定的时间规则触发构建过程,对于有些时候比如定期发布新版本,很有用。

      1. 选择 定时构建 ,并通过添加 日程表 内容来标识计划任务构建的规则,如下:

        newcjob1.png

      2. 关于计划规则,参见cron命令的规则, man手册: man 5 crontab

        大致如下:

        配置描述计划任务配置信息,每行的基本格式如下:
        *  *  *  *  *
        
        总共六个字段,每个字段对应含义分别为:
        分 时 日 月  周
        
        每个部分以空格分隔,除了最后一个部分(命令)可以在内部使用空格之外,其他部分都不能使用空格。
        
        例如:
        30 20 * * *
        表示每天的20:30。
        
    2. 设置执行的构建脚本

      这里的方式与 设置构建脚本 (参见第2.3.4.2.1.3节) 中的方法一样,不详细描述,

      脚本如下:

      #!/bin/bash
      echo "测试计划执行"
      echo "脚本执行工作路径为:$(pwd)"
      echo "执行时间为:$(date "+%F %T")"
      echo "测试执行完毕"
      

      设置截图:

      newcjob2.png

测试执行任务

  1. 测试执行任务

    1. 方式一、在Jenkins任务界面执行

      如下:

      1. 找到 Jenkins->待执行任务

        如图:

        execjob1.png

        这里,点击任务后面的执行任务按钮也行,或者进入任务到后面的界面执行。

      2. 执行任务

        进入任务界面之后,点击 立即构建 即可,如图:

        execjob2.png

    2. 方式二、在视图中直接执行

      1. 选择 Jenkins->我的视图 如下:

        newjobtest1.png

        注:如果没有 我的视图, 可以在 Jenkins->新建视图 中添加。

      2. 执行刚刚添加的任务如下:

        newjobtest2.png

    3. 对于参数任务的执行

      1. 找到 Jenkins->待执行任务

        如图:

        newjobptest1.png

        这里,点击任务后面的执行任务按钮也行,或者进入任务到后面的界面执行。

      执行过程类似,给出两种方式:

      • 方式1. 视图中直接执行

        选择如图:

        execpjob1.png

        填入参数并执行,如图:

        execpjob2.png

      • 方式2. 进入任务界面后执行

        进入任务界面如图:

        execpjob3.png

        选择 Build with Parameters 并填入参数构建如图:

        execpjob4.png

  2. 查看任务执行历史情况

    1. 选择 Jenkins->构建历史 如下:

      newjobtest4.png

    2. 在前面点击任务对应的终端图标后,便可以看到任务执行的情况(成功、失败、以及执行中的输出等),如下:

      newjobtest5.png

测试触发执行任务

假设我们要触发执行的任务,其触发式信息在 触发式任务设置 (参见第2.3.4.2.2节) 设置了。大致信息是:

  • 任务作业: trigger_test1
  • 作业触发器token名: trigger_test1_token
  • 获取到用户的Token之后,用户 szic 的token为 11ad4c850981f9ec225774804a8559b512

可以类似如下的方式直接触发脚本:

$curl -X POST 172.16.246.207:8080/job/trigger_test1/build?token=trigger_test1_token --user szic:11ad4c850981f9ec225774804a8559b512
#或者
$curl -X POST szic:11ad4c850981f9ec225774804a8559b512@172.16.246.207:8080/job/trigger_test1/build?token=trigger_test1_token

实践发现,虽然我们已经有了用户Token可以直接通过 curl 等外部命令发送请求触发任务,但是如果在浏览器上访问: [[http://szic:11ad4c850981f9ec225774804a8559b512@172.16.246.207:8080/job/trigger_test1/build?token=trigger_test1_token]] 仍然只能在登陆Jenkins之后,才能触发。如果没有登陆,浏览器也会提示输入登陆用户密码后,才能跳转到一个空白的页面(表示已经触发了构建脚本)。

一般常用的方式是可将相应触发命令添加到git的相应hook中,使其能够在特定的时机(比如push)来触发任务,执行到构建脚本。

编辑已有任务作业

  1. 找到 Jenkins->待编辑作业

  2. 进入编辑选项编辑作业

    可以点击待编辑作业右面的小三角,然后选择编辑按钮如下:

    editjob1.png

    也可直接点击待编辑作业,然后选择右面的 配置 按钮,如下:

    editjob2.png

另外,这里还可以看到编辑历史等信息。

删除任务

  1. 找到 Jenkins->待删除作业

  2. 进入编辑选项删除作业

    可以点击待删除作业右面的小三角,然后选择 删除项目 按钮如下:

    deljob1.png

    也可直接点击待删除作业,然后选择右面的 删除项目 按钮,如下:

    deljob2.png

用户管理

选择路径: 系统管理->管理用户, 通常对应的 URL 是 http://172.16.246.207:8080/securityRealm/

操作如图:

newuser1.png

newuser2.png

创建新用户

  1. 点击 新建用户 ,即可进入添加用户的页面。

    newuser3.png

  2. 然后填入用户信息,主要是用户名、密码、邮箱等。

    newuser4.png

编辑用户

  1. 选择路径: 管理用户->待编辑的用户, 可以直接点击右侧的配置图标,或者直接点击对应用户。

    setuser1.png

  2. 编辑用户

    这里可以对用户名称、token等信息进行设置

    setuser2.png

权限管理

确定权限

管理权限前,需要确定相应的用户,以及将要被分配给用户的权限。

创建的用户可参照前面 创建新用户 (参见第2.3.5.1节) 的方式添加相应用户,下面是他们将会具有的权限:

  • szic: 管理系统
  • tester: 查看系统,管理系统中所有任务作业
  • test_manager: 管理特定的任务作业
  • test_developer: 执行任务作业
  • Anonymous: 只读,即直接进入Jenkins主页后,不登陆状态下能看到的内容。

安装 role-strategy 插件

进入插件管理器,安装插件 Role-based Authorization Strategy 。便于可以为不同用户或组使用不同的权限策略。

选择路径:

  • Jenkins->插件管理
  • 可选插件->过滤输入"Role-based AuthorizationStrategy"->选中列表的"Role-based Authorization Strategy ->直接安装

具体方式参见: 插件管理 (参见第2.3.3节) 。这里安装如下:

plugin_role1.png

plugin_role2.png

如果无法直接安装可以手动下载安装,下载地址: role-strategy

全局安全配置

这里将使用刚刚安装的 role-strategy 插件的策略管理权限。如下:

  1. 选择路径: 系统管理->全局安全配置

    manage_security1.png

    manage_security2.png

  2. 找到 授权策略->Role-Based Strategy

    manage_security3.png

管理角色

进入 role-strategy 插件, 选择路径: Jenkins->Manage and Assign Roles->Manage Roles

manage_security4.png

manage_security5.png

不同的角色,对应不同的权限范围。

  1. 添加全局角色(Global roles)

    全局角色负责对系统权限的管理控制。

    这里有两个管理角色,不同角色有不同的管理权限:

    • admin:对整个jenkins都可以进行操作
    • ops:可以对所有的job进行管理
    • others: 只有读的权限

    添加信息对应如下:

    manage_security6.png

    manage_security7.png

    注意保存。

  2. 添加项目角色(Item roles)

    项目角色负责对项目权限的管理控制,也就是任务作业的管理权限。

    这里有两个管理角色,不同角色有不同的管理权限:

    • test_job_manager:只对特定任务作业(这里是 test_job )有管理权限。
    • test_job_developer:特定任务作业(这里是 test_job )只有构建、浏览、以及查看项目的权限。

    添加过程如下:

    manage_security8.png

    manage_security9.png

    manage_security10.png

    注意保存。

分配角色

前面创建的各种角色,将分配给不同的用户,实现对其的权限控制。

  1. 选择 Manage and Assign Roles->Assign Roles

    如下:

    manage_security11.png

  2. 分配 Global RolesItem Roles

    如下:

    manage_security12.png

    manage_security13.png

注意保存。

检查设置后的权限

最后每个人看到的系统界面,根据权限不同,如下:

节点管理

关于节点

节点是Jenkins实现分布式部署的途径,一台Jenkins实现多台服务器的部署.简单的举个例子,我们有一台Jenkins服务器,有两台甚至多台的生产服务器需要我们Jenkins去部署、构建等操作。在大中型的项目中,Jenkins是与生产服务器部署在不同的服务器上面的,但是需要Jenkins服务器去管理生产服务器,这时候一台生产服务器就是Jenkins的一个节点,多个就是多个节点。

从节点

  1. 从节点环境

    1. 操作系统

      root@cnszs215:/etc/apt/sources.list.d# cat /etc/issue
      Ubuntu 14.04.4 LTS \n \l
      

      这里简单介绍下从节点环境搭建过程,后面将从主节点操作连接从节点,并远程在从节点上执行任务作业。

    2. SSH认证

      这里,假设主节点是 172.16.246.207, 从节点是 172.16.246.215

      从节点可能会通过 ssh 方式访问主节点(比如下载代码)。

      事先需要为从节点配置相关的sshkey,以及免密登陆,如下:

      jenkins@cnszs215:~$ ssh-keygen 
      Generating public/private rsa key pair.
      Enter file in which to save the key (/home/jenkins/.ssh/id_rsa): 
      Enter passphrase (empty for no passphrase): 
      Enter same passphrase again: 
      Your identification has been saved in /home/jenkins/.ssh/id_rsa.
      Your public key has been saved in /home/jenkins/.ssh/id_rsa.pub.
      The key fingerprint is:
      0c:05:49:37:4d:61:0c:44:c8:0d:c7:83:f6:35:da:76 jenkins@cnszs215
      The key's randomart image is:
      +--[ RSA 2048]----+
      |     o+@O=+.     |
      |      *++o=      |
      |     ... = .     |
      |       oo o E    |
      |        S. .     |
      |                 |
      |                 |
      |                 |
      |                 |
      +-----------------+
      jenkins@cnszs215:~$ ssh-copy-id szic@172.16.246.207
      /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
      /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
      szic@172.16.246.207's password: 
      
      Number of key(s) added: 1
      
      Now try logging into the machine, with:   "ssh 'szic@172.16.246.207'"
      and check to make sure that only the key(s) you wanted were added.
      
    3. JDK信息

      从节点需要安装JDK环境,并且JDK环境要与主节点版本匹配。

      如果从节点JDK环境与主节点设置不一致,则在主节点添加完从节点,连接之时会出现类似如下错误:

      newnode_fail.png

      1. 检查主节点JDK环境

        假设主节点JDK环境如下:

        jenkins@vmcnszs207:~$ java -version
        openjdk version "11.0.7" 2020-04-14
        OpenJDK Runtime Environment (build 11.0.7+10-post-Ubuntu-3ubuntu1)
        OpenJDK 64-Bit Server VM (build 11.0.7+10-post-Ubuntu-3ubuntu1, mixed mode, sharing)
        
      2. 设置从节点JDK环境

        从节点按照如下命令安装与主节点版本匹配的JDK:

        #apt-get install openjdk-11-jdk
        #java -version
        root@cnszs215:/etc/apt/sources.list.d# java -version
        openjdk version "11.0.5" 2019-10-15
        OpenJDK Runtime Environment (build 11.0.5+10-post-Ubuntu-2ubuntu114.04)
        OpenJDK 64-Bit Server VM (build 11.0.5+10-post-Ubuntu-2ubuntu114.04, mixed mode, sharing)
        

        注:如果从服务器没有openjdk-11-jdk安装包,可能需要添加源,Ubuntu14.04的源添加信息如下:

        root@cnszs215:/etc/apt/sources.list.d# pwd
        /etc/apt/sources.list.d
        root@cnszs215:/etc/apt/sources.list.d# cat openjdk-r-ppa-trusty.list 
        deb http://ppa.launchpad.net/openjdk-r/ppa/ubuntu trusty main
        # deb-src http://ppa.launchpad.net/openjdk-r/ppa/ubuntu trusty main
        

        可能会很慢。

  2. Jenkins用户

    主节点连接从节点的指定用户,这里假设是以Jenkins用户做为从节点的Jenkins用户,实际按需进行。

    如下命令创建相应的Jenkins用户,并设置用户登陆密码:

    #useradd -d /home/jenkins jenkins
    #passwd jenkins
    

主节点

即安装了Jenkins服务的主机。

  1. 插件安装

    安装 SSH Build Agents 插件,这样在后面添加节点的时候, 启动方式 选项中才会有 Launch agents via SSH 这个启动方式。

  2. 添加从节点

    • 选择路径: Jenkins->系统管理->节点管理

      newnode1.png

      newnode2.png

    • 进入节点管理后: 依次进行的过程: 新建节点->输入节点名称(这里为MSAF_BUILD)->选择固定节点->确认

      newnode3.png

    • 对新建节点信息进行配置

      newnode4.png

      注:这里远程工作目录即从节点jenkins用户的主目录,具体可按需配置;标签用来在给任务作业分配节点时匹配使用。

    • 添加认证信息: 在 启动方式->主机 之处,这里使用ssh用户登陆信息做为凭据。

      newnode5.png

      newnode6.png

      注:这里必须在主节点上先登陆一次从节点,以有从节点的记录,才能保证后续节点启动时连接的成功。

      下面是207主节点、203从节点的例子,键入 yes 后,203成为 known hosts ,才能保证从节点启动成功:

      jenkins@vmcnszs207:~$ ssh 172.16.246.203
      The authenticity of host '172.16.246.203 (172.16.246.203)' can't be established.
      ECDSA key fingerprint is SHA256:b7q9WVRQVm/HY25UWznwKhPDLbOPigTB3nC/bavK7xg.
      Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
      Warning: Permanently added '172.16.246.203' (ECDSA) to the list of known hosts.
      jenkins@172.16.246.203's password:
      
    • 查看新添加节点: 上述过程保存之后,可以看见新添加的节点

      newnode7.png

    • 选择进入节点并启动代理:

      newnode8.png

      注意:在这个界面中也可再次对节点信息进行修改配置。

    • 连接代理成功并看到正常的状态

      newnode9.png

      newnode10.png

      注意:这里需要保证从节点的JDK版本和安装了Jenkins服务的主节点JDK版本一致,否则会连接失败,参见: JDK信息 (参见第2.3.7.2.1.3节) 。

  3. 添加只在新从节点上执行的任务作业

    1. 新建一个任务作业,依次选择 限制项目的运行节点-填入标签表达式

      node_job1.png

      标签表达式填写成与前面建立节点时的标签一致,这样任务作业便只会限定在指定的节点上进行。

    2. 填写项目源代码信息(如果有的话)

      node_job2.png

      注意:这里凭据方面,需要对前面相关ssh认证进行配置方可,否则无法下载代码,参见: SSH认证 (参见第2.3.7.2.1.2节) 。

      代码将下载到之前为子节点设定的主目录的 workspace 下,这里是: /home/jenkins/workspace/test_msaf

    3. 指定项目构建执行脚本

      node_job3.png

      脚本路径是相对于子节点 172.16.246.215 而言的路径。

      脚本内容如下:

      jenkins@cnszs215:~/myshell/test$ cat test_node_exec.sh 
      #!/bin/bash
      echo "测试远程执行1"
      sleep 2
      echo "脚本执行工作路径为:$(pwd)"
      echo "脚本执行所在node的网络信息"
      ip addr
      A=1
      while [ $A -le 13 ];
      do
              echo "Step $A"
              sleep 1
              A=$(expr $A + 1)
      done
      echo "测试执行完毕"
      
    4. 查看到执行情况如下:

      node_job4.png

      node_job5.png

      注:如果从节点被断开,那么任务会被挂住,等待从节点启动后再执行。现象如下:

      node_job5_1.png

  4. 添加随机在主节点和新从节点之间执行的任务作业

    过程与前面 添加只在新从节点上执行的任务作业 (参见第2.3.7.3.3节) 相同,不同之处在于不限定执行的主机:

    1. 新建一个任务作业,项目基本之处选择 在必要的时候并发构建

      node_job6.png

      选择并发构建应当不是必须的,这里只是为了提现出随机性(不选择,则发现一般都会在从节点上执行,也可能是概率,有待实践)。

    2. 为避免构建于不同主机上路径不一致的文件,直接将脚本内容填写到待执行构建步骤:

      node_job7.png

    3. 在任务列表中,多点击几次后,执行过程如下.

      node_job8.png

      注:如果从节点被断开,那么任务会直接被分配到主节点上进行。

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

推荐阅读更多精彩内容