GitLab-CI與GitLab-Runner

一污尉、持續(xù)集成(Continuous Integration)

要了解GitLab-CI與GitLab Runner,我們得先了解持續(xù)集成是什么。

持續(xù)集成是一種軟件開發(fā)實(shí)踐昧廷,即團(tuán)隊(duì)開發(fā)成員經(jīng)常集成他們的工作,通常每個(gè)成員每天至少集成一次偎箫,也就意味著每天可能會(huì)發(fā)生多次集成木柬。每次集成都通過自動(dòng)化的構(gòu)建(包括編譯,發(fā)布淹办,自動(dòng)化測(cè)試)來驗(yàn)證眉枕,從而盡快地發(fā)現(xiàn)集成錯(cuò)誤。許多團(tuán)隊(duì)發(fā)現(xiàn)這個(gè)過程可以大大減少集成的問題,讓團(tuán)隊(duì)能夠更快的開發(fā)內(nèi)聚的軟件速挑。

看完這段話谤牡,估計(jì)還是有點(diǎn)懵。怎么理解呢姥宝?我是這樣理解的:

軟件集成是軟件開發(fā)過程中的一個(gè)環(huán)節(jié)翅萤,這個(gè)環(huán)節(jié)的工作一般會(huì)包括以下流程:合并代碼---->安裝依賴---->編譯---->測(cè)試---->發(fā)布。軟件集成的工作一般會(huì)比較細(xì)碎繁瑣腊满,為了不影響開發(fā)效率套么,以前軟件集成這個(gè)環(huán)節(jié)一般不會(huì)經(jīng)常進(jìn)行或者只會(huì)等到項(xiàng)目后期再進(jìn)行。但是有些問題糜烹,如果等到后期才發(fā)現(xiàn)违诗,解決問題的代價(jià)很大,有可能導(dǎo)致項(xiàng)目延期或者失敗疮蹦。因此诸迟,為了盡早發(fā)現(xiàn)軟件集成錯(cuò)誤,鼓勵(lì)團(tuán)隊(duì)成員應(yīng)該經(jīng)常集成他們的工作愕乎,通常每個(gè)成員每天應(yīng)該至少集成一次阵苇。這就是所說的持續(xù)集成。所以說感论,持續(xù)集成是一種軟件開發(fā)實(shí)踐绅项。

軟件集成的工作細(xì)碎繁瑣,以前是由人工完成的比肄。但是現(xiàn)在鼓勵(lì)持續(xù)集成快耿,那豈不是要累死人,還影響開發(fā)效率芳绩。所以掀亥,應(yīng)該考慮將軟件集成這個(gè)工作自動(dòng)化,這就出現(xiàn)了所謂的持續(xù)集成系統(tǒng)妥色。

持續(xù)集成詳情見百度百科-持續(xù)集成

二搪花、GitLab-CI

GitLab-CI就是一套配合GitLab使用的持續(xù)集成系統(tǒng)(當(dāng)然,還有其它的持續(xù)集成系統(tǒng)嘹害,同樣可以配合GitLab使用撮竿,比如Jenkins)。而且GitLab8.0以后的版本是默認(rèn)集成了GitLab-CI并且默認(rèn)啟用的笔呀。

三幢踏、GitLab-Runner

那GitLab-Runner又是什么東東呢?與GitLab-CI有什么關(guān)系呢凿可?

GitLab-Runner是配合GitLab-CI進(jìn)行使用的惑折。一般地授账,GitLab里面的每一個(gè)工程都會(huì)定義一個(gè)屬于這個(gè)工程的軟件集成腳本,用來自動(dòng)化地完成一些軟件集成工作惨驶。當(dāng)這個(gè)工程的倉(cāng)庫(kù)代碼發(fā)生變動(dòng)時(shí)白热,比如有人push了代碼,GitLab就會(huì)將這個(gè)變動(dòng)通知GitLab-CI粗卜。這時(shí)GitLab-CI會(huì)找出與這個(gè)工程相關(guān)聯(lián)的Runner屋确,并通知這些Runner把代碼更新到本地并執(zhí)行預(yù)定義好的執(zhí)行腳本。

