基於Docker構建企業級jenkins CI/CD平臺

在現在的互聯網時代,隨着軟件開發複雜度的不斷提升,軟件開發和發佈管理也愈來愈重要。目前已經造成一套標準的流程,最重要的組成部分就是持續集成(Continuous Integration,CI)及持續部署、交付(CD)。在此,咱們來以一個案例初步瞭解 CI 流程。那麼什麼是 CI 呢?簡單來說,CI 就是將傳統的代碼合併、構建、部署、測試都集成在一塊兒,不斷地執行這個過程,並對結果進行反饋。
CI 流程設計圖:
基於Docker構建企業級jenkins CI/CD平臺
工做流程:html

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

服務器規劃:
IP地址 角色
192.168.30.21 Jenkins,Docker,JDK,Maven
192.168.30.22 Harbor(Docker,docker-compose),Gitjava

1. 部署Git代碼版本倉庫
git是一個系統,可是沒有守護進程,可讓ssh做爲通訊node

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

更改用戶 git 的密碼 。
新的 密碼:
無效的密碼: 密碼是一個迴文
從新輸入新的 密碼:
passwd:全部的身份驗證令牌已經成功更新。mysql

而後經過這個Git遠程操做這個倉庫,通常git裏面都加個.gitlinux

[root@harbor-git ~]# su - git
[git@harbor-git ~]$ mkdir demo.git

初始化這個git倉庫,搭建完成git

[git@harbor-git ~]$ cd demo.git/
[git@harbor-git demo.git]$ git --bare init

初始化空的 Git 版本庫於 /home/git/demo.git/github

如今開始使用,git能夠當成客戶端,也能夠當成服務端來用
[root@jenkins ~]# yum install git -yweb

Jenkins主機測試訪問該倉庫:sql

[root@jenkins ~]# git clone git@192.168.30.22:/home/git/demo.git
正克隆到 'demo'...
git@192.168.30.22's password:

warning: 您彷佛克隆了一個空版本庫。docker

 模擬生產項目,拉取github上的一個demo,並上傳至本地git庫
這裏我是一個java的測試項目,而後演示一下
進入咱們拉代碼空倉庫裏,把咱們的項目拷貝進去

[root@jenkins ~]#  git clone https://github.com/xxx/tomcat-java-demo.git

[root@jenkins ~]# cd demo/
[root@jenkins demo]# cp ../tomcat-java-demo/* ./ -rf
[root@jenkins demo]# ls
db  Dockerfile  LICENSE  pom.xml  README.md  src

提交分爲三步
提交到咱們的暫存區
[root@jenkins demo]# git add .
從暫存區提交到咱們的本地倉庫,本地也是一個倉庫
[root@jenkins demo]# git commit -m 'all'
這裏可能會報錯

[root@jenkins tomcat-java-demo]#  git commit -m "all"

*** Please tell me who you are.

Run

  git config --global user.email "you@example.com"
  git config --global user.name "Your Name"

to set your account's default identity.
Omit --global to set the identity only in this repository.

fatal: unable to auto-detect email address (got 'root@jenkins.(none)')

解決方案:須要添加郵件和name,在.git的隱藏文件下的config文件內,添加如下配置

[root@jenkins demo]# cd .git/
[root@jenkins .git]# ls
branches  config  description  HEAD  hooks  index  info  objects  refs
[root@jenkins .git]# vim config
[user]
        name = zhaocheng
    email = 1741845455@qq.com
[root@jenkins .git]# git config user.name "zhaocheng"
這裏在demo下執行,否則找不到相應指令
[root@jenkins demo]# git commit -m "all"

執行成功

推送到遠程master分支裏面

[root@jenkins demo]# git push origin master
git@192.168.30.22's password: 
Counting objects: 179, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (166/166), done.
Writing objects: 100% (179/179), 1.12 MiB | 0 bytes/s, done.
Total 179 (delta 4), reused 0 (delta 0)
To git@192.168.30.22:/home/git/demo.git
 * [new branch]      master -> master

2.在全部主機安裝docker
Docker版本
社區版:CE 企業通常用
企業版:EE 通常研究docker的公司用
官方網址:https://docs.docker.com
yum安裝

$ sudo yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2

添加Docker軟件包源

$ sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

安裝Docker-ce

$ sudo yum install docker-ce
啓動Docker
$ sudo systemctl start docker

二進制安裝docker,離線https://download.docker.com/linux/static/stable/x86_64/
這裏也能夠不用官方的docker-ce源,用阿里雲的也能夠,阿里的速度快一些
阿里雲源:http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
建議使用daocloud的加速器
該腳本能夠將 --registry-mirror 加入到你的 Docker 配置文件 /etc/docker/daemon.json 中

curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io

配置完重啓docker 
$ sudo systemctl restart docker

3.部署Harbor私有倉庫
下載好harbor上傳咱們的根目錄,下載地址Harbor官方下載
https://github.com/goharbor/harbor

[root@harbor-mysql ~]# ls
harbor-offline-installer-v1.8.1.tgz

部署下載安裝docker-compose
Docker-compose文檔地址https://docs.docker.com/compose/install/

[root@harbor-mysql ~]# curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
[root@harbor-mysql ~]# chmod +x /usr/local/bin/docker-compose
[root@harbor-mysql ~]# docker-compose --version
docker-compose version 1.24.1, build 4667896b

部署Harbor服務

[root@harbor-mysql ~]# tar xf harbor-offline-installer-v1.8.1.tgz -C /usr/local
[root@harbor-mysql ~]# cd /usr/local/harbor/
[root@harbor-mysql harbor]# ls
harbor.v1.8.1.tar.gz  harbor.yml  install.sh  LICENSE  prepare
[root@harbor-mysql harbor]# vim harbor.cfg
修改配置文件yml,修改安裝的ip地址
Hostname : 192.168.30.24:80

啓動並安裝Harbor
配置完成後就能夠啓動Harbor了
[root@harbor-git harbor]# ./install.sh
訪問本機

經過Dockerfile部署java鏡像並推送鏡像倉庫

這裏構建的時候須要注意版本問題,每次官方更新就會更改tomcat的版本,構建鏡像的時候寫dockerfile須要注意

[root@localhost Dockerfile]# vim Dockerfile-tomcat 
FROM centos:7
MAINTAINER www.xxx.com

ENV VERSION=8.5.43

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://mirror.bit.edu.cn/apache/tomcat/tomcat-8/v${VERSION}/bin/apache-tomcat-${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

WORKDIR /usr/local/tomcat

EXPOSE 8080
CMD ["catalina.sh", "run"]

[root@localhost Dockerfile]# docker build -t tomcat:v1 -f Dockerfile-tomcat .
[root@jenkins Dockerfile]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
tomcat              v1                  727bd5f299ba        4 seconds ago       427MB
centos              7                   67fa590cfc1c        30 hours ago        202MB

jenkins主機配置對harbor倉庫的信任,由於是http配置

[root@jenkins ~]# vim /etc/docker/daemon.json 
{
        "registry-mirrors": ["http://f1361db2.m.daocloud.io"],
        "insecure-registries": ["192.168.30.22"]
}
[root@jenkins ~]# systemctl restart docker
[root@jenkins ~]# docker login 192.168.30.22
Username: admin
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

推送tomcat鏡像到咱們的harbor倉庫上

[root@jenkins ~]# docker tag tomcat:v1 192.168.30.22/library/tomcat:v1
[root@jenkins ~]# docker push 192.168.30.22/library/tomcat:v1

基於Docker構建企業級jenkins CI/CD平臺
4.jenkins環境部署
去官方網站下載war包,下載tomcat和maven包和jdk
https://jenkins.io/zh/

[root@jenkins ~]# ls
demo      jenkins.war      apache-maven-3.6.1-bin.tar.gz  Dockerfile   tomcat-java-demo  apache-tomcat-9.0.22.tar.gz 
[root@jenkins ~]# tar xf apache-tomcat-9.0.22.tar.gz 
[root@jenkins ~]# mv apache-tomcat-9.0.22 /usr/local/tomcat_jenkins
[root@jenkins ~]# cd /usr/local/tomcat_jenkins/

刪除不用的配置

[root@jenkins tomcat_jenkins]# cd webapps/
[root@jenkins webapps]# rm -rf *
[root@jenkins webapps]# unzip /root/jenkins.war -d ROOT

解壓並啓動jenkins

[root@jenkins ~]# tar xf apache-maven-3.6.1-bin.tar.gz 
[root@jenkins ~]# tar xf jdk-8u191-linux-x64.tar.gz 
[root@jenkins ~]# mv jdk1.8.0_191/ /usr/local/jdk
[root@jenkins ~]# mv apache-maven-3.6.1 /usr/local/maven
[root@jenkins ~]# vim /etc/profile
JAVA_HOME=/usr/local/jdk
PATH=$PATH:$JAVA_HOME/bin:/usr/local/maven/bin
export JAVA_HOME PATH
[root@jenkins ~]# source /etc/profile
[root@jenkins ~]# java -version
openjdk version "1.8.0_161"
OpenJDK Runtime Environment (build 1.8.0_161-b14)
OpenJDK 64-Bit Server VM (build 25.161-b14, mixed mode)
[root@jenkins ~]# mvn
mvn       mvnDebug  mvnyjp   
[root@jenkins ~]# cd /usr/local/tomcat_jenkins/bin/
[root@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/jdk/bin
Using CLASSPATH:       /usr/local/tomcat_jenkins/bin/bootstrap.jar:/usr/local/tomcat_jenkins/bin/tomcat-juli.jar
Tomcat started.

訪問jenkins,默認本機8080端口,登陸查看咱們的密碼進行登陸

[root@jenkins ~]# cat .jenkins/secrets/initialAdminPassword
2691cf7fb7824a2e8015b2b546319b03

基於Docker構建企業級jenkins CI/CD平臺
5. Jenkins流水線部署

pipeline 是一套運行於jenkins上的工做流框架,將本來獨立運行於單個或者多個節點的任務鏈接起來,實現單個任務難以完成的複雜流程編排與可視化。
建立一個pipeline類型的Job:

基於Docker構建企業級jenkins CI/CD平臺
安裝所需插件git,pipeline
基於Docker構建企業級jenkins CI/CD平臺
基於Docker構建企業級jenkins CI/CD平臺
基於Docker構建企業級jenkins CI/CD平臺
6.經過流水線發佈java項目
經過pipeline/jeninsfile流水線腳本,經過文本文件來描述生命週期
整個pipeline裏面通過各個階段,以最清晰的描述來造成咱們最終達成的效果
安裝jenkins pipeline插件
基於Docker構建企業級jenkins CI/CD平臺
Pipeline先最簡單的語法進行演示流水線的發佈
基於Docker構建企業級jenkins CI/CD平臺
基於Docker構建企業級jenkins CI/CD平臺

構建以後查看控制檯
基於Docker構建企業級jenkins CI/CD平臺
基於Docker構建企業級jenkins CI/CD平臺
基於Docker構建企業級jenkins CI/CD平臺
這個腳本也能夠本身生成,須要加上認證寫個地址認證信息就能夠了,這裏的pileline是模版,咱們能夠拿這個模版再去修改咱們的pipeline
基於Docker構建企業級jenkins CI/CD平臺
地址就是咱們這個分支,添加進去

[root@jenkins demo]# cat .git/config 
[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[user]
    name = zhaocheng
    email = 1741845455@qq.com
[remote "origin"]
    url = git@192.168.30.22:/home/git/demo.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master

基於Docker構建企業級jenkins CI/CD平臺
由於咱們這裏是須要認證的用戶名Git和密碼去認證的,拉代碼和推代碼都是須要寫代碼的
咱們這裏還須要添加個憑據,通常都是基於祕鑰對對作認證的,也就是咱們經過ssh生成
一個公鑰和私鑰,將公鑰放到git服務器上,私鑰本身拿着,用私鑰去認證,這樣就不用密碼了,由於jenkins是自動化,不可能人工去輸入密碼

[root@jenkins ~]# ssh-keygen

Id_rsa是私鑰,id_rsa.pub是公鑰
[root@jenkins ~]# ls .ssh/
id_rsa  id_rsa.pub  known_hosts

如今咱們將公鑰推送到Git服務器上,拿這個祕鑰來作免祕鑰登陸
[root@jenkins ~]# ssh-copy-id git@192.168.30.22

這樣就能夠免交互登陸git這臺服務器上了,由於咱們拉代碼就是使用的這個帳戶,只要有這個私鑰就不須要輸密碼了

[root@jenkins ~]# cat .ssh/id_rsa
-----BEGIN RSA PRIVATE KEY-----
.......

將私鑰密碼保存到git上,放到下面這個位置
基於Docker構建企業級jenkins CI/CD平臺
基於Docker構建企業級jenkins CI/CD平臺
基於Docker構建企業級jenkins CI/CD平臺
基於Docker構建企業級jenkins CI/CD平臺
把咱們的pipeline生成的拉取代碼的信息替換成咱們剛纔生成的

checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '1d00c1d2-6b5a-4e53-8925-144aacdc289d', url: 'git@192.168.30.22:/home/git/demo.git']]])

