maven+docker+jenkins+svn自動化部署搭建(CentOS8環境下)

總體流程

總體流程.png

安裝Docker

  1. 下載docker-ce的repo
curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
  1. 安裝依賴
yum install https://download.docker.com/linux/fedora/30/x86_64/stable/Packages/containerd.io-1.2.6-3.3.fc30.x86_64.rpm

ps:containerd版本過低,無法安裝docker,所以此處是升級containerd的

  1. 安裝docker-ce
yum install docker-ce
  1. 啟動docker
systemctl start docker
#開機自動啟動
# systemctl enable docker
  1. 設置國內源
vi  /etc/docker/daemon.json 
"registry-mirrors": [
    "https://1nj0zren.mirror.aliyuncs.com","https://docker.mirrors.ustc.edu.cn",
    "http://f1361db2.m.daocloud.io", "https://registry.docker-cn.com"]
  1. 重啟
sudo systemctl daemon-reload
sudo systemctl restart docker

安裝Portainer

介紹一款docker可視化界面portainer,可以方便的查看啟動刪除停止容器,也可以管理鏡像

docker pull portainer/portainer
docker run -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -d portainer/portainer
portainer界面.png

安裝Jenkins

docker pull jenkinsci/blueocean

docker run -d --name jenkins -p 9001:8080  -p 50000:50000 --env PATH=/usr/share/maven/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/jvm/java-1.8-openjdk/jre/bin:/usr/lib/jvm/java-1.8-openjdk/bin  -v /var/run/docker.sock:/var/run/docker.sock -v /dockerworkspace/jenkins:/var/jenkins_home -v /opt/maven:/usr/share/maven -v /etc/localtime:/etc/localtime jenkinsci/blueocean

Ps:

  1. jenkins插件清華大學鏡像地址
    https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

  2. 可能會出現java.net.UnknownHostException,困擾了我很久,百度搜出來的答案都不靠譜??戳艘黄恼抡f有可能是防火墻沒關。關閉防火墻,重啟立馬好了。。坑啊

    systemctl status firewalld.service 查看防火墻狀態
    systemctl stop firewalld.service 執行停止運行防火墻命令
    systemctl disable firewalld.service 禁止防火墻自啟動
    

    防火墻的開啟和自啟動命令:

    1、啟動:

    systemctl start firewalld.service
    

    2、防火墻隨系統開啟啟動 :

    systemctl enable firewalld.service
    
  3. 報錯:

    touch: cannot touch ‘/var/jenkins_home/copy_reference_file.log’: Permission denied
    Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?
    

    需要修改下目錄權限, 因為當映射本地數據卷時,/home/docker/jenkins目錄的擁有者為root用戶,而容器中jenkins user的uid為1000

    sudo chown -R 1000:1000 /dockerworkspace/jenkins
    
  4. 8080端口是jenkins的端口,5000端口是master和slave通信端口

  5. jenkin調用docker沒有權限時

    chmod 666 /var/run/docker.sock
    
  6. clock of the subversion server appears to be out of sync. This can result in inconsistent check out behavior.
    svn url末尾添加@HEAD

安裝Maven

  1. 下載

    wget http://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
    
  2. 解壓

    tar xf /tmp/apache-maven-*.tar.gz -C /opt
    
  3. 設置環境變量(此處采用的dockerhub的jenkins,所以可以省略)

    nano /etc/profile.d/maven.sh
    

    粘貼以下代碼:

    export JAVA_HOME=/usr/lib/jvm/java-1.8-openjdk
    
    export MAVEN_HOME=/usr/opt/maven
    
    export PATH=${MAVEN_HOME}/bin:${PATH}
    

    為了更好地控制 Maven 版本和更新,我們將 創建一個符號鏈接 maven ,該鏈接指向 Maven 安裝目錄:

    ln -s /opt/apache-maven-3.6.3 /opt/maven
    

    通過運行以下 chmod 命令使腳本可執行

    chmod +x /etc/profile.d/maven.sh
    

    使用以下 source 命令加載環境變量:

    source /etc/profile.d/maven.sh
    
  4. 構建Maven多模塊項目

    配置一個maven風格的項目 然后在配置

    root pom 指向的是最頂級的pom.xml

    mvn clean install -pl ETECSA-SERVER/ETECSA-SERVER-EUREKA -am -amd -Dmaven.test.skip=true
    

    這樣就單獨構建ETECSA-SERVER-EUREKA這個jar,相關依賴也會構建好,不用將依賴提前放入maven倉庫

    根據資料已知:

    參數 全稱 釋義 說明
    -pl --projects Build specified reactor projects instead of all projects 選項后可跟隨{groupId}:{artifactId}或者所選模塊的相對路徑(多個模塊以逗號分隔)
    -am --also-make If project list is specified, also build projects required by the list 表示同時處理選定模塊所依賴的模塊
    - amd --also-make-dependents If project list is specified, also build projects that depend on projects on the list 表示同時處理依賴選定模塊的模塊
    -N --Non-recursive Build projects without recursive 表示不遞歸子模塊
    -rf --resume-from Resume reactor from specified project 表示從指定模塊開始繼續處理

Ps:

permission denied異常

解決方法:

將jenkins用戶加入docker組,重啟Jenkins服務

sudo gpasswd -a jenkins docker
sudo systemctl jenkins restart

搭建私有鏡像倉庫Harbor

  1. 下載

    wget -P /workspace/harbor/     https://github.com/vmware/harbor/releases/download/v1.10.2/harbor-online-installer-v1.10.2.tgz
    
  2. 解壓

    tar zxf harbor-online-installer-v1.10.2.tgz
    
  3. 修改配置文件,配置文件為:harbor.yml

  4. 進入harbor目錄下,運行腳本

    ./install.sh
    
  5. 安裝docker-compose

     #國內鏡像   
     curl -L "https://get.daocloud.io/docker/compose/releases/download/v1.25.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    
  6. 給docker-compose執行權限,運行命令:

    chmod +x /usr/local/bin/docker-compose
    
  7. 測試上傳和下載鏡像,修改各docker client配置

    nano /etc/docker/daemon.json
    
    "insecure-registries":["10.1.20.16:9002"]
    

Ps:docker 官方私有倉庫鏡像register

docker pull registry
 docker run -d -v /opt/registry:/var/lib/registry -p 9001:5000 --restart=always --name registry registry:latest

Jenkins Pipe腳本示例(拉取svn代碼build image push到鏡像倉庫)

def getHost(ip){
   def remote = [:]
    remote.name = 'server-${ip}'
    remote.host = ip
    remote.port = 22
    remote.allowAnyHosts = true
    withCredentials([usernamePassword(credentialsId: '31ed3f9c-3e80-496d-9733-98b78db29128', passwordVariable: 'password', usernameVariable: 'userName')]) {
        remote.user = "${userName}"
        remote.password = "${password}"
    }
    return remote
}

def imageName="10.1.20.16:9002/hn/demo:v1.0.0"
def prjName="demo"

pipeline {
    agent any
    
    environment{
        def server = ''
    }   

    stages {
        stage('init-server'){
            steps {
                script {                 
                   server = getHost("1.10.80.2")                                   
                }
            }
        }
        
        stage('Build') {
         steps {
               echo '拉取代碼'
               checkout([$class: 'SubversionSCM', additionalCredentials: [], excludedCommitMessages: '', excludedRegions: '', excludedRevprop: '', excludedUsers: '', filterChangelog: false, ignoreDirPropChanges: false, includedRegions: '', locations: [[cancelProcessOnExternalsFail: true, credentialsId: '2d3c4a0b-1bba-4690-b208-3a511fc4f415', depthOption: 'infinity', ignoreExternalsOption: true, local: '.', remote: 'svn://10.1.80.111/ETECSA-SERVER']], quietOperation: true, workspaceUpdater: [$class: 'UpdateUpdater']])
               withMaven(maven: 'maven', mavenSettingsConfig: '3f3f6844-0644-48a3-8c4f-cef8f4e75196') {
                   sh label: '', script: 'mvn clean install -pl ETECSA-SERVER-EUREKA -amd -Dmaven.test.skip=true'
                }
            }
        }

        stage('DockerBuild') {
            steps {
                dir ("ETECSA-SERVER-EUREKA/") {
                    script {
                        def image = docker.build("hn/demo:v1.0.0")
                            docker.withRegistry("http://10.1.20.16:9002", '67bbae3e-a0da-4c30-9357-eec4a146cc2e'){
                            image.push()
                        }  
                    }
                }
            }
        }
        
        stage('use'){
            steps {
                script {
                  sshCommand remote: server, command: """
                    if [ \$(docker ps -a | grep -i $imageName | wc -l) -eq 1 ]; then 
                        sudo docker stop $prjName 
                        sudo docker rm -v -f $prjName
                    fi 
                    if [ \$(docker images | grep -i $imageName | wc -l) -eq 1 ]; then
                        sudo docker rmi -f $imageName
                    else 
                        sudo docker run -p 8761:8761 --name $prjName -d $imageName
                    fi
                """
                }
            }
        }
        
       stage('clean') {
            steps{
               sh label: '', script: '''          
               docker rmi -f hn/demo:v1.0.0
               docker rmi -f 10.1.20.16:9002/hn/demo:v1.0.0'''
            }
            
        }
    }
}

jenkins build日志如下

jenkin-build.png

其他手動部署方式

  1. docker-compose部署服務

有三種方式:webEditor,上傳docker-compose文件,git倉庫獲取docker-compose

portainer-stack.png

點擊部署


portainer-stack-deploy.png
  1. docker容器部署
portainer-containers.png
  1. 命令行部署
  docker run -p 8761:8761 --name demo -d 10.1.20.16:9002/hn/demo:v1.0.0

虛擬機IP 變動解決方法

進入到/etc/sysconfig/network-scripts

目錄下面ls后有個文檔(我的是ifcfg-ens33) ifcfg-eno16777736(不同機器后面數字會不相同),編輯該文件內容,將BOOTPROTO=dhcp的值改為static

并在最后面加上:

DNS1=114.114.114.114 --dns地址

IPADDR=192.168.49.128 --需要設置的ip地址

NETMASK=255.255.255.0 --子網掩碼

GATEWAY=192.168.49.1 --網關

nmcli c reload
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,117評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,860評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 177,128評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,291評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,025評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,421評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,477評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,642評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,177評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,970評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,157評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,717評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,410評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,821評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,053評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,896評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,157評論 2 375