Centos7 & Docker & Jenkins & ASP.NET Core 2.0 自動化發(fā)布和部署

前言

Docker 一直很火熱途蒋,一直想把原本的 Jenkins 自動部署工具搬到 Docker 上面豁遭,無奈今年一直忙于各種事情,遲遲未實施這個事情,正好迎來了 dotnet core 2.0 的正式發(fā)布憎茂,升級項目的同時,順便直接將 Jenkins 搬到 Docker上锤岸。為什么要寫這篇文章呢竖幔?因為找過相關(guān)的資料,大多數(shù)文章都是基于 Ubuntu 安裝.net core 又或者 GitLab 進(jìn)行持續(xù)集成 自動部署等等等是偷,并未有人嘗試過Centos7.3 上部署 Jenkins 并且 構(gòu)建 ASP.NET CORE 2.0 的應(yīng)用拳氢。當(dāng)然筆者表示并不知道為什么 ubuntu 有這么多人青睞募逞。接下來,筆者將從本片博文中馋评,粗略的教大家怎么安裝 Docker 和 Jenkins 并且使用 Visual Studio 2017 新建Demo 并實現(xiàn)自動部署

環(huán)境準(zhǔn)備

  • 硬件配置: 1 核 1G 1M 帶寬放接。50G 硬盤。

  • 系統(tǒng)環(huán)境:CentOS 7.3 (64位)

  • 其實用的就是騰訊云

安裝 Docker

其實安裝 Docker 的過程留特,大家可以到 Docker 官網(wǎng)找到自己相對應(yīng)的安裝文檔進(jìn)行安裝纠脾,Docker 區(qū)分 CE 和 EE 的兩個版本,具體這兩個版本有什么區(qū)別蜕青,大家自行查閱相關(guān)資料苟蹈,這里不再概述。教程用的是 CE 那么就找到對應(yīng)的官方文檔進(jìn)行安裝右核,以下是教程安裝的步驟

1.更新一下包吧慧脱,多更無害

# sudo yum -y update

2.安裝所需的軟件包 (其實這些騰訊云都具備了,只不過怕有些閹割版的系統(tǒng)缺少蒙兰,所以貼上命令磷瘤,安裝過的使用該命令不會造成傷害)

# sudo yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2

3.使用穩(wěn)定版的倉庫(當(dāng)然可以使用最新版或測試版的倉庫芒篷,這個需要官方的說明)

# sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

4.安裝 Docker ce

# sudo yum install docker-ce

tips:在生產(chǎn)系統(tǒng)上搜变,您應(yīng)該安裝特定版本的 Docker CE,而不是始終使用最新版本针炉。

5.啟動 Docker

# sudo systemctl start docker

6. Docker 通過運行 hello-world 映像驗證是否正確安裝挠他。

# docker run hello-world

如果出現(xiàn)以下的界面,就代表安裝成功

配置 Docker 加速器

此步驟不是必須的篡帕,前提是你的環(huán)境有梯子或者網(wǎng)速可以的殖侵,那么可以忽略這個步驟。

$ curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s https://mirror.ccs.tencentyun.com

使用 https://mirror.ccs.tencentyun.com 這個加速地址的前提是你必須要使用騰訊云镰烧,該地址外部無法訪問拢军,只有騰訊云才能使用此鏡像地址。你可以使用 DaoCloud 加速地址怔鳖,具體另行查閱相關(guān)資料茉唉。

安裝 Jenkins

首先不直接從 Docker Store 上直接 Pull Jenkins 的 Image 文件,因為待會需要進(jìn)行 dotnet core 的 Docker 自動部署结执,需要對宿主機(jī)上的 Docker 進(jìn)行直接操作度陆,那么需要掛載 Docker 給 Jenkins Image,所以現(xiàn)在需要自己動手編寫 Dockerfile 構(gòu)建自定義的 Jenkins献幔。

# touch Dockerfile
# vim Dockerfile

插入以下內(nèi)容:

FROM jenkins

USER root
#清除了基礎(chǔ)鏡像設(shè)置的源懂傀,切換成騰訊云的jessie源
#使用非騰訊云環(huán)境的需要將 tencentyun 改為 aliyun
RUN echo '' > /etc/apt/sources.list.d/jessie-backports.list \
  && echo "deb http://mirrors.tencentyun.com/debian jessie main contrib non-free" > /etc/apt/sources.list \
  && echo "deb http://mirrors.tencentyun.com/debian jessie-updates main contrib non-free" >> /etc/apt/sources.list \
  && echo "deb http://mirrors.tencentyun.com/debian-security jessie/updates main contrib non-free" >> /etc/apt/sources.list
