基於Docker+Jenkins實現自動化部署


Jenkins是一個基於java開發的開源 CI&CD 軟件,用於自動化各種任務,包括構建、測試和部署軟件。

jenkins官網:https://jenkins.io

jenkins下載地址:https://jenkins.io/download/

 請檢測是否安裝docker,如果沒有安裝或想提速下載請走這里---->>> Linux Centos7(Mac) 安裝Docker教程

准備:

這里搭建測試整個流程的時候使用的是jenkins+gitee+springboot項目

1、登錄碼雲https://gitee.com/ 創建自己的代碼倉庫。

2、創建springboot項目上傳到倉庫。

一、下載Jenkins鏡像,安裝啟動

有個很殘酷的消息在docker的鏡像倉庫中Jenkins的官方鏡像停止維護了,並且推薦使用jenkins/jenkins:lts鏡像,所有我這里使用的是Jenkins社區提供維護的鏡像

 來吧~~~咱們下面就開始

1、創建docker掛在目錄,目的是將docker中Jenkins的持久化數據寫到本地,否則每次重啟jenkins都會重置

mkdir -p /root/jenkins

2、下載Jenkins鏡像,並啟動容器

這個過程可以分成兩步,也可以直接運行第二步,docker run 會先下載鏡像在構建容器並啟動容器:

第一步下載鏡像(點我查看需要鏡像)  

docker pull  jenkins/jenkins

執行docker run,

docker run -d --name jenkins -p 8080:8080 -p 50000:50000 -v /root/jenkins:/var/jenkins_home jenkins/jenkins

 參數詳情哈~~ 

-d :指定容器后台運行

--name:我給容器起個名字叫jenkins

-p: 端口映射格式(本地端口:容器端口),8080是訪問端口,50000用戶其他機器上設置了一個或多個基於JNLP的Jenkins代理程序鏈接使用,這個端口可以不要滴(-p 50000:50000參數可以去掉)

-v:物理卷映射,就是本地與容器共享磁盤,格式(本地目錄:容器目錄)

jenkins/jenkins  鏡像存儲名稱或者id

3、查看初始化秘鑰的兩種方式

第一、執行以下命令查看日志,這里有個重點,注意敲黑板了:日志中有個字符串入下圖,第一次登陸需要使用的秘鑰

 docker logs jenkins

第二、如果發現日志沒有哈哈哈,幸運眷顧你,不是第一次啟動吧,那你來這里呀~,看看圖片是不是跟日志上的一致,嘿嘿~

cat /root/jenkins/secrets/initialAdminPassword

 二、登錄初始化Jenkins

提示(可忽略):

加速初始化可以配置鏡像加速
1、切換目錄,
cd /root/jenkins 
2、修改hudson.model.UpdateCenter.xml文件
vim hudson.model.UpdateCenter.xml
3、將文件中的鏈接修改為(清華大學鏡像源)https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

1、訪問方式 http://127.0.0.1:8080 ,格式: http://IP或域名:端口,第一次進入初始化加載頁面稍慢3-8分鍾,需要大家注意下哈~,莫着急。

2、訪問之后會出現下面的頁面,將日志中的秘鑰復制進去點擊繼續

 3、點擊繼續后進入小等待、點擊一下安裝社區推薦插件(一下就好),哈哈哈~恭喜你進入一個漫長的等待,因為需要取社區下載插件並安裝,過程如下面的圖片。

 

4、經過漫長艱辛的等待我們迎來的曙光,來來咱們一起設置下第一位管理員的信息,設置好點擊保存完成

5、在實例配置中走默認即可,這也是啟動時候配置的地址。點擊保存並完成,就結束了

  

三、全局配置並應用項目 

 1、JDK配置

  如果獲取jenkins容器中的默認jdk安裝路徑:

  第一步、需要登錄jenkins

docker exec -it jenkins /bin/bash

  第二步、執行命令 

echo $JAVA_HOME

  第三步、獲取java環境安裝地址配置到全局配置的jdk部分

 

2、maven配置

 

3、ssh配置

  系統默認安裝docker容器位置  /var/jenkins_home/.ssh

   可以暫時跳過,看下面第四步創建應用下面的第二步源碼管理中添加git配置中的第一種方案ssh免密

4、插件安裝

  登錄jekins后菜單路徑為系統管理-系統配置-插件管理,可以查看

 

四、創建應用

1、首頁菜單中新建任務,輸入任務名稱,選擇風格確定即可

2、源碼管理中添加git配置

我們可以看到添加url的時候會出現沒有權限,這種情況我們有兩種方式解決,第一種ssh公鑰免密,第二種設置賬號密碼,不管第一種還是第二種都需要有項目的權限(比如開源或者賬號密碼)我用的是開源,gitlab另一種配法:jenkins連接gitlab,提示returned status code 128,附解決辦法

第一種ssh公鑰免密:先登錄jenkins的docker容器

docker exec -it jenkins /bin/bash

然后執行生成秘鑰並復制,可以直接執行下面命令,知其然來這里-->Linux 設置秘鑰登錄(SSH免密連接)

cd /var/jenkins_home/.ssh
ssh-keygen  -b 4096 -C niunafei0315@163.com
touch authorized_keys
cat id_rsa.pub >> authorized_keys 
cat authorized_keys 

使用cat命令獲取公鑰,復制添加到到碼雲公鑰管理中。

 

  第二種通過設置Credentials屬性。

因為我采用的是第一種,ssh免密方式下面是結果,

 3、這里部署使用的是腳本部署,先添加頂層maven,指定使用的版本輸入命令

# maven命令,輸入框的時候去掉mvn的命令
mvn clean install -Dmaven.test.skip=true

 遠程部署命令【Jenkins】遠程部署

 

 

 

 

 

 

 

 

 

 

 

 

狂踩大小坑

1、執行docker run 命令,爆出異常 touch: cannot touch '/var/jenkins_home/copy_reference_file.log': Permission denied

太坑了我選的是root目錄下,所以原因是映射文件的權限不足,那就給權限唄。

解決方式:

 chmod 777 /root/jenkins

 2、安裝jenkins時出現 No such plugin: cloudbees-folder的解決辦法

  1、打開鏈接“http://ftp.icm.edu.pl/packages/jenkins/plugins/cloudbees-folder/”,在最下面找到並打開“latest”目錄。

  2、將目錄中的“cloudbees-folder.hpi”下載下來后放在“jenkins安裝目錄\war\WEB-INF\detached-plugins”文件夾中。

    執行1、2步驟后刷新頁面仍然出現“ No such plugin: cloudbees-folder”錯誤,猜測這個“hpi”文件可能是項目啟動時候加載,是需要重啟jenkins服務才可以,因此執行:

  3、在“控制面板-管理工具-服務”中找到“jenkins”服務,重啟服務。docker 使用命令docker restart jenkins 

    再次打開jenkins的鏈接 http://localhost:8080/ 后已經可以正常安裝插件,問題解決。

      解決方案轉載於:https://www.cnblogs.com/changjianblog/p/10916098.html

  打包異常 https://www.cnblogs.com/sxdcgaq8080/p/10489326.html

 3、初始化完成顯示部分插件安裝失敗,

 

 

   方案:更換系統管理--插件管理--高級--升級站點 ,然后在已安裝查看異常插件,進行可選插件中搜索並直接安裝

  站點鏈接提供:

http://updates.jenkins.io/update-center.json

http://mirror.xmission.com/jenkins/updates/update-center.json

 

 4、jar中沒有主清單屬性【解決辦法】

  原因是maven-plugin中存在repackage需要排除掉

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <fork>true</fork>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <!--一定要設置成true.這樣才會用對應env目錄下的配置文件覆蓋原來的-->
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM