jenkins+docker部署nodejs程序

最近使用jenkins+docker完成了持續部署nodejs程序,戰線拉的很長,知識點也很碎,也踩過一些坑,遂寫篇文章總結一下,日後要有遺忘,也可以回來翻閱。

首先先說一下要達成的目標:用戶提交代碼並打tag後,在jenkins界面上選擇對應的tag執行構建,構建的過程中會將代碼通過docker打包成鏡像,然後推送到鏡像倉庫中,接著ssh到應用服務器上,拉取對應的鏡像,停止之前運行的舊版本容器,將新的鏡像run起來。

流程圖簡單畫了一下

jenkins+docker部署nodejs程序

瞭解了目標後,就開始一步步開幹。

首先安裝docker環境,我的機器是ubuntu 16.04

添加軟件倉庫(阿里雲倉庫)

<code>curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository \\
"deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \\
$(lsb_release -cs) \\
stable"/<code>

安裝docker

<code>sudo apt-get update
sudo apt-get install docker-ce/<code>

重啟docker

<code>sudo service docker restart/<code>

測試docker是否安裝成功,如果執行下面命令打印出docker對應的版本,代表docker已成功安裝

<code>docker --version/<code>

docker安裝成功之後,就基於這個docker環境安裝jenkins

由於國內網的問題,可先添加DaoCloud的加速器:在DaoCloud官網上找到加速器 選項,找到你對應的操作系統

<code>curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://dfe09f6e.m.daocloud.io/<code>

拉取jenkins

<code>sudo docker pull jenkins:lts/<code>

創建jenkins配置文件目錄

<code>sudo mkdir /var/jenkins_home
sudo chmod 777 /var/jenkins_home ##注意這裡必須配置本地卷的權限,否則啟動失敗/<code>

運行jenkins鏡像

注意:我們是通過jenkins來構建鏡像的,但是我們的jenkins容器裡面是沒有安裝docker的,但是我們宿主機是安裝了docker,所以我們需要將宿主機的docker掛到容器中, 參考鏈接:https://www.jianshu.com/p/8b72eece7df8

<code>sudo docker run -d \\ 
-p 9000:8080 \\
-v /var/jenkins_home:/var/jenkins_home \\
--restart=always \\
#Docker重啟後該容器也為隨之重啟
-u root \\
-v  /usr/bin/docker:/usr/bin/docker \\
-v /var/run/docker.sock:/var/run/docker.sock \\
-v /usr/lib64/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7 \\
--name myjenkins jenkins:lts/<code>

-d:後臺運行

-p:宿主機的9000端口,映射到jenkins的默認8080端口

-v:將宿主機的目錄掛載到容器裡,容器停止後jenkins配置的東西還存在

--name:給容器取個名稱

這個時候訪問9000端口就可以看到jenkins的界面了,注意:如果是阿里雲上的服務器,需要在安全策略處配置允許9000端口

訪問jenkins界面後,會提示輸入一個密碼,根據提示找到對應的文件查看密碼,並複製

<code>cat  /var/jenkins_home/secrets/initialAdminPassword/<code>

然後根據提示安裝插件

jenkins+docker部署nodejs程序

等待插件安裝完成...

插件安裝完成後,創建用戶,之後就初始化完成了。

接下來,安裝我們這次部署nodejs程序需要的插件,我們的目標是,在jenkins上選git上的tag,做為源碼,所以我們需要安裝git parameters插件

點擊系統管理-》插件管理 -》選擇可選插件tab,找到Git Parameter Plug-In 安裝,然後再搜索SSH 找到SSH plugin插件安裝,等待安裝完成


插件安裝完成,我們的基礎工作就基本上做好了,接下來,我們就要開始在jenkins上創建任務達成我們的目標了。點擊新建任務,填一個任務名稱,選擇“構建一個自由風格的軟件項目”, 進來後選擇參數化構建過程,以便在構建時,選擇tag進行構建

jenkins+docker部署nodejs程序

接著往下,填入git倉庫信息

jenkins+docker部署nodejs程序

指定分支填入${Tag} 之後在構建腳本中可以通過$Tag取到構建時選擇的tag


接著就是配置構建了,選擇執行shell

<code># 進入項目目錄
cd  /var/jenkins_home/workspace/[填入你的git倉庫名]
# tag名稱

