基於 Jenkins+Docker+Git 的CI流程初探

来源:https://www.cnblogs.com/kaye/archive/2019/03/21/10567043.html
-Advertisement-
Play Games

在如今的互聯網時代,隨著軟體開發複雜度的不斷提高,軟體開發和發佈管理也越來越重要。目前已經形成一套標準的流程,最重要的組成部分就是持續集成(Continuous Integration,CI)及持續部署、交付(CD)。在此,我們來以一個案例初步瞭解 CI 流程。那麼什麼是 CI 呢?簡單來講,CI ...


在如今的互聯網時代,隨著軟體開發複雜度的不斷提高,軟體開發和發佈管理也越來越重要。目前已經形成一套標準的流程,最重要的組成部分就是持續集成(Continuous Integration,CI)及持續部署、交付(CD)。在此,我們來以一個案例初步瞭解 CI 流程。那麼什麼是 CI 呢?簡單來講,CI 就是將傳統的代碼合併、構建、部署、測試都集成在一起,不斷地執行這個過程,並對結果進行反饋。

CI 流程設計圖:

工作流程:

1. 開發人員提交代碼到Git版本倉庫;
2. Jenkins人工/定時觸發項目構建;
3. Jenkins拉取代碼、代碼編碼、打包鏡像、推送到鏡像倉庫;
4. Jenkins在Docker主機創建容器併發布

主機環境規劃:

docker-jenkins:    10.0.0.98

docker-git-harbor:10.0.0.99

1. 部署Git代碼版本倉庫

 安裝:

[root@docker-git-harbor ~]# yum install git -y

配置git用戶:

[root@docker-git-harbor ~]# useradd git
[root@docker-git-harbor ~]# passwd git

創建庫:

[git@docker-git-harbor ~]$ mkdir tomcat-java-demo.git
[git@docker-git-harbor ~]$ cd tomcat-java-demo.git/
[git@docker-git-harbor tomcat-java-demo.git]$ git --bare init
Initialized empty Git repository in /home/git/tomcat-java-demo.git/
[git@docker-git-harbor tomcat-java-demo.git]$ ls
branches  config  description  HEAD  hooks  info  objects  refs
[git@docker-git-harbor tomcat-java-demo.git]$

另一臺docker-jenkins訪問該倉庫:

[root@docker-jenkins ~]# git clone [email protected]:/home/git/tomcat-java-demo.git
Cloning into 'solo'...
The authenticity of host '10.0.0.99 (10.0.0.99)' can't be established.
ECDSA key fingerprint is SHA256:XNWQhGsAsqd84k/6OYV3xl1+mPGjtASsxeV1YVLZVas.
ECDSA key fingerprint is MD5:b4:bd:16:2b:de:e7:7c:fd:c5:dd:91:75:20:ff:3e:0a.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.0.0.99' (ECDSA) to the list of known hosts.
[email protected]'s password: 
warning: You appear to have cloned an empty repository.
[root@docker-jenkins ~]# ls
anaconda-ks.cfg  tomcat-java-demo.git
[root@docker-jenkins ~]# ls tomcat-java-demo.git
[root@docker-jenkins ~]# 

 模擬生產項目,拉取github上的一個demo,並上傳至本地git庫

[root@docker-jenkins ~]# mv tomcat-java-demo tomcat-java-demo.bak
[root@docker-jenkins ~]# git clone https://github.com/dingkai163/tomcat-java-demo.git
[root@docker-jenkins tomcat-java-demo]# cat .git/config 
[core]
	repositoryformatversion = 0
	filemode = true
	bare = false
	logallrefupdates = true
[remote "origin"]
	url = [email protected]:/home/git/tomcat-java-demo.git  # 修改為本地的git庫地址
	fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
	remote = origin
	merge = refs/heads/master
[root@docker-jenkins tomcat-java-demo]# git add .
[root@docker-jenkins tomcat-java-demo]# git status
# On branch master
nothing to commit, working directory clean
[root@docker-jenkins tomcat-java-demo]# git commit -m "all"
# On branch master
nothing to commit, working directory clean
[root@docker-jenkins tomcat-java-demo]# git push origin master
[email protected]'s password: 
Counting objects: 229, done.
Compressing objects: 100% (185/185), done.
Writing objects: 100% (229/229), 4.52 MiB | 0 bytes/s, done.
Total 229 (delta 25), reused 229 (delta 25)
To [email protected]:/home/git/tomcat-java-demo.git
 * [new branch]      master -> master
[root@docker-jenkins tomcat-java-demo]#

2. jenkins環境部署 

部署jdk環境及maven

[root@docker-jenkins ~]# mkdir tools
[root@docker-jenkins ~]# cd tools
[root@docker-jenkins tools]# rz -y
[root@docker-jenkins tools]# tar zxvf jdk-8u45-linux-x64.tar.gz
[root@docker-jenkins tools]# mv jdk1.8.0_45 /usr/local/jdk
[root@docker-jenkins tools]# vim /etc/profile
JAVA_HOME=/usr/local/jdk  
PATH=$PATH:$JAVA_HOME/bin  CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar  
export JAVA_HOME PATH CLASSPATH
[root@docker-jenkins tools]# source /etc/profile
[root@docker-jenkins tools]# java -version
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)

[root@docker-jenkins tools]# tar zxf apache-maven-3.5.0-bin.tar.gz 
[root@docker-jenkins tools]# mv apache-maven-3.5.0 /usr/local/maven

在10.0.0.98主機安裝Jenkins,下載Tomcat二進位包將war包到webapps下即可:

[root@docker-jenkins tools]# wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war
[root@docker-jenkins tools]# wget http://mirrors.shu.edu.cn/apache/tomcat/tomcat-8/v8.5.38/bin/apache-tomcat-8.5.38.tar.gz
[root@docker-jenkins tools]# tar zxf apache-tomcat-8.5.38.tar.gz 
[root@docker-jenkins tools]# ls
apache-tomcat-8.5.38  apache-tomcat-8.5.38.tar.gz  jdk-8u45-linux-x64.tar.gz  jenkins.war
[root@docker-jenkins tools]# mv apache-tomcat-8.5.38 /usr/local/tomcat-jenkins
[root@docker-jenkins tools]# ls /usr/local/tomcat-jenkins/webapps/
docs  examples  host-manager  manager  ROOT
[root@docker-jenkins tools]# rm -rf /usr/local/tomcat-jenkins/webapps/*
[root@docker-jenkins tools]# mv jenkins.war /usr/local/tomcat-jenkins/webapps/ROOT.war
[root@docker-jenkins tools]# ll /usr/local/tomcat-jenkins/webapps/
total 75520
-rw-r--r--. 1 root root 77330344 Mar 15 00:55 ROOT.war
[root@docker-jenkins tools]# cd /usr/local/tomcat-jenkins/bin/
[root@docker-jenkins bin]# ./startup.sh 
Using CATALINA_BASE:   /usr/local/tomcat-jenkins
Using CATALINA_HOME:   /usr/local/tomcat-jenkins
Using CATALINA_TMPDIR: /usr/local/tomcat-jenkins/temp
Using JRE_HOME:        /usr/local/jdk1.8
Using CLASSPATH:       /usr/local/tomcat-jenkins/bin/bootstrap.jar:/usr/local/tomcat-jenkins/bin/tomcat-juli.jar
Tomcat started.
[root@docker-jenkins bin]#

啟動後,瀏覽器訪問http://10.0.0.98:8080/,按提示輸入密碼,登錄即可。

3. 部署私有鏡像倉庫

企業級harbor鏡像倉庫部署:

https://www.cnblogs.com/kaye/p/10524391.html

構建Tomcat基礎鏡像,並推送到harbor鏡像庫:

[root@docker-git-harbor ~]# cd tomcat
[root@docker-git-harbor tomcat]# cat Dockerfile-tomcat
FROM centos:7
MAINTAINER www.cnblogs.com/kaye/

ENV VERSION=8.5.38

RUN yum install java-1.8.0-openjdk wget curl unzip iproute net-tools -y && \
    yum clean all && \ 
    rm -rf /var/cache/yum/*
RUN wget http://mirrors.shu.edu.cn/apache/tomcat/tomcat-8/v${VERSION}/bin/apachetomcat-${VERSION}.tar.gz && \
    tar zxf apache-tomcat-${VERSION}.tar.gz && \
    mv apache-tomcat-${VERSION} /usr/local/tomcat && \
    rm -rf apache-tomcat-${VERSION}.tar.gz /usr/local/tomcat/webapps/* && \
    mkdir /usr/local/tomcat/webapps/test && \
    echo "ok" > /usr/local/tomcat/webapps/test/status.html && \
    sed -i '1a JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom"' /usr/local/tomcat/bin/catalina.sh && \
    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

ENV PATH $PATH:/usr/local/tomcat/bin

EXPOSE 8080
CMD ["catalina.sh", "run"]
[root@docker-git-harbor tomcat]# docker build -t tomcat:v1 -f Dockerfile-tomcat .
[root@docker-git-harbor tomcat]# docker tag tomcat:v1 reg.dingkai.com/library/tomcat:v1
[root@docker-git-harbor tomcat]# docker login reg.dingkai.com
[root@docker-git-harbor tomcat]# docker push reg.dingkai.com/library/tomcat:v1

4. Jenkins安裝必要插件

由於jenkins是離線安裝,所有在此需要配置一下插件下載地址:系統管理-->插件管理-->Advanced

修改下方地址,將https修改為http 再點Submit

Submit後點擊Available,Check now此時我們可以看到很多可獲得插件

首先搜索並安裝Pipeline插件
pipeline 是一套運行於jenkins上的工作流框架,將原本獨立運行於單個或者多個節點的任務連接起來,實現單個任務難以完成的複雜流程編排與
可視化。

 

再安裝SCM to job 插件,同上步驟(搜索,安裝)。

 5. 項目創建

創建jobs

 

選擇流水線類型

 

到這裡我們就開始配置Pipeline script,點擊Pipeline語法,來自動生成我們需要的配置。

如下圖,我們Git方式,配置Git倉庫地址,再添加認證相關。

這裡我們使用的是秘鑰認證方式,需要將jenkins上生成的公鑰發送到git伺服器上,然後將jenkins上的生成的私鑰內容粘貼到下圖Key中,這樣jenkins就可以免交互的拉取git倉庫中的代碼了。

[root@docker-jenkins bin]# ssh-keygen 
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:1vD8XM3lDYFmrxgAbwPTLwb0fl+oEx8cFgtykpg4ODI root@docker-jenkins
The key's randomart image is:
+---[RSA 2048]----+
|   . o==o.o ...  |
|E o o +=++ .+o . |
| o . . .*o o+.. .|
|       oo*oo o.=o|
|       .S.*o+.o =|
|       . ..B.+   |
|          o =    |
|           .     |
|                 |
+----[SHA256]-----+
[root@docker-jenkins bin]# cd
[root@docker-jenkins ~]# 
[root@docker-jenkins ~]# 
[root@docker-jenkins ~]# ls .ssh/
id_rsa  id_rsa.pub  known_hosts
[root@docker-jenkins ~]# ssh-copy-id [email protected]
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
[email protected]'s password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh '[email protected]'"
and check to make sure that only the key(s) you wanted were added.

[root@docker-jenkins ~]#

 

 

配置完成後,我們就可以生成Pipeline腳本了。點擊下方Generate Pipeline Script,然後複製方框內的內容。

編寫我們所需要的Pipeline腳本如下,將其粘貼到script的拉取代碼模塊中,並修改分支master為${branch},其他模塊內容自行編寫。

node { 
   // 拉取代碼
   stage('Git Checkout') { 
       checkout([$class: 'GitSCM', branches: [[name: '${branch}']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'c42214eb-db1e-49fb-83c9-f78d1f4310a2', url: '[email protected]:/home/git/tomcat-java-demo.git']]])
   }
   // 代碼編譯
   stage('Maven Build') {
        sh '''
        export JAVA_HOME=/usr/local/jdk
        /usr/local/maven/bin/mvn clean package -Dmaven.test.skip=true
        '''
   }
   // 項目打包到鏡像並推送到鏡像倉庫
   stage('Build and Push Image') {
sh '''
REPOSITORY=reg.dingkai.com/library/tomcat-java-demo:${branch}
cat > Dockerfile << EOF
FROM reg.dingkai.com/library/tomcat:v1 
MAINTAINER kai
RUN rm -rf /usr/local/tomcat/webapps/*
ADD target/*.war /usr/local/tomcat/webapps/ROOT.war
EOF
docker build -t $REPOSITORY .
docker login reg.dingkai.com -u admin -p 123456
docker push $REPOSITORY
'''
   }
   // 部署到Docker主機
   stage('Deploy to Docker') {
        sh '''
        REPOSITORY=reg.dingkai.com/library/tomcat-java-demo:${branch}
        docker rm -f tomcat-java-demo |true
        docker pull $REPOSITORY
        docker container run -d --name tomcat-java-demo -p 88:8080 $REPOSITORY
        '''
   }
}

在Pipeline腳本裡面我們指定了一個branch參數,所以我們需要傳遞一個參數變數,這裡我們選擇參數化構建,預設值為master分支。

然後保存配置。

6. 開始構建任務

回到主界面,我們開始構建任務

可以通過Console Output輸出查看jenkins構建流程

成功構建會提示: SUCCESS

我們也可以查看構建成功後的圖形構建過程

通過瀏覽器來訪問tomcat-java-demo項目:http://10.0.0.98:88/

可以看到可以正常訪問,至此基於 Jenkins+Docker+Git 的CI流程已經成功部署了。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 博主裝Ubuntu18.04主要是為了用於跑深度學習,所以我們先來搞搞gcc環境 第一步:安裝多版本gcc、g++可切換 切換版本命令 根據自己想要的環境選擇 第二步:準備安裝顯卡驅動和cuda8.0等相關文件 最新cuda8.0 及其補丁 cuda_8.0.61.2_linux.run cuda_ ...
  • Linux Rsyslog日誌集中管理 一、Rsyslog簡介 ryslog 是一個快速處理收集系統日誌的程式,提供了高性能、安全功能和模塊化設計。rsyslog 是syslog 的升級版,它將多種來源輸入輸出轉換結果到目的地。 Rsyslog的傳輸方式有三種: UDP 傳輸協議 基於傳統UDP協議 ...
  • 電源 心臟,單個伺服器核心業務用雙電源,雙路(AB),集群除外。熱插拔主板 板卡介面CPU 大腦 ,運算控制Intel、AMD 。一般企業伺服器2-4顆,單顆4核。記憶體16-256G(常見32,64G),做虛擬化的宿主機,CPU4-8顆,記憶體一般48-128G,6-8個虛擬機CPU風扇 散熱BIOS... ...
  • 一、Ansible介紹 簡介 Ansible使用Python語言開發,是一個配置管理型工具,與之類似的工具還有Puppet、SaltStack、chef等,預設通過SSH協議進行遠程命令執行或下發配置,無需部署任何客戶端代理軟體,可同時支持多台主機進行管理,Ansible是基於模塊工作的,本身沒有批 ...
  • 剛開始接觸Linux,記一下可視化桌面(方便各種操作)搭建方法,持續更新 ...
  • Red Hat Enterprise Linux 7 (RHEL 7) 是第一個支持從前一個 RHEL 主發行版本(RHEL 6)進行原位(in-place)升級的 RHEL 主版本。原位升級(in-place upgrade)提供了通過覆蓋已存在的操作系統來把系統升級到一個新的主 RHEL 版本的 ...
  • 開玩笑的啦,沒有LFCR這種沙雕東西 為什麼突然想起來寫這個呢,是因為先前照著shell畫llehs的時候,總報錯,改正了以後又因為看不見而在上一篇博客上沒有寫明,所以過來好好寫一寫咯。 可以看出報錯裡面出了各種稀奇古怪的東東:無法識別#!bin/sh以及覺得每一行代碼後面都多了\r 故事開始於上古 ...
  • Windows系統是一個消息驅動的OS,什麼是消息呢?下麵從不同的幾個方面講解一下。 1、消息的組成:一個消息由一個消息名稱(UINT),和兩個參數(WPARAM,LPARAM)。當用戶進行了輸入或是視窗的狀態發生改變時系統都會發送消息到某一個視窗。例如當菜單轉中之後會有WM_COMMAND消息發送 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...