ci/cd概述
ci工作流程設計
git 代碼版本管理系統 只能命令行去管理git
gitlab 基于git做了圖形管理頁面,企業使用gitlab做私有的代碼管理倉庫
github 公共代碼管理倉庫
搭建gitlab
搭建gitlab先創建工作目錄,因為有些數據需要持久化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
[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端口
將容器化的數據持久化到本地宿主機,這個鏡像是早期漢化后構建的,默認官方的鏡像是英文的,這個是英文的,這個鏡像比較大差不多1g,包括數據庫和消息隊列,里面封裝的內容很多。
1
2
3
|
[root@www gitlab] # docker logs 3396d5ccc518 - execute /opt/gitlab/bin/gitlab-ctl start postgresql +psql_host= '/var/opt/gitlab/postgresql' |
通過日志可以查看到有哪些組件如postgresql
初次訪問的時候可能有點慢,因為組件較多,可能要等待3-5分鐘
出現這個頁面說明gitlab服務是啟動起來了,可能里面其他組件還沒啟動成功。這里最好給到物理內存4g,如果只有2g是不能正常啟動的,差不多八分鐘之后如下所示
用戶名默認是root這里需要設置新密碼,新密碼最少8位可以設置為qwerasdf,然后更新完密碼就可以使用root用戶名 密碼qwerasdf去登入
創建一個私有項目java-demo
推送代碼到java-demo倉庫
在另外一臺機器上安裝git,將項目的源碼包上傳
[root@localhost ~]# yum install git -y
[root@localhost ~]# unzip tomcat-java-demo-master.zip
初始化git目錄
1
2
3
|
[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/ |
這個git目錄就會配置git相關的一些數據,初始化完成以后
1
2
3
|
[root@localhost tomcat-java-demo-master] # cd .git/ [root@localhost .git] # ls branches config description head hooks info objects refs |
配置git的配置文件
這條命令是將gitlab的地址寫到.git/config配置文件當中
1
2
3
4
5
6
7
8
9
10
11
|
[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地址寫進去了,待會去提交代碼都會去讀取該配置文件 [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/ * |
這個.代表所有,將當前代碼目錄提交到暫存區
1
2
3
|
[root@localhost tomcat-java-demo-master] # git add . [root@localhost tomcat-java-demo-master] # ls db dockerfile license pom.xml readme.md src |
提交到當前git倉庫里面,因為本身其就是一個git倉庫了(本地也是一個git倉庫)
[root@localhost tomcat-java-demo-master]# git commit -m 'all'
推送到遠程倉庫,這個就會讀取之前的配置文件了
1
2
3
4
5
6
7
8
9
10
|
[root@localhost tomcat-java-demo-master] # git push origin master username for 'http://192.168.179.100:9999' : root 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
1
2
3
4
5
|
[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 |
這兩個工具包的作用是讓jenkins去用,jenkins是用容器部署的,所以宿主機上面的兩個環境就可以掛載進去。要將maven jdk掛載進去。
因為要在jenkins里面去做鏡像的構建,要使用docker build,所以這里有docker in docker,即在jenkins里面再構建docker,這里不需要研究如何在容器里面再安裝docker。可以直接將宿主機的命令和socket直接掛載進去就可以直接在容器里面使用docker命令。
-v是將jenkins的數據持久化到目錄下,jenkins官方將jenkins產生的數據文件都放在
/var/jenkins_home
目錄下面,所以只需要將這個目錄進行持久化就行,即使jenkins容器被刪除了,那么數據還是可以恢復過來。
使用的鏡像就是最新版,長期維護的鏡像
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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 查看日志
點擊選擇插件安裝,這里選擇無不安裝插件,先安裝jenkins以后插件需要什么就安裝什么
jenkins pipeline概念
• jenkins pipeline是一套插件,支持在jenkins中實現集成和持續交付管道;
• pipeline通過特定語法對簡單到復雜的傳輸管道進行建模;
• 聲明式:遵循與groovy相同語法。pipeline { }
• 腳本式:支持groovy大部分功能,也是非常表達和靈活的工具。node { }
• jenkins pipeline的定義被寫入一個文本文件,稱為jenkinsfile
先要安裝pipeline插件然后寫文本,對pipeline去建模,現在主要使用聲明式語法,文本文件長什么樣
在這個文件當中告訴jenkins要做什么事情,在一個大的stage里面分為了很多小的stage,通過這種流水線的形式分好了這幾個階段,在這幾個stage組成了pipeline的流水線。按照從上到下的順序執行,直到執行完成。
pipeline寫法大致是下面這些流程
pipeline實現之后有一個案板
這個案板根據pipeline的每個步驟會輸出每個步驟案板。如消耗了多長時間和日志。這樣容易定位問題方便查看。
jenkins pipeline插件的安裝和pipeline使用
在安裝插件的時候會很慢,如何提速?jenkins下載插件的時候是有一些源的,可以修改位國內的源,在插件高級里面修改其實是沒有用的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
[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 這里其實寫了插件的源 hudson.tasks.maven.maveninstaller 使用sed進行修改
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都安裝上,有個別安裝失敗可以,只要核心主鍵安裝好就行
替換插件源之后安裝插件明顯變快了,可以看到新建項目多了流水線的選擇,這里選擇流水線構建
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
pipeline { agent any stages { stage( '1.拉取拉取代碼' ) { steps { echo '拉取代碼' } } stage( '2.代碼代碼代碼編譯' ) { steps { echo '編譯' } } stage( '3.代碼部署' ) { steps { echo '部署' } } } } |
可以看到看板
這里是控制臺輸出,也可以指定從某個階段運行構建
下面使用pipeline來完成流程設計
從git拉取代碼,構建鏡像。推送到harbor再部署到docker當中。這個腳本可以復用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
#!/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( '構建鏡像' ){ 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} "" " } } } } |
可以看到這里要你輸入分支
參數化構建,變量的名稱可以在shell腳本或者pipeline當中去引用
1
2
3
|
steps { echo '${branch}' } |
創建harbor的憑據,即使用jenkin要訪問docker harbor倉庫需要知道用戶名和密碼
可以看到這里多了一個憑據 c91491d9-91cd-4248-96c8-fc8cc00f7db4,pipeline腳本當中就定義了憑據def docker_registry_auth = "c91491d9-91cd-4248-96c8-fc8cc00f7db4" 這是jenkins的憑據
還需要插件git憑據 86ebc99d-d3fc-4e6e-b938-db1f5a1f3642 在pipeline里面定義def git_auth = "86ebc99d-d3fc-4e6e-b938-db1f5a1f3642"
pipeline有些語句可以自動生成,比如生成拉從取代碼
知道pipeline大概的框架 套進去就行
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包放到環境鏡像里面
現在配置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
在后臺輸出可以看到這些東西,在編譯構建的時候maven的源是默認的網絡比較慢,現在要修改源確保拉取速度快一些宿主機上修改,這里面定義了從那個源拉取相應的依賴包
1
2
3
4
5
6
7
|
[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 > |
修改完之后不需要重啟容器直重新構建,可以看到構建出來的包
[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存放的是數據源信息
[root@localhost ~]# ls /opt/jenkins_home/jobs/
test test-pipeline
如果需要在其他dcker主機上部署可以使用ssh插件的ssh命令或者使用ansible別的機器上啟動執行docker命令創建容器
題外話
提供了如果你的harbor提供了https認證,那么請在你的jenkins這臺主機將證書拷貝到相應的目錄下面。確保jenkins主機能夠登入進docker harbor倉庫
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
[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構建持久化平臺操作就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。
原文鏈接:https://blog.csdn.net/qq_34556414/article/details/109716291