所以续扔,GitLab-Runner就是一個(gè)用來執(zhí)行軟件集成腳本的東西攻臀。你可以想象一下:Runner就像一個(gè)個(gè)的工人,而GitLab-CI就是這些工人的一個(gè)管理中心纱昧,所有工人都要在GitLab-CI里面登記注冊(cè)刨啸,并且表明自己是為哪個(gè)工程服務(wù)的。當(dāng)相應(yīng)的工程發(fā)生變化時(shí)识脆,GitLab-CI就會(huì)通知相應(yīng)的工人執(zhí)行軟件集成腳本设联。如下圖所示:


GitLab-CI與GitLab-Runner關(guān)系示意圖

Runner可以分布在不同的主機(jī)上,同一個(gè)主機(jī)上也可以有多個(gè)Runner灼捂。

Runner類型

GitLab-Runner可以分類兩種類型:Shared Runner(共享型)Specific Runner(指定型)离例。

Shared Runner:這種Runner(工人)是所有工程都能夠用的。只有系統(tǒng)管理員能夠創(chuàng)建Shared Runner悉稠。

Specific Runner:這種Runner(工人)只能為指定的工程服務(wù)宫蛆。擁有該工程訪問權(quán)限的人都能夠?yàn)樵摴こ虅?chuàng)建Shared Runner。

四的猛、GitLab-Runner的安裝與使用

我的操作系統(tǒng)是:Centos 7.0 64位

安裝gitlab-ci-multi-runner

  • 添加yum源
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.rpm.sh | sudo bash
  • 安裝
yum install gitlab-ci-multi-runner

這里是官網(wǎng)的安裝教程耀盗,其它操作系統(tǒng)的請(qǐng)參考
https://gitlab.com/gitlab-org/gitlab-ci-multi-runner

使用gitlab-ci-multi-runner注冊(cè)Runner

安裝好gitlab-ci-multi-runner這個(gè)軟件之后,我們就可以用它向GitLab-CI注冊(cè)Runner了卦尊。

向GitLab-CI注冊(cè)一個(gè)Runner需要兩樣?xùn)|西:GitLab-CI的url注冊(cè)token袍冷。
其中,token是為了確定你這個(gè)Runner是所有工程都能夠使用的Shared Runner還是具體某一個(gè)工程才能使用的Specific Runner猫牡。

如果要注冊(cè)Shared Runner,你需要到管理界面的Runners頁面里面去找注冊(cè)token邓线。如下圖所示:


Shared Runner

如果要注冊(cè)Specific Runner淌友,你需要到項(xiàng)目的設(shè)置的Runner頁面里面去找注冊(cè)token。如下圖所示:


Specific Runner

找到token之后骇陈,運(yùn)行下面這條命令注冊(cè)Runner(當(dāng)然震庭,除了url和token之外,還需要其他的信息你雌,比如執(zhí)行器executor器联、構(gòu)建目錄builds_dir等)二汛。
gitlab-ci-multi-runner register
注冊(cè)完成之后,GitLab-CI就會(huì)多出一條Runner記錄拨拓,如下圖所示:

GitLab-CI Runner

GitLab-CI會(huì)為這個(gè)Runner生成一個(gè)唯一的token肴颊,以后Runner就通過這個(gè)token與GitLab-CI進(jìn)行通信。

那么渣磷,問題來了婿着。注冊(cè)好了的Runner的信息存放在哪兒了呢?
原來醋界,Runner的信息是存放在一個(gè)配置文件里面的竟宋,配置文件的格式一般是.toml。這個(gè)配置文件的存放位置有以下幾種情況:

  • 在類Unix操作系統(tǒng)下(0.5.0之后版本)
  1. 如果是以root用戶身份運(yùn)行gitlab-ci-multi-runner register形纺,那么配置文件默認(rèn)是/etc/gitlab-runner/config.toml
  2. 如果是以非root用戶身份運(yùn)行gitlab-ci-multi-runner register丘侠,那么配置文件默認(rèn)是~/.gitlab-runner/config.toml
  • 在其他操作系統(tǒng)下以及0.5.0之前版本
    配置文件默認(rèn)在當(dāng)前工作目錄下./config.toml

