最近使用jenkins+docker完成了持續部署nodejs程序,戰線拉的很長,知識點也很碎,也踩過一些坑,遂寫篇文章總結一下,往後要有遺忘,也能夠回來翻閱。node
首先先說一下要達成的目標:用戶提交代碼並打tag後,在jenkins界面上選擇對應的tag執行構建,構建的過程當中會將代碼經過docker打包成鏡像,而後推送到鏡像倉庫中,接着ssh到應用服務器上,拉取對應的鏡像,中止以前運行的舊版本容器,將新的鏡像run起來。linux
流程圖簡單畫了一下
瞭解了目標後,就開始一步步開幹。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
而後根據提示安裝插件
等待插件安裝完成...
插件安裝完成後,建立用戶,以後就初始化完成了。
接下來,安裝咱們此次部署nodejs程序須要的插件,咱們的目標是,在jenkins上選git上的tag,作爲源碼,因此咱們須要安裝git parameters插件
點擊系統管理-》插件管理 -》選擇可選插件tab,找到Git Parameter Plug-In 安裝,而後再搜索SSH 找到SSH plugin插件安裝,等待安裝完成
插件安裝完成,咱們的基礎工做就基本上作好了,接下來,咱們就要開始在jenkins上建立任務達成咱們的目標了。點擊新建任務,填一個任務名稱,選擇「構建一個自由風格的軟件項目」, 進來後選擇參數化構建過程,以便在構建時,選擇tag進行構建
接着往下,填入git倉庫信息
指定分支填入${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起來
咱們先配置下咱們應用服務器的地址信息。
添加一個域,此處域名能夠隨便寫
在上一步建立的域下添加一個憑證,類型選擇Username with password下面的Username和Password即爲要鏈接的linux服務器的登陸帳戶和密碼
添加remote host
進入jenkins–>系統管理–>系統配置–>SSH remote hosts(在系統設置中找到SSH remote hosts),添加該linux服務器鏈接
配置完成後,咱們繼續進入剛纔新建的任務,增長構建步驟
選擇配置的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/...