#更新源并安裝缺少的包
RUN apt-get update && apt-get install -y libltdl7 && apt-get update

ARG dockerGid=999

RUN echo "docker:x:${dockerGid}:jenkins" >> /etc/group 

# 安裝 docker-compose 因為等下構(gòu)建環(huán)境的需要
RUN curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

RUN chmod +x /usr/local/bin/docker-compose

如果不安裝 libltdl7 會導(dǎo)致如下這個問題,原因是 jenkins 容器內(nèi)部沒有這個包

docker: error while loading shared libraries: libltdl.so.7: cannot open shared object file: No such file or directory
Build step 'Execute shell' marked build as failure

在 Jenkins 操作宿主的 Docker 的時候會出現(xiàn)拒絕訪問的問題蜡感,其實就是容器的 jenkins 用戶沒有權(quán)限訪問容器外的 docker 命令蹬蚁,所以 RUN 命令 需要把Jenkins 用戶加入到 Docker 用戶組

構(gòu)建 Image

# docker build . -t auto-jenkins

出現(xiàn)以上 Successfully 內(nèi)容代表安裝 Jenkins 成功

在啟動 Jenkins 時恃泪,需要先創(chuàng)建一個 Jenkins 的配置目錄,并且掛載到 docker 里的 Jenkins 目錄下

# mkdir -p /var/jenkins_home

運行 Jenkins

# docker run --name jenkins -p 8080:8080 -p 50000:50000 \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v $(which docker):/bin/docker \
    -v /var/jenkins_home :/var/jenkins_home \
    -d auto-jenkins

第一行:構(gòu)建一個名稱為 jenkins 的容器 -p 是容器運行開放端口

第二行 和第三行: -v 是將宿主機(jī)的 docker 文件掛載進(jìn)容器里

第四行:建立宿主機(jī)的配置目錄缚忧,掛載進(jìn) docker 容器里悟泵,這樣容器里的 Jenkins 配置目錄文件就會映射出來

第五行:使用 auto-jenkins Image 并且后臺啟動

這個時候 run Jenkins 會提示成功

執(zhí)行 docker ps 命令后,發(fā)現(xiàn)什么都沒有

執(zhí)行 docker ps -a 命令看看

執(zhí)行 docker start -a jenkins 讓容器前臺輸出運行信息的方式運行

不難看出其實 Jenkins 啟動已經(jīng)是可以了闪水,只是權(quán)限問題導(dǎo)致這個錯誤的信息糕非。

現(xiàn)在需要看一下 Jenkins 官方的 Dockerfile

知道問題原因,貼上代碼了球榆。

##修改 /var/jenkins 文件夾權(quán)限
# chown -R 1000 /var/jenkins_home

繼續(xù)執(zhí)行運行 Jenkins 代碼

# docker run --name jenkins -p 8080:8080 -p 50000:50000 \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v $(which docker):/bin/docker \
    -v /var/jenkins_home:/var/jenkins_home \
    -d auto-jenkins

這時你會看到悲催的信息

容器之前已經(jīng)運行過了朽肥,所以會有一個容器已經(jīng)存在了。哥來給你搽眼淚持钉。執(zhí)行以下命令衡招,刪除原本 run 出來的容器

# docker rm -f jenkins

刪除完容器后,繼續(xù)執(zhí)行運行命令

# docker run --name jenkins -p 8080:8080 -p 50000:50000 \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v $(which docker):/bin/docker \
    -v /var/jenkins_home:/var/jenkins_home \
    -d auto-jenkins

出現(xiàn)一串字符后每强,執(zhí)行 docker ps 會發(fā)現(xiàn)容器已經(jīng)啟動了始腾,正常了。這個時候是不是可以使用了空执?別著急浪箭,還有很長的路。

配置 Jenkins

打開瀏覽器輸入地址 your IP:8080 進(jìn)行訪問辨绊,你會開心的看到這個界面奶栖,看到這個界面代表你的 Jenkins 已經(jīng)安裝成功了,但是需要進(jìn)行配置门坷,現(xiàn)在就教大家怎么去配置