一般情況下,使用默認(rèn)的配置文件存放Runner的配置信息就可以了逐样。當(dāng)然蜗字,如果你有更細(xì)化的分類需求,你也可以在注冊(cè)的時(shí)候通過-c--config選項(xiàng)指定配置文件的位置官研。具體查看register命令的使用方法:gitlab-ci-multi-runner register --help狈定。

問題:如果不運(yùn)行gitlab-ci-multi-runner register命令,直接在配置文件里面添加Runner的配置信息可以嗎剿干?
回答:當(dāng)然不可以狱掂。因?yàn)?code>gitlab-ci-multi-runner register的作用除了把Runner的信息保存到配置文件以外,還有一個(gè)很重要的作用始花,那就是向GitLab-CI發(fā)出請(qǐng)求妄讯,在GitLab-CI中登記這個(gè)Runner的信息并且獲取后續(xù)通信所需要的token。

讓注冊(cè)好的Runner運(yùn)行起來

Runner注冊(cè)完成之后還不行酷宵,還必須讓它運(yùn)行起來亥贸,否則它無法接收到GitLab-CI的通知并且執(zhí)行軟件集成腳本。怎么讓Runner運(yùn)行起來呢浇垦?gitlab-ci-multi-runner提供了這樣一條命令gitlab-ci-multi-runner run-single炕置,詳情如下:

[root@iZ25bjcxoq5Z ~]# gitlab-ci-multi-runner run-single --help
NAME:
   run-single - start single runner

USAGE:
   command run-single [command options] [arguments...]

OPTIONS:
   --name, --description   Runner name [$RUNNER_NAME]
   --limit     Maximum number of builds processed by this runner [$RUNNER_LIMIT]
   --ouput-limit    Maximum build trace size [$RUNNER_OUTPUT_LIMIT]
   -u, --url     Runner URL [$CI_SERVER_URL]
   -t, --token     Runner token [$CI_SERVER_TOKEN]
   --tls-ca-file    File containing the certificates to verify the peer when using HTTPS [$CI_SERVER_TLS_CA_FILE]
   --executor     Select executor, eg. shell, docker, etc. [$RUNNER_EXECUTOR]
   --builds-dir    Directory where builds are stored [$RUNNER_BUILDS_DIR]
   --cache-dir     Directory where build cache is stored [$RUNNER_CACHE_DIR]
   --env     Custom environment variables injected to build environment [$RUNNER_ENV]
   --shell     Select bash, cmd or powershell [$RUNNER_SHELL]
   --ssh-user     User name [$SSH_USER]
   --ssh-password    User password [$SSH_PASSWORD]
   --ssh-host     Remote host [$SSH_HOST]
   --ssh-port     Remote host port [$SSH_PORT]
   --ssh-identity-file    Identity file to be used [$SSH_IDENTITY_FILE]
   --docker-host    Docker daemon address [$DOCKER_HOST]
   --docker-cert-path    Certificate path [$DOCKER_CERT_PATH]
   --docker-tlsverify    Use TLS and verify the remote [$DOCKER_TLS_VERIFY]
   --docker-hostname    Custom container hostname [$DOCKER_HOSTNAME]
   --docker-image    Docker image to be used [$DOCKER_IMAGE]
   --docker-privileged   Give extended privileges to container [$DOCKER_PRIVILEGED]
   --docker-disable-cache   Disable all container caching [$DOCKER_DISABLE_CACHE]
   --docker-volumes    Bind mount a volumes [$DOCKER_VOLUMES]
   --docker-cache-dir    Directory where to store caches [$DOCKER_CACHE_DIR]
   --docker-extra-hosts   Add a custom host-to-IP mapping [$DOCKER_EXTRA_HOSTS]
   --docker-links    Add link to another container [$DOCKER_LINKS]
   --docker-services    Add service that is started with container [$DOCKER_SERVICES]
   --docker-wait-for-services-timeout  How long to wait for service startup [$DOCKER_WAIT_FOR_SERVICES_TIMEOUT]
   --docker-allowed-images   Whitelist allowed images [$DOCKER_ALLOWED_IMAGES]
   --docker-allowed-services   Whitelist allowed services [$DOCKER_ALLOWED_SERVICES]
   --docker-image-ttl     [$DOCKER_IMAGE_TTL]
   --parallels-base-name   VM name to be used [$PARALLELS_BASE_NAME]
   --parallels-template-name   VM template to be created [$PARALLELS_TEMPLATE_NAME]
   --parallels-disable-snapshots  Disable snapshoting to speedup VM creation [$PARALLELS_DISABLE_SNAPSHOTS]
   --virtualbox-base-name   VM name to be used [$VIRTUALBOX_BASE_NAME]
   --virtualbox-disable-snapshots  Disable snapshoting to speedup VM creation [$VIRTUALBOX_DISABLE_SNAPSHOTS]

