Docker Gitlab+Jenkins+Harbor構(gòu)建持久化平臺(tái)操作
CI/CD概述
CI工作流程設(shè)計(jì)
Git 代碼版本管理系統(tǒng) 只能命令行去管理git
Gitlab 基于git做了圖形管理頁面,企業(yè)使用gitlab做私有的代碼管理倉庫
Github 公共代碼管理倉庫
搭建gitlab
搭建gitlab先創(chuàng)建工作目錄,因?yàn)橛行?shù)據(jù)需要持久化
[root@www ~]# mkdir -p /gitlab [root@www ~]# cd /gitlab/ docker run -d \ --name gitlab \ -p 8443:443 \ -p 9999:80 \ -p 9998:22 \ -v /gitlab/config:/etc/gitlab \ -v /gitlab/logs:/var/log/gitlab \ -v /gitlab/data:/var/opt/gitlab \ -v /etc/localtime:/etc/localtime \ --restart=always \ lizhenliang/gitlab-ce-zh:latest
9999是web端口 8443web htpps端口 9998 ssh端口
將容器化的數(shù)據(jù)持久化到本地宿主機(jī),這個(gè)鏡像是早期漢化后構(gòu)建的,默認(rèn)官方的鏡像是英文的,這個(gè)是英文的,這個(gè)鏡像比較大差不多1G,包括數(shù)據(jù)庫和消息隊(duì)列,里面封裝的內(nèi)容很多。
[root@www gitlab]# docker logs 3396d5ccc518 - execute /opt/gitlab/bin/gitlab-ctl start postgresql +psql_host='/var/opt/gitlab/postgresql'
通過日志可以查看到有哪些組件如postgresql
初次訪問的時(shí)候可能有點(diǎn)慢,因?yàn)榻M件較多,可能要等待3-5分鐘
出現(xiàn)這個(gè)頁面說明gitlab服務(wù)是啟動(dòng)起來了,可能里面其他組件還沒啟動(dòng)成功。這里最好給到物理內(nèi)存4G,如果只有2G是不能正常啟動(dòng)的,差不多八分鐘之后如下所示
用戶名默認(rèn)是root這里需要設(shè)置新密碼,新密碼最少8位可以設(shè)置為qwerasdf,然后更新完密碼就可以使用root用戶名 密碼qwerasdf去登入
創(chuàng)建一個(gè)私有項(xiàng)目java-demo
推送代碼到j(luò)ava-demo倉庫
在另外一臺(tái)機(jī)器上安裝git,將項(xiàng)目的源碼包上傳
[root@localhost ~]# yum install git -y
[root@localhost ~]# unzip tomcat-java-demo-master.zip
初始化Git目錄
[root@localhost ~]# cd tomcat-java-demo-master [root@localhost tomcat-java-demo-master]# git init Initialized empty Git repository in /root/tomcat-java-demo-master/.git/
這個(gè)git目錄就會(huì)配置git相關(guān)的一些數(shù)據(jù),初始化完成以后
[root@localhost tomcat-java-demo-master]# cd .git/ [root@localhost .git]# ls branches config description HEAD hooks info objects refs
配置git的配置文件
這條命令是將gitlab的地址寫到.git/config配置文件當(dāng)中
[root@localhost tomcat-java-demo-master]# git remote add origin http://192.168.179.100:9999/root/java-demo.git [root@localhost tomcat-java-demo-master]# cat .git/config 可以看到gitlab地址寫進(jìn)去了,待會(huì)去提交代碼都會(huì)去讀取該配置文件 [core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true [remote "origin"] url = http://192.168.179.100:9999/root/java-demo.git fetch = +refs/heads/*:refs/remotes/origin/*
這個(gè).代表所有,將當(dāng)前代碼目錄提交到暫存區(qū)
[root@localhost tomcat-java-demo-master]# git add . [root@localhost tomcat-java-demo-master]# ls db Dockerfile LICENSE pom.xml README.md src
提交到當(dāng)前git倉庫里面,因?yàn)楸旧砥渚褪且粋€(gè)git倉庫了(本地也是一個(gè)git倉庫)
[root@localhost tomcat-java-demo-master]# git commit -m 'all'
推送到遠(yuǎn)程倉庫,這個(gè)就會(huì)讀取之前的配置文件了
[root@localhost tomcat-java-demo-master]# git push origin master Username for 'http://192.168.179.100:9999': root Password for 'http://root@192.168.179.100:9999': Counting objects: 179, done. 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://192.168.179.100:9999/root/java-demo.git * [new branch] master -> master
部署jenkins
[root@localhost jenkins]# ls apache-maven-3.5.0-bin.tar.gz jdk-8u45-linux-x64.tar.gz [root@localhost jenkins]# tar xf apache-maven-3.5.0-bin.tar.gz;tar xf jdk-8u45-linux-x64.tar.gz [root@localhost jenkins]# mv jdk1.8.0_45 /usr/local/jdk [root@localhost jenkins]# mv apache-maven-3.5.0 /usr/local/maven
這兩個(gè)工具包的作用是讓jenkins去用,jenkins是用容器部署的,所以宿主機(jī)上面的兩個(gè)環(huán)境就可以掛載進(jìn)去。要將maven jdk掛載進(jìn)去。
因?yàn)橐趈enkins里面去做鏡像的構(gòu)建,要使用docker build,所以這里有docker in docker,即在jenkins里面再構(gòu)建docker,這里不需要研究如何在容器里面再安裝docker??梢灾苯訉⑺拗鳈C(jī)的命令和socket直接掛載進(jìn)去就可以直接在容器里面使用docker命令。
-v是將jenkins的數(shù)據(jù)持久化到目錄下,jenkins官方將jenkins產(chǎn)生的數(shù)據(jù)文件都放在
/var/jenkins_home
目錄下面,所以只需要將這個(gè)目錄進(jìn)行持久化就行,即使jenkins容器被刪除了,那么數(shù)據(jù)還是可以恢復(fù)過來。
使用的鏡像就是最新版,長期維護(hù)的鏡像
docker run -d --name jenkins -p 80:8080 -p 50000:50000 -u root \ -v /opt/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 [root@localhost jenkins]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 566d2ec85fe0 jenkins/jenkins "/sbin/tini -- /usr/…" 3 minutes ago Up 3 minutes 0.0.0.0:50000->50000/tcp, 0.0.0.0:80->8080/tcp jenkins
5000端口是master slave端口
[root@localhost jenkins]# docker logs 566d2ec85fe0 查看日志
點(diǎn)擊選擇插件安裝,這里選擇無不安裝插件,先安裝jenkins以后插件需要什么就安裝什么
Jenkins pipeline概念
• Jenkins Pipeline是一套插件,支持在Jenkins中實(shí)現(xiàn)集成和持續(xù)交付管道;
• Pipeline通過特定語法對簡單到復(fù)雜的傳輸管道進(jìn)行建模;
• 聲明式:遵循與Groovy相同語法。pipeline { }
• 腳本式:支持Groovy大部分功能,也是非常表達(dá)和靈活的工具。node { }
• Jenkins Pipeline的定義被寫入一個(gè)文本文件,稱為Jenkinsfile
先要安裝pipeline插件然后寫文本,對pipeline去建模,現(xiàn)在主要使用聲明式語法,文本文件長什么樣
在這個(gè)文件當(dāng)中告訴jenkins要做什么事情,在一個(gè)大的stage里面分為了很多小的stage,通過這種流水線的形式分好了這幾個(gè)階段,在這幾個(gè)stage組成了pipeline的流水線。按照從上到下的順序執(zhí)行,直到執(zhí)行完成。
pipeLine寫法大致是下面這些流程
Pipeline實(shí)現(xiàn)之后有一個(gè)案板
這個(gè)案板根據(jù)pipeline的每個(gè)步驟會(huì)輸出每個(gè)步驟案板。如消耗了多長時(shí)間和日志。這樣容易定位問題方便查看。
Jenkins pipeline插件的安裝和pipeline使用
在安裝插件的時(shí)候會(huì)很慢,如何提速?Jenkins下載插件的時(shí)候是有一些源的,可以修改位國內(nèi)的源,在插件高級(jí)里面修改其實(shí)是沒有用的
[root@localhost jenkins]# cd /opt/jenkins_home/ [root@localhost jenkins_home]# ls config.xml nodeMonitors.xml copy_reference_file.log nodes hudson.model.UpdateCenter.xml plugins identity.key.enc secret.key jenkins.install.InstallUtil.lastExecVersion secret.key.not-so-secret jenkins.install.UpgradeWizard.state secrets jenkins.model.JenkinsLocationConfiguration.xml updates jenkins.telemetry.Correlator.xml userContent jobs users logs war [root@localhost jenkins_home]# cd updates/ [root@localhost updates]# pwd /opt/jenkins_home/updates [root@localhost updates]# ls
default.json 這里其實(shí)寫了插件的源 hudson.tasks.Maven.MavenInstaller 使用sed進(jìn)行修改
sed -i 's/http:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json && \
sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json
修改為清華源,然后重啟生效
[root@localhost updates]# docker restart jenkins
jenkins
把git和pipeline都安裝上,有個(gè)別安裝失敗可以,只要核心主鍵安裝好就行
替換插件源之后安裝插件明顯變快了,可以看到新建項(xiàng)目多了流水線的選擇,這里選擇流水線構(gòu)建
pipeline { agent any stages { stage('1.拉取拉取代碼') { steps { echo '拉取代碼' } } stage('2.代碼代碼代碼編譯') { steps { echo '編譯' } } stage('3.代碼部署') { steps { echo '部署' } } } }
可以看到看板
這里是控制臺(tái)輸出,也可以指定從某個(gè)階段運(yùn)行構(gòu)建
下面使用pipeline來完成流程設(shè)計(jì)
從git拉取代碼,構(gòu)建鏡像。推送到harbor再部署到docker當(dāng)中。這個(gè)腳本可以復(fù)用
#!/usr/bin/env groovy def registry = "reg.harbor.com" def project = "welcome" def app_name = "demo" def image_name = "${registry}/${project}/${app_name}:${Branch}-${BUILD_NUMBER}" def git_address = "http://192.168.179.100:9999/root/java-demo.git" def docker_registry_auth = "c91491d9-91cd-4248-96c8-fc8cc00f7db4" def git_auth = "86ebc99d-d3fc-4e6e-b938-db1f5a1f3642" pipeline { agent any stages { stage('拉取代碼'){ steps { checkout([$class: 'GitSCM', branches: [[name: '${Branch}']], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_address}"]]]) } } stage('代碼編譯'){ steps { sh """ JAVA_HOME=/usr/local/jdk PATH=$JAVA_HOME/bin:/usr/local/maven/bin:$PATH mvn clean package -Dmaven.test.skip=true """ } } stage('構(gòu)建鏡像'){ steps { withCredentials([usernamePassword(credentialsId: "${docker_registry_auth}", passwordVariable: 'password', usernameVariable: 'username')]) { sh """ echo ' FROM ${registry}/library/tomcat:v1 LABEL maitainer lizhenliang 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 """ docker rm -f tomcat-java-demo |true docker container run -d --name tomcat-java-demo -p 88:8080 ${image_name} """ } } } }
可以看到這里要你輸入分支
參數(shù)化構(gòu)建,變量的名稱可以在shell腳本或者pipeline當(dāng)中去引用
steps { echo '${Branch}' }
創(chuàng)建harbor的憑據(jù),即使用jenkin要訪問docker harbor倉庫需要知道用戶名和密碼
可以看到這里多了一個(gè)憑據(jù) c91491d9-91cd-4248-96c8-fc8cc00f7db4,pipeline腳本當(dāng)中就定義了憑據(jù)def docker_registry_auth = "c91491d9-91cd-4248-96c8-fc8cc00f7db4" 這是jenkins的憑據(jù)
還需要插件git憑據(jù) 86ebc99d-d3fc-4e6e-b938-db1f5a1f3642 在pipeline里面定義def git_auth = "86ebc99d-d3fc-4e6e-b938-db1f5a1f3642"
Pipeline有些語句可以自動(dòng)生成,比如生成拉從取代碼
知道pipeline大概的框架 套進(jìn)去就行
checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '86ebc99d-d3fc-4e6e-b938-db1f5a1f3642', url: 'http://192.168.179.100:9999/root/java-demo.git']]])
拉取編譯好之后的war包放到環(huán)境鏡像里面
現(xiàn)在配置maven的源
Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-war-plugin/3.1.0/maven-war-plugin-3.1.0.jar (91 kB at 5.3 kB/s)
Downloading: https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-web/2.0.1.RELEASE/spring-boot-starter-web-2.0.1.RELEASE.pom
在后臺(tái)輸出可以看到這些東西,在編譯構(gòu)建的時(shí)候maven的源是默認(rèn)的網(wǎng)絡(luò)比較慢,現(xiàn)在要修改源確保拉取速度快一些宿主機(jī)上修改,這里面定義了從那個(gè)源拉取相應(yīng)的依賴包
[root@localhost ~]# vim /usr/local/maven/conf/settings.xml <mirror> <id>central</id> <mirrorOf>central</mirrorOf> <name>aliyun maven</name> <url>https://maven.aliyun.com/repository/public</url> </mirror>
修改完之后不需要重啟容器直重新構(gòu)建,可以看到構(gòu)建出來的包
[root@localhost ~]# ls /opt/jenkins_home/workspace/test-pipeline/target/ classes generated-sources ly-simple-tomcat-0.0.1-SNAPSHOT ly-simple-tomcat-0.0.1-SNAPSHOT.war maven-archiver maven-status
Job存放的是數(shù)據(jù)源信息
[root@localhost ~]# ls /opt/jenkins_home/jobs/
test test-pipeline
如果需要在其他dcker主機(jī)上部署可以使用ssh插件的ssh命令或者使用ansible別的機(jī)器上啟動(dòng)執(zhí)行docker命令創(chuàng)建容器
題外話
提供了如果你的harbor提供了Https認(rèn)證,那么請?jiān)谀愕膉enkins這臺(tái)主機(jī)將證書拷貝到相應(yīng)的目錄下面。確保jenkins主機(jī)能夠登入進(jìn)docker harbor倉庫
[root@localhost ~]# mkdir -p /etc/docker/certs.d/reg.harbor.com [root@localhost ~]# ls anaconda-ks.cfg reg.harbor.com.pem [root@localhost ~]# cp reg.harbor.com.pem /etc/docker/certs.d/reg.harbor.com/reg.harbor.com.crt [root@localhost ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.179.102 reg.harbor.com [root@localhost ~]# docker login reg.harbor.com Authenticating with existing credentials... 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
以上這篇Docker Gitlab+Jenkins+Harbor構(gòu)建持久化平臺(tái)操作就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持本站。
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。