Jenkins+Svn+Docker搭建持續整合環境 自動部署

雲村的王子發表於2022-06-30

一、準備工作:

  • 兩臺伺服器:192.168.206.212,192.168.206.213

  • 自己新建一個maven專案

其中兩臺機子做下面的軟體配置(都有連結,可直達

212機子:

213機子:

  • 安裝SVN

  • 安裝JDK並配置;

  • 安裝maven並配置;

  • 安裝docker

其中專案的話可以參照截圖,controller,model什麼的這些自定義就行。

重點注意紅框框的這幾個

 1、properties 配置

application-dev.properties 和 application-test.properties 主要就是資料庫地址不一樣,其他都一樣。這裡這兩個檔案不配置內容也可以。

 

2、pom檔案

pom檔案主要就配置紅框框位置的這個,我這裡的名稱demo就可以讓每次打包都是 demo.jar 這個名稱

 

 

3、指令碼檔案

主要的來了。這五個配置檔案

(1)docker_build.sh

#!/bin/bash
RUNENV=$1
MODULE=$2
echo "環境: ${RUNENV}"
# docker 倉庫地址
IMAGE_NAME="192.168.206.212:5000/${MODULE}:1.0.0.RC"
echo $IMAGE_NAME >> IMAGE_NAME
docker build --build-arg RUNENV=${RUNENV} -t ${IMAGE_NAME} .
docker push ${IMAGE_NAME}

 (2)docker_deploy.sh

#!/bin/bash

PORT=$1
IMAGE=$2
MODULE=$3
echo "update image to: ${IMAGE}"
docker stop ${MODULE}
# 刪除容器
docker rm ${MODULE}
# 減少磁碟空間 刪除映象
docker rmi -f $(docker images | grep ${MODULE})
docker run -d -p ${PORT}:8070 -v /home/logs:/home/logs --name ${MODULE} ${IMAGE}

 (3)Dockerfile

FROM airdock/oraclejdk
MAINTAINER hmw 1445496485@qq.com


ARG RUNENV=${RUNENV}
ENV RUNENV=${RUNENV}

ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

RUN mkdir -p /var/yjz/demo \
    echo ${RUNENV} > /tmp.properties

COPY target/demo.jar /var/yjz/demo/app.jar

WORKDIR /var/yjz/demo

ENTRYPOINT ["java","-jar","app.jar","--spring.profiles.active=${RUNENV}"]

# EXPOSE命令只是宣告瞭容器應該開啟的埠並沒有實際上將它開啟!
# 我們宣告瞭EXPOSE埠之後,我們使用-P命令進行隨機對映的時候,是會對這個埠進行對映的。
# 比如說我們現在對一個tomcat容器進行EXPOSE 9999宣告,那麼我們進行-P隨機對映的時候是會對9999埠進行對映的。
EXPOSE 8063:8063

 (4)expect.sh

#!/usr/expect/bin/expect

set timeout -1
# 獲取傳入引數
set pwd [lindex $argv 0]
set module [lindex $argv 1]
set port [lindex $argv 2]
set image [lindex $argv 3]

spawn scp $pwd/docker_deploy.sh root@192.168.206.213:/home/service/fesco/$module.sh

expect "*password:"
send "root\r"


spawn ssh root@192.168.206.213
expect "*password:"
send "root\r"

expect "]# "
send "sh /home/service/fesco/$module.sh $port $image $module\r"

send "exit\r"
expect eof
exit

 (5)start.sh

#!/bin/bash

PORT=$1
MODULE=$2
IMAGE_NAME="192.168.206.212:5000/${MODULE}:1.0.0.RC"

echo "目錄:" $(pwd)
echo "模組:" ${MODULE}
echo "埠:" ${PORT}

./expect.sh $(pwd) ${MODULE} ${PORT} ${IMAGE_NAME}

二、jenkins建立專案

1、新建item——>選擇流水線(PipeLine)。

  

 2、設定引數

 

 

 

 3、流水線指令碼

node {
	stage('checkout_order') {
	 	deleteDir()
        checkout([
            $class: 'SubversionSCM',
            additionalCredentials: [],
            excludedCommitMessages: '',
            excludedRegions: '',
            excludedRevprop: '',
            excludedUsers: '',
            filterChangelog: false,
            ignoreDirPropChanges: false,
            includedRegions: '',
            locations: [
                [
                    credentialsId: '1a2dc2fc-8eed-46a3-b22d-169a863376ec',
                    depthOption: 'infinity',
                    ignoreExternalsOption: true,
                    local: '.',
                    remote: 'http://192.168.206.213/svn/svnrepos/branch/@HEAD'
               ]
            ], 
            workspaceUpdater: [$class: 'UpdateUpdater']
       ])
    }
    stage("mvn_order") {
        echo "start compile mvn_common"
        sh "mvn -DskipTests clean package"
	}
	stage("docker_build") {
        echo "start build image"
        sh 'chmod 777 ./docker_build.sh'
        sh './docker_build.sh ${RUNENV} ${MODULE}'
    }
    
     stage("docker_deploy") {
        echo "deploy on docker"
        sh 'chmod 777 ./docker_deploy.sh'
        sh 'chmod 777 ./expect.sh'
        sh 'chmod 777 ./start.sh'
        sh './start.sh ${PORT} ${MODULE}'
     }
}

credentialsId:憑據,如下圖所示配置一個

 

 

 

 

 

 

 

remote 後面填自己的專案svn地址,其他不變。下面這是我的。

 指令碼的整個過程:

# 1、svn拉取專案
# 2、編譯maven專案,生成jar包
# 3、docker_build.sh結合DockerFile檔案 生成映象並push到映象倉庫
# 4、執行start.sh 傳入引數(埠號,專案名稱等,這裡可以把版本號作為引數也發來),呼叫expect.sh將212機子上的docker_deploy.sh傳送到213機子上,並登入213機子,啟動docker_deploy.sh, docker_deploy會停止當前容器,刪除容器,刪除映象,從映象倉庫上拉取映象重新生成容器並啟動。

4、新建好之後,構建專案即可。

三、構建過程中的問題:

1、錯誤資訊: unix /var/run/docker.sock: connect: permission denied

 解決方案:

# 這個方法只要docker服務重啟, 就需要重新設定一次
cd /var/run/
chmod 777 docker.sock

2、錯誤資訊:java.lang.UnsupportedOperationException: no known implementation of class hudson.scm.SCM is named SubversionSCM

 解決方案:

因為沒有安裝svn外掛,去外掛管理中安裝svn

3、錯誤資訊:hudson.remoting.ProxyException: org.tmatesoft.svn.core.SVNAuthenticationCancelledException: svn: E200015: Authentication cancelled

 解決方案:

jenkins中新增一個憑據 svn中的使用者

 4、錯誤資訊:[ERROR] Could not create local repository at /usr/local/maven-repository -> [Help 1]

解決方案:

沒有找到maven中conf資料夾中的settting.conf配置的倉庫地址,我的是/usr/local/maven-repository。

所以在Jenknis所在的機子上操作,建立倉庫資料夾,並放開許可權

cd /usr/local/
mkdir maven-repository
chmod -R 777 /usr/local/maven-repository/

5、錯誤資訊:[ERROR] [ERROR] Some problems were encountered while processing the POMs:

 修改jenkins的使用者為root,預設是jenkins

vim /etc/sysconfig/jenkins

 重啟jenkins

systemctl restart jenkins

另外,要將maven倉庫的許可權放開。

我的倉庫地址是 /usr/local/maven-repository/

chmod -R 777 /usr/local/maven-repository/

 

相關文章