參數化構建branch是一個變量名,而後傳入到pipeline腳本里,pilnline調用這個變量名
交互的傳入的值,默認是master分支
基於Docker構建企業級jenkins CI/CD平臺
寫一個pipeline腳本,把這個腳本傳入到咱們的pipeline中

[root@localhost ~]# ll pipeline.sh 
-rw-r--r--. 1 root root 1311 8月  16 14:11 pipeline.sh
[root@localhost ~]# cat pipeline.sh 
node { 
   // 拉取代碼
   stage('Git Checkout') { 
        checkout([$class: 'GitSCM', branches: [[name: '${branch}']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '1d00c1d2-6b5a-4e53-8925-144aacdc289d', url: 'git@192.168.30.22:/home/git/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=192.168.30.22/library/tomcat-java-demo:${branch}
cat > Dockerfile << EOF
FROM 192.168.30.22/library/tomcat:v1
LABEL maintainer zhaocheng
RUN rm -rf /usr/local/tomcat/webapps/*
ADD target/*.war /usr/local/tomcat/webapps/ROOT.war
EOF
docker build -t $REPOSITORY .
docker login 192.168.30.22 -u admin -p Harbor12345
docker push $REPOSITORY
'''
   }
   // 部署到Docker主機
   stage('Deploy to Docker') {
        sh '''
        REPOSITORY=192.168.30.22/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
        '''
   }

基於Docker構建企業級jenkins CI/CD平臺
而後點build with parameters

能夠看到多出來一個,這裏就是一我的工交互的打哪一個分支,爲哪一個分支打個鏡像,而後在部署測試,通常master分支就是主分支,通常用於生產環境的,固然也有些開發分支,還有其餘一些子分支,根據你的分支來選擇,能夠動態的能夠幫你打這個
基於Docker構建企業級jenkins CI/CD平臺
基於Docker構建企業級jenkins CI/CD平臺
基於Docker構建企業級jenkins CI/CD平臺
查看項目鏡像已經上傳到咱們的harbor上

基於Docker構建企業級jenkins CI/CD平臺
查看容器項目已經運行

[root@jenkins ~]# docker ps
CONTAINER ID        IMAGE                                           COMMAND             CREATED             STATUS              PORTS                  NAMES
b4de68438b80        192.168.30.22/library/tomcat-java-demo:master   "catalina.sh run"   4 minutes ago       Up 4 minutes        0.0.0.0:88->8080/tcp   tomcat-java-demo

訪問容器暴露的端口,本機的88端口
基於Docker構建企業級jenkins CI/CD平臺
項目完成,趕快挑一個美女回家吧!!!
優秀博主阿良博客:https://blog.51cto.com/lizhenliang

相關文章
相關標籤/搜索