tagName=$Tag
# docker倉庫,可以在阿里雲鏡像倉庫,申請自己的鏡像倉庫
REPOSITORY=[鏡像倉庫的域名]/[鏡像倉庫的命名空間]/[鏡像倉庫的名稱]:jenkins-$tagName
# 構建鏡像,注意後面有個. 代表使用當前目下下的dockerfile,後面會說dockerfile怎麼寫
docker build -t $REPOSITORY .
# 如果是私有的鏡像倉庫,例如我的阿里雲鏡像倉庫,需要登錄後才能push,如果公有的不需要這步
docker login -u [用戶名] -p [密碼] [鏡像倉庫域名]
# 將構建好的鏡像,推送到遠程的鏡像倉庫
docker push $REPOSITORY
# 刪除本地構建的鏡像
docker rmi -f $REPOSITORY/<code>

上面我們說了構建鏡像需要有dockerfile,這個dockerfile其實就是docker在構建時,根據這個文件的內容,打包鏡像,看一下我那個項目的dockerfile可以對照參考,很簡單

<code># 基於某個鏡像,來構建新的鏡像,我們是nodejs項目,選擇一個帶有nodejs環境的鏡像
FROM node:13.5.0-buster-slim
# 打一個標籤,
LABEL zhangchao [郵箱名]
# 設置環境變量,nodejs代碼中可以取到這個環境變量,如果沒有可不寫
ENV NODE_ENV=production
# 創建一個代碼目錄

RUN mkdir -p /usr/src/webapp
# 將代碼拷貝到這個目錄中
COPY . /usr/src/webapp
# 設置工作目錄
WORKDIR /usr/src/webapp
# 安裝nodejs項目依賴
RUN /bin/sh -c 'cd /usr/src/webapp/ && \\
npm install --unsafe-perm'
# 對外暴露3000端口
EXPOSE 3000
# 啟動nodejs服務
CMD node server.js/<code>

打包好鏡像後,接下來我們進行最後一步,就是通過我們剛才安裝的jenkins的SSH插件,shell到應用服務器上,停掉之前版本的鏡像,將我們新構建的鏡像Run起來

我們先配置下我們應用服務器的地址信息。

添加一個域,此處域名可以隨便寫

jenkins+docker部署nodejs程序

在上一步創建的域下添加一個憑證,類型選擇Username with password下面的Username和Password即為要連接的linux服務器的登錄賬戶和密碼

jenkins+docker部署nodejs程序

添加remote host

進入jenkins–>系統管理–>系統配置–>SSH remote hosts(在系統設置中找到SSH remote hosts),添加該linux服務器連接

jenkins+docker部署nodejs程序

配置完成後,我們繼續進入剛才新建的任務,增加構建步驟

jenkins+docker部署nodejs程序

選擇配置的SSH Site,填入遠程執行的腳本

<code># 設置tagName
tagName=$Tag
# 登錄私有倉庫,如果是公有倉庫,這步不用寫
docker login -u [用戶名] -p [密碼] [鏡像倉庫域名]
# 拉取遠程鏡像 pull後面跟的是倉庫名稱:tag名稱
docker pull [鏡像倉庫的域名]/[鏡像倉庫的命名空間]/[鏡像倉庫的名稱]:jenkins-$tagName

# 根據容器名稱查找容器id
containerId=`docker ps -a | grep [上一版啟動的容器名稱] | awk '{print $1}' `
# 根據容器名稱查找鏡像名稱
imageName=`docker ps -a | grep [上一版啟動的容器名稱] | awk '{print $2}' `
# 如果容器id存在就停止掉舊容器運行,並刪除掉舊的容器和鏡像
if [ -n "$containerId" ]; then
docker stop $containerId
docker rm $containerId
docker rmi -f $imageName
fi
# 運行新的鏡像,最後面其實是倉庫名稱:tag名
docker run -d --name [容器名稱] -p 3000:3000 [鏡像倉庫的域名]/[鏡像倉庫的命名空間]/[鏡像倉庫的名稱]:jenkins-$tagName/<code>

點擊保存,我們的構建過程就配置好了,可以點擊build with params,選擇git倉庫的tag進行構建了,有任何疑問可以在留言去中提問,看到後我會回覆,希望你們能一次成功。

jenkins+docker部署nodejs程序


參考鏈接:

ubuntu 16.04 安裝配置docker:

https://www.jianshu.com/p/724315d13ad7

如何從容器內部執行宿主機的docker命令:

https://www.jianshu.com/p/8b72eece7df8

使用jenkins插件SSH Plugin執行遠程ssh

https://blog.csdn.net/df0128/article/details/90298591


分享到:


相關文章: