jenkins+docker進行微服務部署

startshineye發表於2022-12-19

1、jenkins配置

由於公司使用的是內部網路,沒有開啟網際網路,所以在進行jenkins構建的時候,沒法下載對應外掛,剛開始使用映象的方式製作了jenkins映象,
但是jenkins映象內部又缺少maven等外掛,弄了許久還是需要下載外掛;感覺有些麻煩,後面直接用之前外網的一個jenkins進行替代即可。jenkins配置
主要包含2部分:1、jenkins的環境變數配置及jenkins啟動war包 2、jenkins對應的外掛及名稱空間配置。

1.1、jenkins設定環境變數

在我們安裝jenkins之前,需要知道關於Jenkins怎樣儲存資料。事實上,不管你的Jenkins的war包村建存放在哪裡,jenkins都會把其所有重要資料存放在一個專門使用者、隔離的、成為Jenkins主目錄的目錄下。在這裡,Jenkins儲存關於構建伺服器配置資訊、構建作業、構建產物和其他有用的資訊,當然包括你安裝了任何外掛。這個目錄會消耗大量磁碟空間。
預設情況下,Jenkins主目錄被稱為.jenkins,會被放在你的當前使用者主目錄下。例如,假如你再window7下執行一個機器,且使用者名稱是"tom",主目錄會在:c:\Users\tom.jenkins下,在linux下,主目錄可能在:.home/tom/.jenkins等。

你可以使用定義JENKINS_HOME環境變數來強行使jenkins使用一個不同目錄作為其主目錄。
我們一般透過編寫一個shell指令碼實現,比如以下:主目錄:/data/jenkins/data

配置環境變數:/etc/profile

export JAVA_HOME=/root/software/jdk1.8.0_192
CLASSPATH=.:$JAVA_HOME/lib/
export JENKINS_BASE=/data/jenkins
export JENKINS_HOME=/data/jenkins/data
export PATH=$PATH:$JENKINS_BASE:$JENKINS_HOME:$JAVA_HOME/bin

1.2、外掛複製到JENKINS_HOME

將另一個已經安裝好外掛的機器上的JENKINS_HOME下的除workspace檔案複製到當前機器的JENKINS_HOME下。

1.3、啟動程式

將jenkins.war也複製到此目錄下,總體目錄結構及檔案如下:
1.png

對應啟動指令碼如下:jenkins_start.sh

#!/bin/bash
nohup java -jar jenkins.war --httpPort=8008 >jenkins.out 2>&1 &

1.4、系統訪問

系統輸入:

 http://ip:8008

系統訪問正常:
2.png

2、jenkins+docker進行微服務後端構建

2.1、映象製作

映象打包製作的話,一般我們有兩種方式。方式一:使用Maven外掛為SpringBoot應用構建Docker映象。這種情況主要是在pom.xml檔案中新增maven的docker映象打包依賴:
在應用的pom.xml檔案中新增docker-maven-plugin的依賴:

<plugin>
    <groupId>com.spotify</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>1.1.0</version>
    <executions>
        <execution>
            <id>build-image</id>
            <phase>package</phase>
            <goals>
                <goal>build</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <imageName>mall-tiny/${project.artifactId}:${project.version}</imageName>
        <dockerHost>http://192.168.3.101:2375</dockerHost>
        <baseImage>java:8</baseImage>
        <entryPoint>["java", "-jar","/${project.build.finalName}.jar"]
        </entryPoint>
        <resources>
            <resource>
                <targetPath>/</targetPath>
                <directory>${project.build.directory}</directory>
                <include>${project.build.finalName}.jar</include>
            </resource>
        </resources>
    </configuration>
</plugin>

相關配置說明:

  • executions.execution.phase:此處配置了在maven打包應用時構建docker映象;
  • imageName:用於指定映象名稱,mall-tiny是倉庫名稱,${project.artifactId}為映象名稱,${project.version}為倉庫名稱;
  • dockerHost:打包後上傳到的docker伺服器地址;
  • baseImage:該應用所依賴的基礎映象,此處為java;
  • entryPoint:docker容器啟動時執行的命令;
  • resources.resource.targetPath:將打包後的資原始檔複製到該目錄;
  • resources.resource.directory:需要複製的檔案所在目錄,maven打包的應用jar包儲存在target目錄下面;
  • resources.resource.include:需要複製的檔案,打包好的應用jar包。

    另一種方式是透過構建shell指令碼透過jenkins配置在伺服器上打映象。在此使用第二種方式,以網管為例,主要包括Dockerfile跟對應的構建指令碼.sh檔案。

2Dockerfile

我們以微服務中的閘道器為例: Dockerfile如下:

FROM cytomine/java8:latest
# 準備環境
ENV LANGUAGE=zh_CN.UTF-8
ENV TZ=Asia/Shanghai
RUN mkdir /apps/
WORKDIR /apps/
ADD target/gtc-gateway-2.3.0.jar app.jar
ENTRYPOINT ["java","-jar","app.jar"]
構建指令碼

對應的閘道器的指令碼如下:

#!/usr/bin/env bash
app_name='gtc-gateway'
images_name='gtc-gateway:1.0'
echo '----WORKSPACE----'
echo ${WORKSPACE}
cd ${app_name}
# 啟動容器
docker stop ${app_name}
echo '----stop container----'
docker rm ${app_name}
echo '----rm container----'
docker rmi `docker images | grep ${app_name} | awk '{print $3}'`
echo '----rm none images----'
docker build -t ${images_name} .
echo '----build images----'
docker run -p 30080:8080 --name  ${app_name} -d ${images_name}
echo '----start container----'
對應的位置

Dokcerfile跟構建指令碼在同一目錄下,便於我們後面透過jenkins的指令碼來構建應用。
3.png

2.2、jenkins服務構建視覺化配置

建立item

4.png

General

勾選:This project is parameterized->新增引數
Git Paramemter:Name:branch Parameter Type:Branch or Tag Default Value:origin/dev

原始碼管理

Repositories
`Repository URL:填寫對應的倉庫地址

Credentials:新增使用者名稱/密碼認證 ` 

Branches to build:${branch}-使用上面General定義的變數

如果此時出現如下錯誤:(我們的使用者名稱跟密碼是沒有問題的)
5.png

原因分析:這是由於git客戶端版本過低造成的!或者未安裝git
Jenkins本機預設使用"yum install -y git" 安裝的git版本比較低,應該自行安裝更高版本的git。
檢視GI版本

  git --version

如果存在,解除安裝低版本

  yum remove -y git

我這裡是系統沒有安裝git,自己安裝完git之後即可。

Pre Steps(增加構建步驟)
Invoke top-level Maven targets

因為後端使用maven的配置,所以此時需要配置maven進行構建,先構建共有的包到maven倉庫

Maven 版本:MAVEN_HOME
目標:clean install -Dmaven.test.skip=true -Ptest
POM:${WORKSPACE}/gtc-common/pom.xml

因為需要將clean完package之後的包加入本地maven倉庫 所以使用了install

Invoke top-level Maven targets

構建自身的包
Maven 版本:MAVEN_HOME
目標:clean package -Ptest
POM:${WORKSPACE}/gtc-gateway/pom.xml

Execute shell

命令

sudo -i
chmod 777 /data/jenkins/data/workspace/gtc-gateway/gtc-gateway/gtc-gateway.sh
 /data/jenkins/data/workspace/gtc-gateway/gtc-gateway/gtc-gateway.sh

3、jenkins進行微服務前端構建

前端構建前:我們需要先下載安裝nginx:nginx下載地址:https://mirrors.huaweicloud.c...
首先我們需要在我們安裝jenkins的伺服器上安裝node,地址:

https://nodejs.org/download/release/v14.18.2/
建立item

前端構建就是普通的服務構建;構建一個自由風格的專案
6.png

General

勾選:This project is parameterized->新增引數
Git Paramemter:Name:branch Parameter Type:Branch or Tag Default Value:origin/dev
Choice Paramemter: 名稱:env 選項:dev stage prod 描述:前端環境
String Paramemter: 名稱:deploy_dir 預設值:/data/nginx/www/html/admin 描述:前端部署位置

原始碼管理

填寫響應的地址
Repositories

  `Repository URL:填寫對應的倉庫地址    
   Credentials:新增使用者名稱/密碼認證 ` 
 

Branches to build:${branch}-使用上面General定義的變數

構建

第一個 Execute shell:

 pwd
 cd gtc-system-ui
 pwd
 echo "${deploy_dir}"
 echo "env"
 echo "${env}"
 sudo -i
 pwd
 npm config get registry
 npm install
 npm run build:${env}
 pwd

第二個 Execute shell:

  if [ -d "${deploy_dir}" ];then rm -rf "${deploy_dir}"; fi;
  mkdir -p ${deploy_dir}
  cp -r ${WORKSPACE}/gtc-system-ui/dist/* ${deploy_dir}/

然後我們就可以構建,如下所示:
7.png

問題

如果在構建過程中出現如下問題:

/tmp/jenkins11995557596560651774.sh:行9: npm: 未找到命令

解決方式:我們在jenkins中配置環境變數PATH
8.png
9.png

相關文章