1、Docker鏡像拉取 Jenkins 環境命令
docker pull jenkins/jenkins:lts
查看下拉取的鏡像
docker images
2、通過容器編排方式構建 Jenkins 容器
創建對應目錄
# 創建對應目錄
mkdir -p /data/jenkins/jenkins_home/
chown -R 1000:1000 /data/jenkins/jenkins_home/
+ data
- docker-compose.yml // docker-compose執行文件
+ /data/jenkins
- jenkins_home // Jenkins掛載卷
docker-compose.yml文件配置
version: "3"
services:
jenkins:
user: root
restart: "always"
image: jenkins/jenkins:lts
container_name: jenkins
privileged: true
ports:
- 8080:8080
- 50000:50000
environment:
JAVA_OPTS: -Duser.timezone=Asia/Shanghai
volumes:
- /data/jenkins/jenkins\_home/:/var/jenkins\_home
- /data/jenkins/workspace/:/root/.jenkins/workspace \
- /usr/local/apache-maven-3.6.0:/usr/local/maven
- /usr/local/maven/maven-3.6.0/repository:/usr/local/maven/repository
- /usr/local/jdk1.8.0_211:/usr/local/jdk
- /var/run/docker.sock:/var/run/docker.sock
- /usr/bin/docker:/usr/bin/docker
- /etc/localtime:/etc/localtime
- /usr/local/bin/docker-compose:/usr/local/bin/docker-compose
- /usr/lib/x86\_64-linux-gnu/libltdl.so.7:/usr/lib/x86\_64-linux-gnu/libltdl.so.7
- /root/.ssh:/root/.ssh # (可選)免密配置時,公鑰可以直接在本地配置
3、啟動容器環境
需要進入 compose 目錄下面輸入以下命令,進行環境的啟動
docker-compose up -d
4、docker-compose 其它操作
鏡像內容器進行操作后可以保存成新的鏡像,比如容器內安裝了jdk、配置了環境變量可以保存為新的鏡像
# 找出當前運行的容器ID
docker ps
# 根據containerId,創建新鏡像
docker commit 5d81d56b18b6 jenkins/jenkins:centos.v1
修改 docker-compose 可以對創建的容器根據新鏡像進行修改
version: "3"
services:
jenkins:
user: root
image: jenkins/jenkins:lts
ports:
- 8080:8080
- 50000:50000
restart: "always"
container_name: jenkins
environment:
JAVA_OPTS: -Duser.timezone=Asia/Shanghai
#比如新增環境變量
java_home = xxx 僅做舉例
volumes:
- /home/jenkins/jenkins\_home/:/var/jenkins\_home
- /var/run/docker.sock:/var/run/docker.sock
- /usr/bin/docker:/usr/bin/docker
- /usr/local/bin/docker-compose:/usr/local/bin/docker-compose
privileged: true
刪除之前的容器
docker-compose down
重啟成新的容器
docker-compose up -d
5、配置 Jenkins
前提,Jenkins 部署應用到遠程服務器上,必須要實現 Jenkins 服務器免密登錄到遠程服務器上,同時遠程服務器也要免密登錄到 Jenkins 服務器上拷貝對應的jar包。所以,配置 Jenkins 前保證兩台服務器互相免密登錄。這塊配置,可以查看我之前寫的文字 [ Linux系統兩台機器互免密登錄 ],很簡單。
5.1首先配置 ssh 插件
1、安裝 ssh 相關的插件,直接在插件中心搜索 ssh 然后按裝如下兩個插件
①插件,主要用於鏈接遠程服務器全局配置(公共配置);
②插件,主要用於鏈接遠程服務器傳文件配置,在項目里配置。
2、全局配置 Publish over SSH,系統管理->系統配置,下拉找到即可
第1個標注的地方,如果生成私鑰的時候,沒設置密碼,不用填寫任何內容留空即可;
第2個標注的地方,遠程服務器的別名,隨意起;
第3個標注的地方,遠程服務器的地址;
第4個標注的地方,遠程服務器的賬號名稱(登錄名);
第5個標注的地方,遠程服務器上要放置應用的目錄,這里需要注意,后期項目配置的時候填寫的目錄跟這個是拼接的。
第6個標注的地方,點擊高級后,展開下面的填入項。
第1個標注的地方,遠程服務器的密碼
第2個標注的地方,遠程服務器的私鑰。
3、項目(job)配置 ssh 插件相關的內容-前端VUE
新建一個job,輸入名稱,選擇流水線項目,點擊確定。
這里只演示,構建這個步驟的配置,其它配置很簡單,自己網上一搜就可以。
上面的截圖①,對應截圖下面①、②兩個步驟。
構建配置第一步,Jenkins 打包項目前端應用:
上圖第1個標注地方,shell腳本如下。
#!/bin/bash
cd /data/jenkins/jenkins_home/workspace/data/xxx-all/xxx-admin
#這個目錄也可寫成如下這樣,不同Jenkins版本可能有所不同,相對與打包工程的下一級目錄開始。
./dev-xxx
npm install
npm run build
cd dist
tar -cvf dev-xxx.tar *
腳本,
第2行表示,Jenkins 服務期切換目錄到 Jenkins 配置的 workspace 目錄下的項目工程目錄下。
第5、6行,前端應用打包命令。
第7行,切換到 dist 目錄,(Jenkins打包前端應用后自動生成這個目錄,打包的結果都在這個目錄下)
第8行,將 dist 目錄下的所有內容打包(*很重要),方便傳輸到遠程服務器(部署服務器)。
構建配置第二步,將打包結果上傳到遠程服務器;
上面5個配置,逐一解釋如下,這里如果配置不好,項目根本無法部署到遠程服務器上。
①,遠程服務器的名稱(別名),前面全局配置的時候已經設置過了,這里下拉選擇。
②,打包結果(源文件)的目錄地址,即,Jenkins 上打包后產生的內容放置的地方,這個目錄很容易填錯,會把你搞死。該目錄是Jenkins主目錄下的工程目錄開始的,即工程目錄下一級開始填寫。
③,刪除前綴,要不然你的遠程服務器又會創建dist這個目錄。
④,遠端目錄,這里需要注意,我上面配置全局(公共配置)ssh的時候,已經填寫了應用部署的遠端目錄,https://www.yuque.com/u21187464/cf/bo7lzr#GsmxQ 這里的第5個標記,此處是基於全局公共配置的目錄的拼接。
⑤,將遠程服務器執行的命令,如果是前端VUE項目,就是解壓上面打包的項目,腳本如下。
腳本寫法一:
# cd /data/xxx-all/xxx-admin/dev-xx.tar
# tar -zxvf dev-xx.tar
腳本寫二(理論上面的寫法沒問題,我驗證Jenkins會報錯):
tar -xvf /data/xxx-all/xxx-admin/dev-xx.tar -C /data/xxx-all/xxx-admin/
腳本說明,
第一行,切換目錄到遠程服務器部署應用的目錄,
第二行,解壓應用包。
這里總結下上面配置的源文件(Sourec files)這個目錄,很多坑。
Jenkins 構建后會在其工作空間 workspace 目錄下產生對應項目的文件夾(這個文件夾名字是創建項目時命名的項目名,如下圖),此時 workspace 目錄下就會有api-dev這樣的文件夾,
所以,源文件目錄里填寫的是這個文件夾之后的目錄,不要把這個文件夾也填寫。
4、項目(job)配置 ssh 插件相關的內容-java-jar包
因為上面講過了,這里直接截圖展示下,
Jenkins 構建后其工作目錄產生的 api 項目目錄如下。
①標識的地方,意思是先構建運行完成后,再傳輸jar包到遠程服務器,我這里構建指 maven 構建后在傳輸。
②標識的地方,源文件目錄,上面講過了,api項目名稱后面的目錄開始填寫。
③標識的地方,刪除前綴,jar包前面的目錄都刪除,要不然遠程服務器上會創建這個目錄。
6、總結
1、Jenkins 編譯構建后,需要將應用包(jar包、war包等)部署到遠程服務器上,所以,必須保證 Jenkins 服務器和遠程服務器互相免密訪問,配置上面已經說過了。
2、如果你的 Jenkins 服務器和應用服務器部署在 docker 容器里的話,需要保證兩個容器互相免密登錄,具體配置跟上面提到的配置一樣,只是需要在容器里操作而已。
3、上面 Jenkins 打包配置我舉例的是前端 vue 打包的結果,壓縮成壓縮包和上傳部署到遠程服務器的過程,如果api部署的話,流程大概一樣,只是不需要壓縮和解壓而已。
讀后感
來這里找我交流
-
QQ群:330374464
-
公眾號:軟件測試資源站(ID:testpu)