1. 程式人生 > 其它 >基於 Docker 構建企業 Jenkins CI平臺

基於 Docker 構建企業 Jenkins CI平臺

1、CI/CD概述

持續整合(Continuous Integration,CI):程式碼合併、構建、部署、測試都在一起,不斷地執行這個過程,並對結果反饋。 持續部署(Continuous Deployment,CD):部署到測試環境、預生產環境、生產環境。 持續交付(Continuous Delivery,CD):將最終產品釋出到生產環境,給使用者使用。

2、CI工作流程設計

3、環境部署

環境規劃

IP 主機名 服務
10.3.104.52 docker01 docker,JDK,Maven,Jenkins
10.3.104.56 docker02 Gitlab,docker,docker-compose,Harbor

3.1 部署Gitlab服務

[root@docker02 ~]# mkdir -p /data/gitlab
[root@docker02 ~]# cd /data/gitlab
[root@docker02 ~]# docker run -d \
  --name gitlab \
  -p 8443:443 \
  -p 9999:80 \
  -p 9998:22 \
  -v $PWD/config:/etc/gitlab \
  -v $PWD/logs:/var/log/gitlab \
  -v $PWD/data:/var/opt/gitlab \
  -v /etc/localtime:/etc/localtime \
  
--restart=always \ wuxinchun/gitlab-ce-zh:latest

3.2 Gitlab地址訪問:http://IP:9999

初次會先設定管理員密碼 ,然後登陸,預設管理員使用者名稱root,密碼就是剛設定的

3.3建立專案,提交測試程式碼

1)建立一個java-demo專案

2)先將自己倉庫專案程式碼拉下來,因為沒有內容,所以提示是空的

[root@docker02 data]# yum -y install git
[root@docker02 data]# git clone http://10.3.104.56:9999/root/java-demo.git
Cloning into 'java-demo'... Username for 'http://10.3.104.56:9999': root Password for 'http://[email protected]:9999': warning: You appear to have cloned an empty repository. [root@docker02 data]# cd java-demo

3)進入到java-demo目錄,將程式碼拷貝到當前目錄,提交到自己的gitlab倉庫裡邊
將tomcat-java-demo-master.zip上傳並解壓到/data/java-demo目錄

[root@docker02 java-demo]# ll
total 24
drwxr-x--- 2 root root    34 Aug  5  2019 db
-rw-r----- 1 root root   148 Aug  5  2019 Dockerfile
-rw-r----- 1 root root 11357 Aug  5  2019 LICENSE
-rw-r----- 1 root root  1930 Aug  5  2019 pom.xml
-rw-r----- 1 root root   270 Aug  5  2019 README.md
drwxr-x--- 3 root root    18 Aug  5  2019 src

4)先提交到暫存區

[root@docker02 java-demo]# git add . 
[root@docker02 java-demo]# git commit -m 'wxc'

*** Please tell me who you are.

Run

  git config --global user.email "[email protected]"
  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@docker02.(none)')

解決方案:(設定下使用者名稱和email再次提交即可) [root@docker02 java
-demo]# git config --global user.name "wuxinchun" [root@docker02 java-demo]# git config --global user.email "[email protected]" [root@docker02 java-demo]# git commit -m 'wxc'

5)提交到遠端倉庫master分支

[root@docker02 java-demo]# git push origin master
Username for 'http://10.3.104.56:9999': root
Password for 'http://[email protected]:9999': 
\Counting objects: 179, done.
Delta compression using up to 4 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)
remote: Resolving deltas: 100% (4/4), done.
To http://10.3.104.56:9999/root/java-demo.git
 * [new branch]      master -> master

6)Gitlab測試上傳成功

3.4、Http方式部署Harbor

1)安裝docker-compose

Harbor 在部署和使用時需要藉助 Docker 的單機編排工具 Docker compose

將docker-compose-Linux-x86_64上傳至/usr/bin

[root@docker01 ~]# mv docker-compose-Linux-x86_64 docker-compose

