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
[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基礎配置
配置jdk的位置
配置maven的位置
配置git位置
jenkins系統配置配置ssh
爲jenkins添加一個全局憑證
系統配置
安裝maven插件
5 構建項目
5.1 創建一個maven構建的solo項目
構建觸發器,採用淪陷方式,格式類似linux的計劃任務,分時日月周
clean package -Dmaven.test.skip=true
構建後的shell,製作dockerfile,上傳鏡像
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服務器上)執行腳本
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提交代碼
項目中設置了參數化構建
流水線腳本
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項目
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
構建
構建過程中出現的構建失敗情況參考控制檯輸出做出相應的調整
6 實驗結果
鳴謝:李振良老師