要讓一個(gè)Runner運(yùn)行起來,--url男韧、--token--executor選項(xiàng)是必要的朴摊。其他選項(xiàng)可根據(jù)具體情況和需求進(jìn)行設(shè)置。我們可以看出來此虑,這個(gè)命令里面的選項(xiàng)跟配置文件中Runner的配置項(xiàng)基本上是一樣的甚纲。那這個(gè)命令的運(yùn)行和配置文件有沒有什么關(guān)系呢?從我的試驗(yàn)和思考來看朦前,應(yīng)該是沒有什么關(guān)系的介杆。因?yàn)椋?/p>

  1. 這個(gè)命令里面并沒有指定配置文件位置的選項(xiàng)鹃操,如果讀取配置文件難道去讀取默認(rèn)位置嗎?但是配置文件的位置是可以指定的春哨,不一定在默認(rèn)位置荆隘,這不符合邏輯,所以它應(yīng)該不會(huì)去讀配置文件悲靴。
  2. 我刪掉配置文件臭胜,這個(gè)命令依然能夠運(yùn)行

所以,這個(gè)命令應(yīng)該只是一個(gè)能讓Runner運(yùn)行起來的基礎(chǔ)命令癞尚。但這個(gè)命令運(yùn)行起來的前提是耸三,GitLab-CI中必須事先注冊(cè)有這個(gè)Runner。

那配置文件有毛用浇揩?配置文件的作用在后面仪壮,但是從這里我們知道一點(diǎn):配置文件里面有Runner運(yùn)行時(shí)所需要的信息

可能你還有一個(gè)問題:我用root的用戶注冊(cè)Runner時(shí)胳徽,注冊(cè)完Runner就可以用了积锅,并沒有手動(dòng)地去運(yùn)行Runner啊养盗?這個(gè)后面講缚陷。

批量地運(yùn)行Runner

正常情況下,如果我有多個(gè)Runner往核,我并不想手動(dòng)一個(gè)個(gè)地運(yùn)行箫爷,要是能一次運(yùn)行多個(gè)Runner多爽啊聂儒!嗯哼虎锚,gitlab-ci-multi-runner就提供了這樣一個(gè)命令gitlab-ci-multi-runner run,詳情如下:

[root@iZ25bjcxoq5Z gitlab-runner]# gitlab-ci-multi-runner run --help
NAME:
   run - run multi runner service

USAGE:
   command run [command options] [arguments...]

OPTIONS:
   -c, --config "/etc/gitlab-runner/config.toml" Config file [$CONFIG_FILE]
   -n, --service "gitlab-runner"   Use different names for different services
   -d, --working-directory     Specify custom working directory
   -u, --user       Use specific user to execute shell scripts
   --syslog      Log to syslog