首先宣鄙,進(jìn)入容器內(nèi)

# docker exec -it jenkins /bin/bash

查看 /var/jenkins_home/secrets/initialAdminPassword 文件內(nèi)的密碼

# cat /var/jenkins_home/secrets/initialAdminPassword

其實不一定要進(jìn)入容器內(nèi)查看密碼,可以直接在宿主機(jī)的環(huán)境下默蚌,查看 /var/jenkins//secrets/initialAdminPassword 的內(nèi)容冻晤,因為之前筆者已經(jīng)將這個目錄掛載進(jìn) Docker 里面了。復(fù)制輸出的內(nèi)容绸吸,粘貼到 Administrator password鼻弧,輸入 exit 退出容器,此時進(jìn)行下一步你會看到此界面惯裕,點擊 Install suggested plugins

等待初始化完畢

到了這一步温数,自己隨緣去填吧。

使用 VS2017 創(chuàng)建一個 ASP.NET Core 2.0 Web 應(yīng)用程序蜻势,并將代碼上傳到git撑刺。這里筆者就不演示上傳代碼的過程步驟了。

為你們準(zhǔn)備了一個地址握玛,方便你們完成本教程:

http://git.oschina.net/wenalu/MvcTest

新建一個自由風(fēng)格的軟件項目够傍,并填名稱 點擊 OK

填寫源代碼管理

勾選 Poll SCM 設(shè)置拉取 Git 上代碼的間隔甫菠,筆者這里是兩分鐘拉取一次

勾上 Delete workspace before build start 是設(shè)置構(gòu)建前刪除工作區(qū)

勾上 Abort the build if it's stuck 是設(shè)定構(gòu)建的超時時間,如果構(gòu)建使用的時間超過設(shè)定的時間冕屯,那么就認(rèn)為這次的構(gòu)建是失敗的寂诱。筆者這里超時設(shè)置的是10分鐘

增加一個 Execute Shell 腳本,并填寫以下腳本內(nèi)容

#!/bin/bash
# 獲取短版本號

GITHASH=`git rev-parse --short HEAD`
echo ---------------Remove-Orphans------------------
docker-compose -f ./docker-compose.yml -f ./docker-compose.override.yml  -p dockercompose4255153253317384266 down --rmi local --remove-orphans
echo ------------------Config-----------------------
docker-compose -f ./docker-compose.ci.build.yml -p dockercompose4255153253317384266 config
echo ------------------Build------------------------
docker-compose -f ./docker-compose.ci.build.yml -p dockercompose4255153253317384266 up --build
echo ---------------Publishing...------------------
docker-compose -f "./docker-compose.yml" -f "./docker-compose.override.yml"  -p dockercompose4255153253317384266 up -d --build

應(yīng)用保存安聘,回到項目界面上痰洒。點擊立即構(gòu)建進(jìn)行部署工作 SUCCESS

打開瀏覽器,地址輸入 your IP:8088/

遇到的問題

其實上面的篇幅為了大家能盡快的實現(xiàn)部署浴韭,只是簡要的介紹了途中一些常犯的錯誤丘喻。其實在搭建這個 CI 環(huán)境的時候遇到不止這些問題,比如說一開始的 Dockerfile 內(nèi)容并不像教程中的一樣念颈。一開始是這樣的:

FROM jenkins

USER root
#清除了基礎(chǔ)鏡像設(shè)置的源泉粉,切換成阿里云的jessie源
RUN echo '' > /etc/apt/sources.list.d/jessie-backports.list \
  && echo "deb http://mirrors.tencentyun.com/debian jessie main contrib non-free" > /etc/apt/sources.list \
  && echo "deb http://mirrors.tencentyun.com/debian jessie-updates main contrib non-free" >> /etc/apt/sources.list \
  && echo "deb http://mirrors.tencentyun.com/debian-security jessie/updates main contrib non-free" >> /etc/apt/sources.list
#更新源并安裝缺少的包
RUN apt-get update && apt-get install -y libltdl7 && apt-get update

ARG dockerGid=999

RUN echo "docker:x:${dockerGid}:jenkins" >> /etc/group 

USER jenkins

