Docker+Jenkins,持續集成,持續部署
前言:
該文章是本人在學習中的記錄總結!!本文親測有效!
我會從一個干凈的Linux環境,安裝docker、部署jenkins、上傳項目、自動拉取代碼部署到目標服務器 等。邊操作邊記錄,后續如果有新的知識點也會更新記錄下來。
本人經驗有限,做的不對的地方還請大佬指正 QQ: 1126184155 對本篇文章有疑問也可以問我
目標:
我們后端寫完代碼測試無誤后:
- 通過git將代碼推送(git push)到遠程代碼倉庫。
- 然后遠程代碼倉庫通知我們搭建的Jenkins服務,去遠程代碼倉庫進行拉取源代碼
- 然后jenkins進行打包成jar包
- jenkins推送相關文件(jar,Dockerfile,docker-compose...)到我們要部署項目的機器。再自動執行相關的shell腳本啟動項目。達到一個自動持續集成部署的效果
前置技能
- Linux、基本的shell編程、docker、docker-composer(用docker run 也行,這個也簡單基本操作會用就行)
- java、Maven,git、SpringBoot
三台機器,你的git倉庫服務器(官方的也行)、部署jenkins的機器、部署項目的機器。它們三個要能相互訪問哦
目錄
創建遠程代碼倉庫和示例項目
不管什么遠程倉庫都可以,先能用就行,后面會說Gitee和GitLab相關的操作
-
創建一個Springboot項目,勾選web
-
將該項目創建git本地倉庫,再創建遠程倉庫推送上去
- 創建TestController
@RestController
@RequestMapping("/test")
public class TestController {
@GetMapping("/hello")
public String sayHelloJenkins(){
return "Hello Jenkins!";
}
}
- 本地測試無誤
安裝Docker
-
需要安裝的包
yum install -y yum-utils
-
設置阿里鏡像倉庫
-
yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
-
-
更新軟件包索引
yum makecache fast
-
安裝Docker docker-ce是社區版的 ee是企業版的
yum install docker-ce docker-ce-cli containerd.io
-
啟動Docker
systemctl start docker
-
啟動后查看docker版本查看是否安裝成功
docker version
-
阿里雲鏡像加速
-
sudo mkdir -p /etc/docker
-
sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://jvg97r6e.mirror.aliyuncs.com"] } EOF
-
sudo systemctl daemon-reload
-
sudo systemctl restart docker
-
安裝Docker Compose
-
下載
-
# 國內鏡像 curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
-
-
給該文件授權
sudo chmod +x /usr/local/bin/docker-compose
安裝Maven
因為Jenkins容器沒有Maven環境,如在容器內部安裝Maven,由於構建的項目要下載相關的依賴這樣造成一部分資源浪費。所以我這里采用的將Maven和容器通過掛載達到共享本地Maven倉庫
- 去官網下載Maven,我使用的版本是3.5.0
- 上傳至Docker服務所在的服務器
- 我這里放到的 /usr/local/目錄下了
-
解壓后進入
apache-maven-3.5.0/
-
創建repository目錄
mkdir repository
-
進入conf目錄 vim settings.xml 配置本地倉庫路徑(換成自己的路徑和版本)和阿里鏡像源
-
<?xml version="1.0" encoding="UTF-8"?> <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> <!--這里寫自己的路徑--> <localRepository>/usr/local/apache-maven-3.5.0/repository</localRepository> <pluginGroups> </pluginGroups> <proxies> </proxies> <servers> </servers> <mirrors> <mirror> <id>aliyunmaven</id> <mirrorOf>*</mirrorOf> <name>阿里雲公共倉庫</name> <url>https://maven.aliyun.com/repository/public</url> </mirror> </mirrors> <profiles> </profiles> </settings>
-
-
回到
/usr/local/
給apache-maven-3.5.0文件遞歸增加其他用戶寫權限chmod -R o+w apache-maven-3.5.0
-
查看
apache-maven-3.5.0/bin/
目錄下的mvn
是否有執行權限(綠色的),沒有就添加
-
添加Maven環境變量
-
vim /etc/profile
-
# 將如下配置到/etc/profile,注意是你的Maven目錄的位置 export MAVEN_HOME=/usr/local/apache-maven-3.5.0 export PATH=$PATH:$MAVEN_HOME/bin
-
配置生效:
source /etc/profile
-
-
配置成功后關閉終端,從新連接
-
在任意目錄輸入
mvn -version
沒有提示mvn 命令找不到說明配置完成- 如果提示找不到java 命令,只是說明你沒有安裝java環境。根據你自己的需要是否安裝,這里可以不安(jenkins容器里有openjdk環境)
啟動Jenkins容器
- 選擇一個目錄(我選擇的是 /home目錄)
- 在該目錄下創建目錄
mkdir jenkins
- 進入目錄,創建data目錄 用於掛載Jenkins的數據文件
- 為其他用戶添加寫的權限
chmod o+w data
-
在當前目錄下創建docker-compose.yaml文件
vim docker-compose.yaml
-
version: "3.8" services: jenkins.service: image: jenkinsci/blueocean ports: - "8080:8080" - "50000:50000" environment: MAVEN_HOME: /usr/local/apache-maven-3.5.0 PATH: /opt/java/openjdk/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/apache-maven-3.5.0/bin volumes: - /usr/local/apache-maven-3.5.0:/usr/local/apache-maven-3.5.0 - /home/jenkins/data:/var/jenkins_home
-
-
docker-compose啟動Jenkins
docker-compose up
,然后等待啟動(如果上面照着做沒問題的話這里應該是可以啟動的)
基礎配置
- 進入界面 端口是你映射的端口
- 安裝推薦插件
- 安裝過程要等會,emmmm可以去喝杯水上個廁所。如果失敗重試一下
- 直接使用admin用戶
- 之后保存並完成,然后重啟(如果你覺得重啟慢的話,去終端另開一個端口,用docker restart 容器id 重啟容器)。重啟好了頁面要刷新一下,不然一直等待頁面
- 使用admin用戶登錄
全局安全配置
這里可以根據自己的需求做配置
全局工具配置
通過 docker exec -it 容器id /bin/bash 進入容器(以下參數全是容器中的參數)
- 獲取Maven的settings文件路徑
- 獲取環境變量JAVA_HOME
- 獲取環境變量MAVEN_HOME
配置JAVA_HOME時把自動安裝取消就可以了
Maven同上 git直接用容器默認的
插件管理
- 安裝Publish Over SSH插件 選中然后下載(我這里截圖沒來得及選)
- 等待下載完成重啟一下容器就完成了(重啟后記得刷新頁面),之后要用的時候再配置
# 查看密碼
[root@lj jenkins]# cat data/secrets/initialAdminPassword
a86*********************26
第一個任務
源碼管理
構建
測試構建
項目在第一次打包構建時有點慢,因為要下載相關Maven依賴,別急,去喝口水走走!!
搞定了,Jenkins已經幫我們從遠程倉庫自動拉取代碼然后打包好了,回到工程去看一下
然后點擊工作區,這個目錄熟不熟悉??哈哈哈。進去target目錄查看打包好的jar包吧
使用Gitee來觸發項目構建
上面我們完成了Jenkins的基本構建。但是,我們在實際業務中不是去手動點擊立即構建讓Jenkins去構建。這tm的算什么自動構建啊!我們程序員寫完代碼后本地測試沒問題了就會通過git的
git push
推送到遠程代碼倉庫,我們要做到遠程代碼倉庫接收到了新的推送然后去觸發Jenkins的構建功能達到自動構建的效果!!!別急慢慢來會很快的!
安裝插件
和剛才安裝 Publish Over SSH插件插件一樣
- 點擊最上角 Dashboard 進到首頁。然后 系統管理 -> 插件管理 -> 可選插件 搜索Gitee
安裝完成了記得重啟
插件配置
系統管理 -> 系統配置 -> Gitee 配置
先去Gitee生成API 令牌 https://gitee.com/profile/personal_access_tokens
點擊高級根據你的需求選擇 再點擊測試連接
插件配置完成!!
任務配置
進入我們jenkins_test任務,左邊導航欄有個配置點擊進入
Gitee鏈接
選擇我們剛才配置的鏈接
源碼管理配置
在源碼管理點擊高級
觸發器配置
保存!!!!!!!
去你的Gitee代碼倉庫配置WebHook
管理 -> WebHooks -> 添加webHook
測試
去我們之前的示例項目里隨便做點修改然后git push到遠程倉庫試試
測試成功!!!
使用GitLab觸發項目構建
安裝插件
安裝 Gitlab 和 Gitlab Hook 過程同上。我用的公司GitLab不方便截圖了,但是基本配置都相同,GitLab官方的配置是英文的。emmm面向有道翻譯學習了。
任務配置
進入我們jenkins_test任務,左邊導航欄有個配置點擊進入
源碼管理
要換成你GitLab的地址和密碼哦(用公鑰私鑰免密登錄也行,記得要將容器內jenkins私鑰配置給憑證,還有jenkins的公鑰配置給GitLab)
觸發器配置
和Gitee類似。選擇你的觸發事件( Push Events )。點擊高級還會生成 Secret token 。
記得把WebHook和生成的Secret token配置給GitLab的WebHooks
測試
測試一樣啊,你把你的項目推送,然后看看有沒有觸發構建咯。反正我是成功了哈哈哈!!!嗝~
持續部署
在前面我們已經完成了有遠程代碼倉庫推送代碼觸發項目構建的功能。但是,每次構建完了是不是還是要我們去下載然后部署到我們的目標服務器。這樣未必過於麻煩,而且有些時候還會出現不及時等情況,或者部署后又上線新需求又要從新部署!!!我們能不能讓Jenkins自動幫我們連接我們要部署的目標服務器幫我們自動化部署呢??? 嘿嘿嘿!懶使人進步。come on!
還記得我們前面安裝了 Publish Over SSH插件嗎?我們來思考一下,我們到底想讓Jenkins幫我們做什么?emmm! 首先,幫我們把構建打包好的jar包發送到目標服務器上,然后連接我們的目標服務器去執行啟動項目的命令(java -jar xxx,jar > /dev/null &)!
准備:
- 在你的搭建的Jenkins服務的宿主機上生成ssh秘鑰
ssh-keygen
(生成過就別生成了或者覆蓋)
- 將你的公鑰發送到你們要部署的目標服務器
ssh-copy-id 目標服務器ip
-------------------這里有點繞注意要填些什么東西-------------------
-------------------這里有點繞注意要填些什么東西-------------------
-------------------這里有點繞注意要填些什么東西-------------------
插件配置
進入 系統管理 -> 系統配置 -> Publish over SSH
SSH Servers 點擊新增 你也可以點擊高級用目標服務器的賬號密碼登錄它的ssh
點擊保存
任務配置
進入我們jenkins_test任務,左邊導航欄有個配置點擊進入
構建后操作
保存
測試
去我們之前的示例項目里隨便做點修改然后git push到遠程倉庫
......參照上面的測試
查看控制台
查看目標服務器
你可以在任務配置里面剛才腳本的位置添加相關的腳本,比如判斷某個該服務是否啟動啟動就關閉啟動新的服務,完成自動化部署 示例:
#!/bin/bash cd jenkins_test # 這是一個坑點 ssh遠程執行命令的時候,被遠程機器的有些環境變量是無法獲取的,比如java環境信息,所以java命令執行不出來 !!! source /etc/profile # 獲取jenkins_test-0.0.1-SNAPSHOT.jar服務的pid 第一次就啥都沒有 PID=`ps -aux|grep jenkins_test-0.0.1-SNAPSHOT.jar|grep -v grep |awk '{printf $2}'` for id in $PID do kill -15 $id echo "killed $id" done nohup java -jar jenkins_test-0.0.1-SNAPSHOT.jar > ./console.log 2>&1 &
用docker-compose完成容器化自動部署
- 在實例項目中添加Dockerfile和docker-compose.yaml文件
FROM java:8
MAINTAINER Lj<1126184155@qq.com>
COPY target/jenkins_test-0.0.1-SNAPSHOT.jar /usr/local/jenkins_test-0.0.1-SNAPSHOT.jar
ENV MYPATH /usr/local
WORKDIR $MYPATH
EXPOSE 8080
CMD ["java","-jar","jenkins_test-0.0.1-SNAPSHOT.jar"]
version: "3.8"
services:
web:
build: .
ports:
- "8081:8080"
修改構建后配置
測試
修改實例代碼,然后推送到遠程倉庫,查看Jenkins控制台的構建,第一次因為要下載相關的鏡像所以會比較慢。耐心等待。然后訪問8081端口的/test/hello接口
可以多次修改代碼推送然后查看效果!
查看docker容器