這個(gè)命令總共有5個(gè)選項(xiàng)衩婚,讓我們從選項(xiàng)來理解一下這個(gè)命令:

  • -c, --config選項(xiàng)
    這個(gè)選項(xiàng)是用來指定配置文件路徑的窜护。如果你想同時(shí)運(yùn)行多個(gè)Runner,你必須得知道你要運(yùn)行哪些Runner以及這些Runner運(yùn)行時(shí)所需要的信息非春。而前面我們說過柱徙,配置文件里面就存放著Runner運(yùn)行時(shí)所需要的信息。而且一個(gè)配置文件是可以存放多個(gè)Runner的信息的奇昙。如果不指定這個(gè)選項(xiàng)坐搔,就會(huì)使用默認(rèn)的配置文件。
  • -n, --service選項(xiàng)
    這個(gè)選項(xiàng)是用來指定服務(wù)的別名的敬矩。為什么要有這個(gè)選項(xiàng)呢?指定別名有什么意義呢蠢挡?我們從上一個(gè)選項(xiàng)可以看出來弧岳,一次只能運(yùn)行一批Runner凳忙,因?yàn)橐淮沃荒苤付ㄒ粋€(gè)配置文件。那如果我有多個(gè)配置文件禽炬,我要運(yùn)行多批Runner涧卵,那是不是給每一次批量運(yùn)行服務(wù)取不同的別名來區(qū)分更好一點(diǎn)呢。
  • -d, --working-directory選項(xiàng)
    這個(gè)選項(xiàng)是用來指定此次批量運(yùn)行服務(wù)的工作目錄的腹尖。如果自己沒有指定builds_dir的話柳恐,此次運(yùn)行起來的Runner會(huì)把builds_dir放到這個(gè)目錄里面。
  • -u, --user選項(xiàng)
    這個(gè)選項(xiàng)很重要热幔,它指定了該以什么用戶權(quán)限來運(yùn)行Runner乐设。為了安全,我認(rèn)為不應(yīng)該給運(yùn)行Runner的用戶過高的權(quán)限绎巨,更不應(yīng)該以root用戶來運(yùn)行Runner近尚。
  • --syslog選項(xiàng)
    如果指定了這個(gè)選項(xiàng),則把日志記錄到系統(tǒng)日志场勤。

使用服務(wù)

能夠批量地運(yùn)行Runner已經(jīng)很好了戈锻,但是還不夠好,為什么呢和媳?

首先格遭,gitlab-ci-multi-runner run默認(rèn)是前臺(tái)運(yùn)行的,使用體驗(yàn)不好留瞳;
其次拒迅,當(dāng)gitlab-ci-multi-runner run在后臺(tái)運(yùn)行的時(shí)候,要查看其運(yùn)行狀態(tài)不方便撼港,而且也沒有提供停止gitlab-ci-multi-runner run的命令坪它。
所以,要是能將批量運(yùn)行Runner這個(gè)功能安裝為一項(xiàng)服務(wù)帝牡,就更爽了往毡!

gitlab-ci-multi-runner確實(shí)就提供了這樣的功能。
install靶溜、uninstall开瞭、startstop罩息、restart嗤详、status這6個(gè)命令就是和服務(wù)相關(guān)的。
我一開始對(duì)gitlab-ci-multi-runner的服務(wù)概念感覺比較懵瓷炮,讓我們來看看安裝服務(wù)install這個(gè)命令到底干了一件什么事情葱色。

[root@iZ25bjcxoq5Z ~]# gitlab-ci-multi-runner install --help
NAME:
   install - install service

USAGE:
   command install [command options] [arguments...]

OPTIONS:
   --service, -n "gitlab-runner"   Specify service name to use
   --working-directory, -d "/root"   Specify custom root directory where all data are stored
   --config, -c "/etc/gitlab-runner/config.toml" Specify custom config file
   --user, -u       Specify user-name to secure the runner
  

從選項(xiàng)可以看出,一項(xiàng)服務(wù)的信息有4個(gè):服務(wù)名娘香、工作目錄苍狰、配置文件和用戶办龄。這個(gè)命令的選項(xiàng)和gitlab-ci-multi-runner run的選項(xiàng)基本一樣×苷眩可見俐填,批量運(yùn)行Runner和服務(wù)之間的關(guān)系曖昧。至于是什么關(guān)系翔忽,往下看gitlab-ci-multi-runner start這個(gè)命令英融。

[root@iZ25bjcxoq5Z ~]# gitlab-ci-multi-runner start --help
NAME:
   start - start service

USAGE:
   command start [command options] [arguments...]

OPTIONS:
   --service, -n "gitlab-runner" Specify service name to use

