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
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
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