Centos7+Docker+Jenkins+ASP.NET Core 2.0自動(dòng)化發(fā)布與部署的實(shí)現(xiàn)
前言
Docker一直很火熱,一直想把原本的Jenkins自動(dòng)部署工具搬到Docker上面,無(wú)奈今年一直忙于各種事情,遲遲未實(shí)施這個(gè)事情,正好迎來(lái)了dotnet core 2.0 的正式發(fā)布,升級(jí)項(xiàng)目的同時(shí),順便直接將Jenkins搬到Docker上。為什么要寫(xiě)這篇文章呢?因?yàn)檎疫^(guò)相關(guān)的資料,大多數(shù)文章都是基于Ubuntu 安裝.net core 又或者 GitLab 進(jìn)行持續(xù)集成 自動(dòng)部署等等等,并未有人嘗試過(guò)Centos7.3 上部署 Jenkins 并且 構(gòu)建 ASP.NET CORE 2.0 的應(yīng)用。當(dāng)然筆者表示并不知道為什么ubuntu有這么多人青睞。
接下來(lái),筆者將從本片博文中,粗略的教大家怎么安裝Docker 和 Jenkins 并且使用Visual Studio 2017 新建Demo 并實(shí)現(xiàn)自動(dòng)部署,下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧。
環(huán)境準(zhǔn)備
硬件配置: 1核1G 1M帶寬。50G硬盤(pán)。
系統(tǒng)環(huán)境:CentOS 7.3(64位)
其實(shí)用的就是騰訊云
安裝Docker
其實(shí)安裝Docker的過(guò)程,大家可以到Docker官網(wǎng)找到自己相對(duì)應(yīng)的安裝文檔進(jìn)行安裝,Docker區(qū)分CE和EE的兩個(gè)版本,具體這兩個(gè)版本有什么區(qū)別,大家自行查閱相關(guān)資料,這里不再概述。教程用的是CE那么就找到對(duì)應(yīng)的官方文檔進(jìn)行安裝,以下是教程安裝的步驟
1.更新一下包吧,多更無(wú)害
# sudo yum -y update
2.安裝所需的軟件包 (其實(shí)這些騰訊云都具備了,只不過(guò)怕有些閹割版的系統(tǒng)缺少,所以貼上命令,安裝過(guò)的使用該命令不會(huì)造成傷害)
# sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm2
3.使用穩(wěn)定版的倉(cāng)庫(kù)(當(dāng)然可以使用最新版或測(cè)試版的倉(cāng)庫(kù),這個(gè)需要官方的說(shuō)明)
# 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.啟動(dòng)Docker
# sudo systemctl start docker
6.docker通過(guò)運(yùn)行hello-world映像驗(yàn)證是否正確安裝。
# docker run hello-world
如果出現(xiàn)以下的界面,就代表安裝成功
配置Docker加速器
此步驟不是必須的,前提是你的環(huán)境有梯子或者網(wǎng)速可以的,那么可以忽略這個(gè)步驟。
$ curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s https://mirror.ccs.tencentyun.com
使用https://mirror.ccs.tencentyun.com這個(gè)加速地址的前提是你必須要使用騰訊云,該地址外部無(wú)法訪問(wèn),只有騰訊云才能使用此鏡像地址。你可以使用DaoCloud加速地址,具體另行查閱相關(guān)資料。
安裝Jenkins
首先不直接從Docker Store上直接Pull Jenkins 的 Image 文件,因?yàn)榇龝?huì)需要進(jìn)行dotnet core 的 Docker自動(dòng)部署,需要對(duì)宿主機(jī)上的Docker進(jìn)行直接操作,那么需要掛載 Docker 給 Jenkins Image,所以現(xiàn)在需要自己動(dòng)手編寫(xiě) 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 因?yàn)榈认聵?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 會(huì)導(dǎo)致如下這個(gè)問(wèn)題,原因是jenkins容器內(nèi)部沒(méi)有這個(gè)包
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的時(shí)候會(huì)出現(xiàn)拒絕訪問(wèn)的問(wèn)題,其實(shí)就是容器的jenkins用戶沒(méi)有權(quán)限訪問(wèn)容器外的docker命令,所以 RUN命令 需要把Jenkins用戶加入到Docker用戶組
構(gòu)建Image
# docker build . -t auto-jenkins
出現(xiàn)以上 Successfully 內(nèi)容代表安裝Jenkins成功
在啟動(dòng)Jenkins時(shí),需要先創(chuàng)建一個(gè)Jenkins的配置目錄,并且掛載到docker 里的Jenkins目錄下
# mkdir -p /var/jenkins_home
運(yùn)行 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)建一個(gè)名稱為jenkins的容器 -p 是容器運(yùn)行開(kāi)放端口
第二行 和第三行: -v 是將宿主機(jī)的docker文件掛載進(jìn)容器里
第四行:建立宿主機(jī)的配置目錄,掛載進(jìn)docker容器里,這樣容器里的Jenkins配置目錄文件就會(huì)映射出來(lái)
第五行:使用auto-jenkins Image 并且后臺(tái)啟動(dòng)
這個(gè)時(shí)候 run Jenkins 會(huì)提示成功
執(zhí)行 docker ps 命令后,發(fā)現(xiàn)什么都沒(méi)有
執(zhí)行 docker ps -a 命令看看
執(zhí)行 docker start -a jenkins 讓容器前臺(tái)輸出運(yùn)行信息的方式運(yùn)行
不難看出其實(shí) Jenkins 啟動(dòng)已經(jīng)是可以了,只是權(quán)限問(wèn)題導(dǎo)致這個(gè)錯(cuò)誤的信息。
現(xiàn)在需要看一下Jenkins官方的Dockerfile
知道問(wèn)題原因,貼上代碼了。
##修改 /var/jenkins 文件夾權(quán)限 # chown -R 1000 /var/jenkins_home
繼續(xù)執(zhí)行運(yùn)行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
這時(shí)你會(huì)看到悲催的信息
容器之前已經(jīng)運(yùn)行過(guò)了,所以會(huì)有一個(gè)容器已經(jīng)存在了。哥來(lái)給你搽眼淚。執(zhí)行以下命令,刪除原本 run 出來(lái)的容器
# docker rm -f jenkins
刪除完容器后,繼續(xù)執(zhí)行運(yùn)行命令
# 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 會(huì)發(fā)現(xiàn)容器已經(jīng)啟動(dòng)了,正常了。這個(gè)時(shí)候是不是可以使用了?別著急,還有很長(zhǎng)的路。
配置Jenkins
打開(kāi)瀏覽器輸入地址 your IP:8080 進(jìn)行訪問(wèn),你會(huì)開(kāi)心的看到這個(gè)界面,看到這個(gè)界面代表你的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
其實(shí)不一定要進(jìn)入容器內(nèi)查看密碼,可以直接在宿主機(jī)的環(huán)境下,查看 /var/jenkins//secrets/initialAdminPassword 的內(nèi)容,因?yàn)橹肮P者已經(jīng)將這個(gè)目錄掛載進(jìn)Docker里面了
復(fù)制輸出的內(nèi)容,粘貼到Administrator password,輸入 exit 退出容器,此時(shí)進(jìn)行下一步你會(huì)看到此界面,點(diǎn)擊 Install suggested plugins
等待初始化完畢
到了這一步,自己隨緣去填吧。
使用VS2017創(chuàng)建一個(gè)ASP.NET Core 2.0 Web應(yīng)用程序,并將代碼上傳到git。這里筆者就不演示上傳代碼的過(guò)程步驟了。
為你們準(zhǔn)備了一個(gè)地址,方便你們完成本教程:http://git.oschina.net/wenalu/MvcTest
新建一個(gè)自由風(fēng)格的軟件項(xiàng)目,并填名稱 點(diǎn)擊 OK
填寫(xiě)源代碼管理
勾選 Poll SCM 設(shè)置拉取Git 上代碼的間隔,筆者這里是兩分鐘拉取一次
勾上 Delete workspace before build start 是設(shè)置構(gòu)建前刪除工作區(qū)
勾上 Abort the build if it's stuck 是設(shè)定構(gòu)建的超時(shí)時(shí)間,如果構(gòu)建使用的時(shí)間超過(guò)設(shè)定的時(shí)間,那么就認(rèn)為這次的構(gòu)建是失敗的。筆者這里超時(shí)設(shè)置的是10分鐘
增加一個(gè)Execute Shell 腳本,并填寫(xiě)以下腳本內(nèi)容
#!/bin/bash # 獲取短版本號(hào) 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)用保存,回到項(xiàng)目界面上。點(diǎn)擊立即構(gòu)建進(jìn)行部署工作 SUCCESS
打開(kāi)瀏覽器,地址輸入 your IP:8088/
遇到的問(wèn)題
其實(shí)上面的篇幅為了大家能盡快的實(shí)現(xiàn)部署,只是簡(jiǎn)要的介紹了途中一些常犯的錯(cuò)誤。其實(shí)在搭建這個(gè)CI環(huán)境的時(shí)候遇到不止這些問(wèn)題,比如說(shuō)一開(kāi)始的 Dockerfile 內(nèi)容并不像教程中的一樣。一開(kā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,而你使用了類(lèi)似于這個(gè)內(nèi)容的Dockerfile,那么會(huì)在Jenkins構(gòu)建編譯的時(shí)候產(chǎn)生如下兩個(gè)錯(cuò)誤:
第一:缺少 docker-compose
出現(xiàn)這個(gè)狀況,當(dāng)然是可以解決的。首先進(jìn)入容器,然后找到官方的安裝docker-compose文檔進(jìn)行安裝,jenkins使用的是Linux直接找到對(duì)應(yīng)的Linux安裝資料即可。
第二:權(quán)限問(wèn)題
從容器內(nèi)手動(dòng)安裝 docker-compose 會(huì)出現(xiàn)無(wú)法安裝的情況,原因是Jenkins 用戶沒(méi)有安裝docker-compose 的權(quán)限
解決上述問(wèn)題,當(dāng)然可以切換 root 用戶,但是筆者使用最笨最直接的方式,從構(gòu)建鏡像的時(shí)候就直接不使用 jenkins 用戶,所以教程中并沒(méi)有最后一句 USER jenkins 。這樣做目的是讓教程步驟更順利
tips:正式生產(chǎn)環(huán)境不建議直接切換到 root 用戶運(yùn)行
運(yùn)行 Jenkins 命令一開(kāi)始是這樣的:
# 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
這樣會(huì)造成構(gòu)建的時(shí)候找到一個(gè)根本不存在的目錄上
其實(shí)就是第三句 將/var/jenkins 改成 /var/jenkins_home 就解決這個(gè)問(wèn)題了。
此時(shí)此刻,如果你曾經(jīng)遇到過(guò)這樣的問(wèn)題,哥現(xiàn)在已經(jīng)給你擦眼淚了。
當(dāng)然這里不僅僅有這些問(wèn)題的存在,只是有一部分在做這個(gè)教程的時(shí)候沒(méi)有截圖,就不再闡述了。
寫(xiě)在最后
其實(shí)筆者曾Google過(guò)這些教程,但是一無(wú)所獲,發(fā)覺(jué)挺多人使用Ubuntu的,就是找不到一個(gè)Centos的案例。當(dāng)然筆者也不知道他們?yōu)槭裁聪矚g使用Ubuntu。這里把實(shí)施過(guò)程的心得分享給大家,是因?yàn)榕潞芏嗳烁P者一樣重滔覆轍,沒(méi)有人幫助的日子挺慘的,也就算這么久以來(lái)為社區(qū)做些貢獻(xiàn)吧。
好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
asp.net實(shí)現(xiàn)利用反射,泛型,靜態(tài)方法快速獲取表單值到Model的方法
這篇文章主要介紹了asp.net實(shí)現(xiàn)利用反射,泛型,靜態(tài)方法快速獲取表單值到Model的方法,結(jié)合實(shí)例形式分析了asp.net中反射,泛型,靜態(tài)方法給model賦值的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11C#反射(Reflection)對(duì)類(lèi)的屬性get或set值實(shí)現(xiàn)思路
可以使用反射動(dòng)態(tài)創(chuàng)建類(lèi)型的實(shí)例,將類(lèi)型綁定到現(xiàn)有對(duì)象,或從現(xiàn)有對(duì)象獲取類(lèi)型并調(diào)用其方法或訪問(wèn)其字段和屬性,接下來(lái)為大家介紹下對(duì)一個(gè)類(lèi)別的屬性進(jìn)行set和get值,感興趣的各位可以參考下哈2013-03-03asp.net 更改gridview pageSize的方法
asp.net 更改gridview pageSize的方法,需要的朋友可以參考下。2011-07-07.NET6使用ImageSharp實(shí)現(xiàn)給圖片添加水印
這篇文章主要為大家詳細(xì)介紹了.NET6使用ImageSharp實(shí)現(xiàn)給圖片添加水印功能的相關(guān)資料,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-12-12一個(gè)簡(jiǎn)單的ASP.NET驗(yàn)證碼
這篇文章主要為大家詳細(xì)介紹了一個(gè)簡(jiǎn)單的ASP.NET驗(yàn)證碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06asp.net轉(zhuǎn)出json格式客戶端顯示時(shí)間
最近在學(xué)習(xí)ext過(guò)程中,很多地方的數(shù)據(jù)從服務(wù)器傳到客戶端都是以json格式傳回來(lái)2008-10-10.net出現(xiàn)80080005錯(cuò)誤的解決辦法分享
這篇文章介紹了.net出現(xiàn)80080005錯(cuò)誤的解決辦法,有需要的朋友可以參考一下,希望可以對(duì)你有所幫助2013-07-07時(shí)間輕松學(xué)會(huì).NET Core操作ElasticSearch7的方法
這篇文章主要介紹了時(shí)間輕松學(xué)會(huì).NET Core操作ElasticSearch7,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04