啟動(dòng)一項(xiàng)服務(wù),只要指定服務(wù)的名稱就行了(默認(rèn)服務(wù)名稱是gitlab-runner)歇式。啟動(dòng)服務(wù)后驶悟,運(yùn)行命令ps -aux | grep gitlab-runner查看后臺(tái)程序,發(fā)現(xiàn)啟動(dòng)服務(wù)其實(shí)就是在后臺(tái)執(zhí)行了一個(gè)批量運(yùn)行Runner的任務(wù)贬丛,所以服務(wù)安裝命令的選項(xiàng)才會(huì)和批量運(yùn)行Runner命令的選項(xiàng)基本一樣撩银。

root     18219  0.0  0.1 331872  5332 ?        Ssl  00:06   0:00 /usr/bin/gitlab-ci-multi-runner run --working-directory /home/gitlab-runner --config /etc/gitlab-runner/config.toml --service gitlab-runner --user gitlab-runner --syslog

還有stop命令用于停止服務(wù),restart命令用于重啟服務(wù)豺憔,status用于查看服務(wù)狀態(tài)额获。這三個(gè)命令的使用方法和start類似,就不一一介紹了恭应。

五抄邀、其他一些思考

  1. 什么情況下需要注冊(cè)Shared Runner?
    比如昼榛,GitLab上面所有的工程都有可能需要在公司的服務(wù)器上進(jìn)行編譯境肾、測(cè)試、部署等工作胆屿,這個(gè)時(shí)候注冊(cè)一個(gè)Shared Runner供所有工程使用就很合適奥喻。

  2. 什么情況下需要注冊(cè)Specific Runner?
    比如非迹,我可能需要在我個(gè)人的電腦或者服務(wù)器上自動(dòng)構(gòu)建我參與的某個(gè)工程环鲤,這個(gè)時(shí)候注冊(cè)一個(gè)Specific Runner就很合適。

  3. 什么情況下需要在同一臺(tái)機(jī)器上注冊(cè)多個(gè)Runner憎兽?
    比如冷离,我是GitLab的普通用戶,沒有管理員權(quán)限纯命,我同時(shí)參與多個(gè)項(xiàng)目西剥,那我就需要為我的所有項(xiàng)目都注冊(cè)一個(gè)Specific Runner,這個(gè)時(shí)候就需要在同一臺(tái)機(jī)器上注冊(cè)多個(gè)Runner亿汞。

六瞭空、最后

啰啰嗦嗦寫了一堆,大體上也算把自己對(duì)GitLab-Runner的理解過程寫清楚了。為了把GitLab-Runner的用法了解清楚匙铡,自己做了很多的測(cè)試图甜,但也難全面,中間有一些內(nèi)容也只是個(gè)人理解鳖眼,未必準(zhǔn)確,歡迎批評(píng)指正嚼摩。

七钦讳、招聘

前端工程師-抖音/火山

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市枕面,隨后出現(xiàn)的幾起案子愿卒,更是在濱河造成了極大的恐慌,老刑警劉巖潮秘,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件琼开,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡枕荞,警方通過查閱死者的電腦和手機(jī)柜候,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來躏精,“玉大人渣刷,你說我怎么就攤上這事〈V颍” “怎么了辅柴?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)瞭吃。 經(jīng)常有香客問我碌嘀,道長(zhǎng),這世上最難降的妖魔是什么歪架? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任股冗,我火速辦了婚禮,結(jié)果婚禮上牡拇,老公的妹妹穿的比我還像新娘魁瞪。我一直安慰自己,他們只是感情好惠呼,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布导俘。 她就那樣靜靜地躺著,像睡著了一般剔蹋。 火紅的嫁衣襯著肌膚如雪旅薄。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音少梁,去河邊找鬼洛口。 笑死,一個(gè)胖子當(dāng)著我的面吹牛凯沪,可吹牛的內(nèi)容都是我干的第焰。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼妨马,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼挺举!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起烘跺,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤湘纵,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后滤淳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體梧喷,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年脖咐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了铺敌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡文搂,死狀恐怖适刀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情煤蹭,我是刑警寧澤笔喉,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站硝皂,受9級(jí)特大地震影響常挚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜稽物,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一奄毡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧贝或,春花似錦吼过、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至羊赵,卻和暖如春趟佃,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工闲昭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留罐寨,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓序矩,卻偏偏與公主長(zhǎng)得像鸯绿,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子簸淀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

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