[root@docker01 ~]# chmod +x docker-compose

2)離線部署Http Harbor

[root@docker01 ~]# tar -zxvf harbor-offline-installer-v2.0.0.tgz
[root@docker01 ~]# cd harbor
[root@docker01 harbor]# cp harbor.yml.tmpl harbor.yml
[root@docker01 harbor]#vi harbor.yml
#本地IP或域名均可(如果為域名請在hosts檔案加解析)
hostname: reg.wuxc.com

# 本次為Http部署,故先註釋https相關配置
# https related config
# https:
# https port for harbor, default is 443
# port: 443
# The path of cert and key files for nginx

#Harbor初始密碼
harbor_admin_password: Harbor12345

[root@docker01 harbor]# ./prepare
[root@docker01 harbor]# ./install.sh
[root@docker01 harbor]# docker-compose ps 
      Name                     Command                  State                 Ports          
---------------------------------------------------------------------------------------------
harbor-core         /harbor/entrypoint.sh            Up (healthy)                            
harbor-db           /docker-entrypoint.sh            Up (healthy)   5432/tcp                 
harbor-jobservice   /harbor/entrypoint.sh            Up (healthy)                            
harbor-log          /bin/sh -c /usr/local/bin/ ...   Up (healthy)   127.0.0.1:1514->10514/tcp
harbor-portal       nginx -g daemon off;             Up (healthy)   8080/tcp                 
nginx               nginx -g daemon off;             Up (healthy)   0.0.0.0:80->8080/tcp     
redis               redis-server /etc/redis.conf     Up (healthy)   6379/tcp                 
registry            /home/harbor/entrypoint.sh       Up (healthy)   5000/tcp                 
registryctl         /home/harbor/start.sh            Up (healthy)  

注:上述所有容器均為Up(healthy)代表harbor服務啟動成功

3)配置http映象倉庫可信任

1.新增可信任(如果沒有daemon.json請新建一個)
[root@docker01 ~]# cat /etc/docker/daemon.json 
{

"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"],
"insecure-registries":["reg.wuxc.com"]   //因為是http部署需要將倉庫地址新增可信任

}

2.重啟docker服務使其生效
[root@docker01 ~]# systemctl restart docker

3.5 部署Jenkins

1) 準備JDK和Maven環境

將二進位制包上傳到伺服器並解壓到工作目錄,用於讓Jenkins容器掛載使用。

[root@docker01 ~]# tar zxvf jdk-8u45-linux-x64.tar.gz
[root@docker01 ~]# mv jdk1.8.0_45 /usr/local/jdk
[root@docker01 ~]# tar zxf apache-maven-3.5.0-bin.tar.gz
[root@docker01 ~]# mv apache-maven-3.5.0 /usr/local/maven

2)修改Maven源

[root@docker01 ~]# vim /usr/local/maven/conf/settings.xml<mirrors>

<mirror>     
  <id>central</id>     
  <mirrorOf>central</mirrorOf>     
  <name>aliyun maven</name>
  <url>https://maven.aliyun.com/repository/public</url>     
</mirror>

</mirrors>

3)建立jenkins容器

[root@docker01 ~]# docker run -d --name jenkins -p 81:8080 -p 50000:50000 -u root \
-v /data/jenkins_home:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/bin/docker:/usr/bin/docker \
-v /usr/local/maven:/usr/local/maven \
-v /usr/local/jdk:/usr/local/jdk \
-v /etc/localtime:/etc/localtime \
--restart=always \
--name jenkins jenkins/jenkins

4)訪問地址:http://IP:81

5) 選擇外掛來安裝

6)選擇“無”,後續根據實際情況選擇安裝

7)設定賬號密碼

8) 安裝外掛

管理Jenkins->系統配置-->管理外掛-->搜尋Localization: Chinese (Simplified),git/pipeline選中點選安裝

預設從國外網路下載外掛,會比較慢,建議修改國內源:

[root@docker01 ~]# cd /data/jenkins_home/updates
[root@docker01 updates]# sed -i 's/http:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json
[root@docker01 updates]# sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json
[root@docker01 updates]# docker restart jenkins

4、釋出測試

4.1 建立流水線專案並配置

1)建立流水線任務


2)This project is parameterized -> String Parameter

Name:Branch # 變數名,下面指令碼中呼叫

Default Value:master # 預設分支

Description:釋出的程式碼分支 # 描述

${BUILD_NUMBER} 這個變數是Jenkins自身記錄的版本號,作為映象的tag,保證其唯一性

3)【系統管理-憑據-系統-全域性憑證】建立haobor和gitlab憑證

注:上述倆憑證ID用於Pipeline指令碼中,docker_registry_auth 和git_auth變數的值

4.2 Pipeline指令碼

1)Pipline指令碼內容

#!/usr/bin/env groovy

def registry = "10.3.104.56"
def project = "dev"
def app_name = "java-demo"
def image_name = "${registry}/${project}/${app_name}:${Branch}-${BUILD_NUMBER}"
def git_address = "http://10.3.104.56:9999/root/java-demo.git"
def docker_registry_auth = "7cfb0855-fa74-4dfe-881f-fa1843d9e55b"
def git_auth = "55a1e164-037e-4605-8b24-ce7aa1664f15"

pipeline {
    agent any
    stages {
        stage('拉取程式碼'){
            steps {
              checkout([$class: 'GitSCM', branches: [[name: '${Branch}']], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_address}"]]])
            }
        }

        stage('程式碼編譯'){
           steps {
             sh """
                pwd
                ls
                JAVA_HOME=/usr/local/jdk
                PATH=$JAVA_HOME/bin:/usr/local/maven/bin:$PATH
                mvn clean package -Dmaven.test.skip=true
                """ 
           }
        }

        stage('構建映象'){
           steps {
                withCredentials([usernamePassword(credentialsId: "${docker_registry_auth}", passwordVariable: 'password', usernameVariable: 'username')]) {
                sh """
                  echo '
                    FROM ${registry}/library/tomcat:v1
                    LABEL maitainer wuxinchun
                    RUN rm -rf /usr/local/tomcat/webapps/*
                    ADD target/*.war /usr/local/tomcat/webapps/ROOT.war
                  ' > Dockerfile
                  docker build -t ${image_name} .
                  docker login -u ${username} -p '${password}' ${registry}
                  docker push ${image_name}
                """
                }
           } 
        }

        stage('部署到Docker'){
           steps {
              sh """
              REPOSITORY=${image_name}
              docker rm -f tomcat-java-demo |true
              docker container run -d --name tomcat-java-demo -p 88:8080 ${image_name}
              """
            }
        }
    }
}

2)任務構建測試

報錯一:因為dockerfile寫的是從harbor中拉取tomcat:v1映象失敗

解決方法:

1)可以上傳tomcat:v1映象到harbor指定專案下

2)修改dockerfile為:From tomcat:latest(預設從本地獲取)

報錯:二:推送映象失敗,是因為Harbor上沒有這個名為(dev)專案,

解決方法:

在Harbor上新建一個命名為dev,屬性為public即可

3) 再次構建

4)檢查本地映象和容器

[root@docker01 conf]# docker images
REPOSITORY                      TAG        IMAGE ID       CREATED          SIZE
10.3.104.56/dev/java-demo       master-4   cc901da59e29   2 minutes ago    686MB
[root@docker01 conf]# docker ps -a
CONTAINER ID   IMAGE                                COMMAND                  CREATED              STATUS                    PORTS                                            NAMES
74b38842d5a7   10.3.104.56/dev/java-demo:master-4   "catalina.sh run"        About a minute ago   Up About a minute         0.0.0.0:88->8080/tcp                             tomcat-java-demo

5)專案地址訪問IP:88

注:至此基於jenkins自動化構建完成

作者:傑巨集唯一 出處:http://www.cnblogs.com/wuxinchun/ 本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利.