Jenkins+harbor+docker的CICD

1、 實驗環境

192.168.0.18  git /harbor

192.168.0.19 jenkins

192.168.0.20 docker


2、harbor 環境搭建

2.1 安裝docker-ce(三臺服務器都安裝上)

yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
rm -rf /var/lib/docker/*

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

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

yum install docker-ce docker-ce-cli containerd.io

systemctl start docker

2.2 安裝docker-compose

curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose

docker-compose --version

2.3 安裝harbor

wget   https://github.com/vmware/harbor/releases/download/v1.2.0/harbor-offline-installer-v1.2.0.tgz

# cd /usr/local/src/ 
# tar zxf harbor-online-installer-v1.2.0.tgz  -C /usr/local/ 
# cd /usr/local/harbor/

2.4 修改配置文件

# vim /usr/local/harbor/harbor.cfg

hostname = 192.168.0.131   #可以是自己的harbor域名,也可以是本機的IP
harbor_admin_password = Harbor12345  #harbor登陸密碼


2.5 安裝harbor

# ./preper.sh
# ./install.sh

2.6 注意事項

需要注意的是關於adminserver容器一直重啓的問題:

harbor.cfg 配置中secretkey_path = /data 不要修改目錄,如果修改了目錄,需要chown 10000:10000 /mydir/secretkey

另外需要添加daemon.json

{"insecure-registries": ["http://192.168.0.18"]}

3 git部署

3.1 部署

yum install -y git

useradd git

passwd git

su - git

mkdir solo.git  #創建一個solo項目目錄

cd solo.git

git --bare init


3.2 模擬提交代碼


(因爲無代碼,用git客戶端從github上拉取solo代碼,git客戶端安裝在其他服務器,實驗在jenkins服務器上)

git clone  https://github.com/b3log/solo.git


#在/mdata目錄下拉取git服務的空代碼,讓git客戶端連上git服務器
[root@localhost mdata]# git clone [email protected]:/home/git/solo.git
warning: 您似乎克隆了一個空版本庫。

#將網上下載的solo源碼拷貝到空版本庫
[root@localhost mdata]# cp -r /root/solo/* ./solo/
[root@localhost solo]# ls
CHANGE_LOGS.html  Dockerfile  gulpfile.js  LICENSE  package.json  package-lock.json  pom.xml  README.md  scripts  src

#推送代碼到git服務器
[root@localhost mdata]# cd solo/
[root@localhost solo]# git add .
[root@localhost solo]# git commit -m "all"  //提交到本地倉庫
[root@localhost solo]# git push origin master  //推送到代碼倉庫
[email protected]'s password: 
Counting objects: 668, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (653/653), done.
Writing objects: 100% (668/668), 5.17 MiB | 8.78 MiB/s, done.
Total 668 (delta 236), reused 0 (delta 0)
To [email protected]:/home/git/solo.git
 * [new branch]      master -> master



4 jenkins部署

JDK環境(jenkins,docker,git都配下jdk,JDK配置略)

4.1 jenkins Dockerfile

FROM jenkins/jenkins:2.134
USER root
RUN echo "" > /etc/apt/sources.list.d/jessie-backports.list && \
    echo "deb http://mirrors.aliyun.com/debian/ stretch main non-free contrib" > /etc/apt/sources.list && \
    echo "deb-src http://mirrors.aliyun.com/debian/ stretch main non-free contrib" >> /etc/apt/sources.list && \
    echo "deb http://mirrors.aliyun.com/debian-security stretch/updates main " >> /etc/apt/sources.list && \
    echo "deb-src http://mirrors.aliyun.com/debian-security stretch/updates main " >> /etc/apt/sources.list && \
    echo "deb http://mirrors.aliyun.com/debian/ stretch-updates main non-free contrib" >> /etc/apt/sources.list && \
    echo "deb-src http://mirrors.aliyun.com/debian/ stretch-updates main non-free contrib" >> /etc/apt/sources.list && \
    echo "deb http://mirrors.aliyun.com/debian/ stretch-backports main non-free contrib" >> /etc/apt/sources.list && \
    echo "deb-src http://mirrors.aliyun.com/debian/ stretch-backports main non-free contrib" >> /etc/apt/sources.list 
RUN apt-get update && apt-get install -y git libltdl-dev


4.2 運行jenkins

[root@localhost jenkins]# cat docker-compose.yml 
version: "3"
services:
    jenkins:
        image: jenkins:v1
        restart: always
        container_name: jenkins
        ports:
           - 8080:8080
        volumes:
          - ./jenkins_home:/var/jenkins_home
          - /usr/local/apache-maven-3.6.1:/usr/local/maven
          - /usr/local/jdk8:/usr/local/jdk
          - /var/run/docker.sock:/var/run/docker.sock
          - /usr/bin/docker:/usr/bin/docker
          - /usr/local/bin/docker-compose:/usr/bin/docker-compose
          - ~/.ssh:/root/.ssh   
[root@localhost jenkins]# docker-compose up -d


4.3 jenkins需要從git拉取代碼,實現免交互拉取代碼

[root@localhost jenkins]# ssh-keygen
[root@localhost jenkins]# ssh-copy-id [email protected]

#測試免交互
[root@localhost jenkins]# git clone [email protected]:/home/git/solo.git
正克隆到 'solo'...
remote: Counting objects: 668, done.
remote: Compressing objects: 100% (417/417), done.
remote: Total 668 (delta 236), reused 668 (delta 236)
接收對象中: 100% (668/668), 5.17 MiB | 0 bytes/s, done.
處理 delta 中: 100% (236/236), done


4.4 安裝jenkins

http://192.168.0.19:8080/

[root@localhost jenkins]# cat jenkins_home/secrets/initialAdminPassword
c183ca7d1efc46c29a5ee80a5253ef99


jenkins插件安裝不了的解決方法:

拷貝已經安裝好的jenkins環境中plugins裏的所有插件(打包整個目錄),到jenkins_home/plugins/下,重啓jenkins

https://mirrors.tuna.tsinghua.edu.cn/jenkins/plugins/   插件下載地址,也可以手動上傳插件(插件管理配置=》高級=》上傳文件)

4.5 配置jenkins基礎配置

clipboard.png

配置jdk的位置

clipboard.png

配置maven的位置

clipboard.png

配置git位置

clipboard.png

jenkins系統配置配置ssh

clipboard.png

爲jenkins添加一個全局憑證


clipboard.png

clipboard.png

clipboard.png

系統配置

clipboard.png

安裝maven插件

clipboard.png

5 構建項目


5.1 創建一個maven構建的solo項目

clipboard.png


構建觸發器,採用淪陷方式,格式類似linux的計劃任務,分時日月周

clipboard.png


clipboard.png

clean package -Dmaven.test.skip=true



構建後的shell,製作dockerfile,上傳鏡像

clipboard.png

cd $WORKSPACE
cat > Dockerfile <<EOF
FROM 192.168.0.18/test/tomcat:v1
RUN rm -rf /usr/local/tomcat/webapps/*
COPY target/solo.war /usr/local/tomcat/webapps/solo.war
ENTRYPOINT ["./bin/catalina.sh", "run"]
EOF

cat > dockerbuild.sh << EOF
VERSION=\$(date +%F)
docker build -t 192.168.0.18/test/solo:\$VERSION .
docker login -u cmn -p Harbor12345 192.168.0.18
docker push 192.168.0.18/test/solo:\$VERSION
EOF

sh dockerbuild.sh


ssh 遠端(docker服務器上)執行腳本

clipboard.png

cat >solo.sh << EOF
docker rm -f solo
VER=`date +%F`
docker rmi -f  192.168.0.18/test/solo:\$VER
docker login -u cmn -p Harbor12345 192.168.0.18
docker run -d --name solo -p 88:8080 192.168.0.18/test/solo:\$VER
EOF

sh solo.sh


需要注意現在版本的solo源碼裏需要添加皮膚到skins目錄下,並且需要設置mysql配置文件,皮膚在github的solo項目裏下載,Mysql配置在源碼的local.properties中


5.2  構建cid項目

項目說明,項目爲公司自己的項目,雖然爲java項目,由於公司給到的是一個war包,可以當作一個普通的php項目,不需要再次maven構建

# 1)在git 倉庫服務器創建cid.git目錄,並初始化
[root@localhost solo.git]# su - git
[git@localhost ~]$ mkdir cid.git
[git@localhost ~]$ cd cid.git/
[git@localhost cid.git]$ git --bare init

# 2)在git客戶端創建一個cid項目目錄,並初始化,指定git倉庫地址
[root@localhost mdata]# mkdir cid
[root@localhost mdata]# cd cid/
[root@localhost cid]# git init
[root@localhost cid]# git remote add origin [email protected]:/home/git/cid.git

3)上傳項目包,並提交,打tag
[root@localhost cid]# ls
cid.war
[root@localhost cid]# git add .
[root@localhost cid]# git commit -m "v1"
[root@localhost cid]# git tag v1.0
[root@localhost cid]# git push origin v1.0


pipeline構建CID項目

需要注意的是,這種方式構建的鏡像在jenkins服務器上,適用於jenkins的master-slave模式,

node 後指定需要構建的主機

其中git_checkout錯誤,不能拉取代碼版本,可以先重新打一個tag提交代碼


項目中設置了參數化構建

clipboard.png


流水線腳本


node {
    // 拉取代碼
   stage('git_checkout') { 
    checkout([$class: 'GitSCM', branches: [[name: '$Tag']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[url: '[email protected]:/home/git/cid.git']]])   
   }
   stage('Build and push image') {
sh '''
REPOSITORY=192.168.0.18/test/cid:${Tag}
cat >config.txt<< EOF
192.168.0.20:2181
EOF
cat >cid <<EOF
123456
EOF
cat > Dockerfile << EOF
FROM 192.168.0.18/test/tomcat:v1
RUN  rm -rf /usr/local/tomcat/webapps/*  &&\
     mkdir /usr/share/JFConfig/
COPY *.war /usr/local/tomcat/webapps/
COPY cid /usr/share/JFConfig/cid
COPY config.txt /usr/share/JFConfig
EOF
docker build -t $REPOSITORY .
docker login -u cmn -p Harbor12345 192.168.0.18
docker push $REPOSITORY
'''
   }
   stage('Deploy to docker') {
sh '''
REPOSITORY=192.168.0.18/test/cid:${Tag}
docker rm -f jf-cid |true
docker rmi -f $REPOSITORY |true
docker login -u cmn -p Harbor12345 192.168.0.18
docker pull $REPOSITORY
cat > docker-compose.yml <<EOF
version: "3"
services:
  jf-cid:
    image: 192.168.0.18/test/cid:${Tag}
    restart: always
    container_name: jf-cid
#   mem_limit: 1g #內存限制
#   cpus: 1
    privileged: true
    restart: always
    ports:
      - 12120:8080
    environment:
      - TZ=Asia/Shanghai
    volumes:
      - ./logs:/usr/local/tomcat/logs
EOF
    
docker-compose up -d 
'''
  }
}


自由風格構建cid項目

clipboard.png

clipboard.pngclipboard.png

clipboard.png

cd $WORKSPACE
cat > Dockerfile <<EOF
FROM 192.168.0.18/test/tomcat:v1
RUN rm -rf /usr/local/tomcat/webapps/* 
COPY *.war /usr/local/tomcat/webapps/
ENTRYPOINT ["./bin/catalina.sh", "run"]
EOF
docker build -t 192.168.0.18/test/cid:${Tag} .
docker login -u cmn -p Harbor12345 192.168.0.18
docker push 192.168.0.18/test/cid:${Tag}


ssh 遠端(docker服務器上)執行腳本


docker rm -f jf-cid
docker rmi -f  192.168.0.18/test/cid:${Tag}
docker login -u cmn -p Harbor12345 192.168.0.18
REPOSITORY=192.168.0.18/test/cid:${Tag}
cat > docker-compose.yml <<EOF
version: "3"
services:
jf-cid:
image: 192.168.0.18/test/cid:${Tag}
restart: always
container_name: jf-cid
#   mem_limit: 1g #內存限制
#   cpus: 1
privileged: true
restart: always
ports:
- 12120:8080
environment:
- TZ=Asia/Shanghai
volumes:
- ./logs:/usr/local/tomcat/logs
- ./config.txt:/usr/share/JFConfig/config.txt
- ./cid:/usr/share/JFConfig/cid
EOF
echo "192.168.0.20:2181" > config.txt
echo "123456" > cid
docker-compose up -d

構建

clipboard.png

構建過程中出現的構建失敗情況參考控制檯輸出做出相應的調整


6 實驗結果

QQ圖片20190729111203.pngspacer.gifQQ截圖20190729111437.png

QQ圖片20190729111218.png鳴謝:李振良老師

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章