jenkins+docker部署nodejs程序

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

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

流程圖簡單畫了一下
流程圖.jpg
瞭解了目標後,就開始一步步開幹。git

首先安裝docker環境,個人機器是ubuntu16.04web

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

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"

安裝dockershell

sudo apt-get update
sudo apt-get install docker-ce

重啓dockernpm

sudo service docker restart

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

docker --version

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

因爲國內網的問題,可先添加DaoCloud的加速器:在DaoCloud官網上找到加速器 選項,找到你對應的操做系統服務器

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

拉取jenkins

sudo docker pull jenkins:lts

建立jenkins配置文件目錄

sudo mkdir /var/jenkins_home
sudo chmod 777 /var/jenkins_home   ##注意這裏必須配置本地卷的權限,不然啓動失敗

運行jenkins鏡像

注意:咱們是經過jenkins來構建鏡像的,可是咱們的jenkins容器裏面是沒有安裝docker的,可是咱們宿主機是安裝了docker,因此咱們須要將宿主機的docker掛到容器中, 參考連接:https://www.jianshu.com/p/8b7...

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

-d:後臺運行

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

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

--name:給容器取個名稱

這個時候訪問9000端口就能夠看到jenkins的界面了,注意:若是是阿里雲上的服務器,須要在安全策略處配置容許9000端口

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

cat  /var/jenkins_home/secrets/initialAdminPassword

而後根據提示安裝插件
jenkins.jpg
等待插件安裝完成...

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

接下來,安裝咱們此次部署nodejs程序須要的插件,咱們的目標是,在jenkins上選git上的tag,作爲源碼,因此咱們須要安裝git parameters插件

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

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

接着往下,填入git倉庫信息
jenkins2.jpg

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

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

# 進入項目目錄
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

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

# 基於某個鏡像,來構建新的鏡像,咱們是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

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

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

添加一個域,此處域名能夠隨便寫
jenkins3.jpg

在上一步建立的域下添加一個憑證,類型選擇Username with password下面的Username和Password即爲要鏈接的linux服務器的登陸帳戶和密碼
jenkins4.jpg

添加remote host

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

配置完成後,咱們繼續進入剛纔新建的任務,增長構建步驟
jenkins6.jpg

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

# 設置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

點擊保存,咱們的構建過程就配置好了,能夠點擊build with params,選擇git倉庫的tag進行構建了,有任何疑問能夠在評論中提出來,看到後我會回覆,但願大家能一次成功。

參考連接:
ubuntu 16.04 安裝配置docker:
https://www.jianshu.com/p/724...
如何從容器內部執行宿主機的docker命令:
https://www.jianshu.com/p/8b7...
使用jenkins插件SSH Plugin執行遠程ssh
https://blog.csdn.net/df0128/...

相關文章
相關標籤/搜索