當(dāng)你如果在網(wǎng)上找到其他教程,教你如何安裝 jenkins榴芳,而你使用了類似于這個內(nèi)容的 Dockerfile嗡靡,那么會在 Jenkins 構(gòu)建編譯的時候產(chǎn)生如下兩個錯誤:

第一:缺少 docker-compose


出現(xiàn)這個狀況,當(dāng)然是可以解決的窟感。首先進(jìn)入容器讨彼,然后找到官方的安裝docker-compose 文檔進(jìn)行安裝,jenkins 使用的是 Linux 直接找到對應(yīng)的 Linux 安裝資料即可肌括。

第二:權(quán)限問題

從容器內(nèi)手動安裝 docker-compose 會出現(xiàn)無法安裝的情況点骑,原因是 Jenkins 用戶沒有安裝 docker-compose 的權(quán)限


解決上述問題酣难,當(dāng)然可以切換 root 用戶谍夭,但是筆者使用最笨最直接的方式,從構(gòu)建鏡像的時候就直接不使用 jenkins 用戶憨募,所以教程中并沒有最后一句 USER jenkins 紧索。這樣做目的是讓教程步驟更順利

tips:正式生產(chǎn)環(huán)境不建議直接切換到 root 用戶運行

運行 Jenkins 命令一開始是這樣的:

# docker run --name jenkins -p 8080:8080 -p 50000:50000 \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v $(which docker):/bin/docker \
    -v /var/jenkins:/var/jenkins_home \
    -d auto-jenkins

這樣會造成構(gòu)建的時候找到一個根本不存在的目錄上

其實就是第三句 將 /var/jenkins 改成 /var/jenkins_home 就解決這個問題了。

此時此刻菜谣,如果你曾經(jīng)遇到過這樣的問題珠漂,哥現(xiàn)在已經(jīng)給你擦眼淚了。

當(dāng)然這里不僅僅有這些問題的存在尾膊,只是有一部分在做這個教程的時候沒有截圖媳危,就不再闡述了。

結(jié)語

其實筆者曾 Google 過這些教程冈敛,但是一無所獲待笑,發(fā)覺挺多人使用 Ubuntu 的,就是找不到一個 Centos 的案例抓谴。當(dāng)然筆者也不知道他們?yōu)槭裁聪矚g使用Ubuntu 暮蹂。這里把實施過程的心得分享給大家寞缝,是因為怕很多人跟筆者一樣重滔覆轍,沒有人幫助的日子挺慘的仰泻,也就算為大家做些貢獻(xiàn)吧荆陆。

作者: Loongle Tse

出處:http://www.cnblogs.com/LongJiangXie/p/7517909.html

技術(shù)交流QQ群 :238757010

關(guān)注微信公眾號Reboot51 后臺回復(fù) python、自動化即可獲得相應(yīng)課程的試聽資

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末集侯,一起剝皮案震驚了整個濱河市被啼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌棠枉,老刑警劉巖趟据,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異术健,居然都是意外死亡汹碱,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進(jìn)店門荞估,熙熙樓的掌柜王于貴愁眉苦臉地迎上來咳促,“玉大人,你說我怎么就攤上這事勘伺」蚋梗” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵飞醉,是天一觀的道長冲茸。 經(jīng)常有香客問我,道長缅帘,這世上最難降的妖魔是什么轴术? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮钦无,結(jié)果婚禮上逗栽,老公的妹妹穿的比我還像新娘。我一直安慰自己失暂,他們只是感情好彼宠,可當(dāng)我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著弟塞,像睡著了一般凭峡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上决记,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天摧冀,我揣著相機(jī)與錄音,去河邊找鬼。 笑死按价,一個胖子當(dāng)著我的面吹牛惭适,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播楼镐,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼癞志,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了框产?” 一聲冷哼從身側(cè)響起凄杯,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎秉宿,沒想到半個月后戒突,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡描睦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年膊存,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片忱叭。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡隔崎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出韵丑,到底是詐尸還是另有隱情爵卒,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布撵彻,位于F島的核電站钓株,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏陌僵。R本人自食惡果不足惜轴合,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拾弃。 院中可真熱鬧值桩,春花似錦摆霉、人聲如沸豪椿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽搭盾。三九已至,卻和暖如春婉支,著一層夾襖步出監(jiān)牢的瞬間鸯隅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留蝌以,地道東北人炕舵。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像跟畅,于是被迫代替她去往敵國和親咽筋。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,515評論 2 359