實戰:docker-jenkins

山頭人漢波發表於2022-05-02

上篇,我們講到了 dockerfile 的最小實現,但也丟擲了一個問題,即使 docker 解決了環境和部署問題,但 CICD 還是讓人感到心累,本章通過 docker 生成 jenkins 容器,並將 jenkins 與 github 結合,實現 一定程度上的 CI

希望達到的效果

我希望我在 git push 後,程式碼推送至 jenkins ,在 jenkins 點選 釋出,就能將我的程式碼推送至 伺服器,我瀏覽頁面,馬上就能看到效果

git push 到倉庫,在 jenkins 上點選發布就能釋出。

jenkins 繫結 遠端倉庫 和 伺服器

git push 到 倉庫後,jenkins 監聽到,執行指令碼

刪除原來的容器,並生成一個新的容器 對映出埠

jenkins 快速入門

它是 java 語言寫的 cicd,

它是一套用 java 寫的 cicd 系統,通過 ssh 可以與伺服器打交道

實現思路

jenkins

實現步驟

第一步:拉取 jenkins 映象,以此為映象生成容器

第二步:安裝配置 jenkins

第三步:準備 node 服務

第四步:jenkins 部署 node 服務

第一步:生成 jenkins 容器

先從 dockerhub 上拉取 jenkins

docker pull jenkins/jenkins:lts

建立一個 jenkins 目錄

mkdir /home/johan/www/jenkins

提高此檔案的許可權

sudo chmod -R 777 /home/johan/www/jenkins

以 jenkins/jenkins:lts 為映象生成一容器

docker run --name jenkins -p 8080:8080 -p 50000:50000 -d -v /home/johan/www/jenkins:/var/jenkins_home jenkins/jenkins:lts

-d: 後臺執行

-v: 資料卷,將容器中的內容對映到本機上

檢視容器內部日誌

docker logs jenkins

輸入域名網址檢視 jenkins 是否安裝成功

看到 解鎖 jenkins,輸入 logs 中的密碼,即能解鎖

第二步:安裝配置 jenkins

按照安裝推薦外掛安裝 jenkins 的外掛

配合 jenkins

docker_jenkins安裝推薦的外掛

需要等一段時間,下載這些外掛

docker_jenkins新手

報錯就重試,咔咔就是幹

建立管理員賬號

docker_jenkins建立賬號

儲存成功,開始使用 jenkins

換源

https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

前往 系統管理 ——> 外掛管理 ——> 高階 ——> 拉到最下面

docker_jenkins換源

下載 ssh 外掛

前往 系統管理 ——> 外掛管理 ——> 可選外掛

搜尋 "Publish over SSH",並安裝

docker_jenkins下載ssh外掛

配置 ssh

前往 系統管理 ——> 系統配置——> 拉到最下面(Publish over SSH)

docker_jenkins配置ssh2

使用密碼

docker_jenkins設定伺服器上的ssh

點選 Test Configuration,已經和伺服器接通

安裝 nodejs 外掛

node 外掛在跑 node 專案時需要使用,這裡先安裝好

前往 系統管理 ——> 外掛管理 ——> 可選外掛

搜尋 node,並安裝

全域性配置 node

前往 系統管理 ——> 全域性工具配置 ——> NodeJS

docker_jenkins安裝node外掛1

應用並儲存它

關於 jenkins 的搭建到此告一段落

第三步:準備 node 服務

我們拿上一章講的 koa 為例子講解

生成 .gitignore 檔案,並寫入 node_modules

將 dockerfile_koa_demo 上傳至 github

git init
git add .
git commit -m 'first_commit'
git remote add origin https://github.com/johanazhu/dockerfile_koa_server.git
git push -u origin master

第四步: jenkins 部署 node 服務

建立一個任務

jenkins新建任務

起任務名

jenkins起任務名字

任務描述

jenkins任務描述1

jenkins任務描述2

jenkins任務描述3

jenkins任務描述5

程式碼如下:

docker stop koa_server_container
docker rm koa_server_container
docker rmi johanbo/koa_server:v.1.0.0
cd /home/johan/www/jenkins/workspace/dockerfile_koa_server
docker build . -t johanbo/koa_server:v1.0.0
docker run -d --name koa_server_container -p 3011:3010  johanbo/koa_server:v1.0.0

解讀以上程式碼:

第一行:停止 koa_server_container 容器

第二行:刪除此容器

第三行:刪除生成此容器的映象

第四行:進入伺服器中的 jenkins 資料卷相對於的目錄

注意:dockerfile_koa_server為你一開始建立該專案時的名字

第五行:生成一個名叫 johanbo/koa_server:v1.0.0 的映象

第六行:生成一個以 johanbo/koa_server:v1.0.0 為映象的名字叫做 koa_server_container 的容器,並將本機的 3011 埠與容器的 3010 做對映

應用並儲存

立即構建服務

jenkins控制檯輸出

發現成功,並且能看到“hello,docker“

在本地更改原檔案 app.js

app.use(async (ctx) => {
    ctx.body = 'hello, docker, jenkins';
});

提交程式碼至 github

通過 jenkins 再次部署 node 服務

jenkins立即構建

構建完成,重新整理瀏覽器,發現內容已經更換

jenkins部署成功

PS:此服務現已下架

總結

在實際開發中其實踩了很多坑,雖然有很好的別人寫過的教程,但自己動手做時卻有各種限制,比如作業系統不同,祕鑰,jenkins 的 SSH 外掛,jenkins 裡支援 docker 命令的外掛整合問題等等

網上關於兩種的教程也有很多,但大多數是預設:jenkins 和應用部署在同一臺伺服器上,這樣就能在相對應的檔案中構建映象,

但如果 jenkins 和應用程式是部署在兩臺伺服器上該如何操作呢?留給下一個挑戰者

參考文章