本实践介绍了利用Jenkins和docker技术,如何实现CI/CD的各环节的步骤,包括环境准备,代码提交,编译程序,构建镜像,部署一套完整的安装部署流程。
工具介绍:
- Docker:是目前最流行的虚拟化技术
- Jenkis :Jenkins人工或定时触发构建项目,拉取代码,编码、再打包镜像,推送到镜像仓库
- Gitee:源代码版本管理工具,开发人员提交代码到Gitee仓库,需要把仓库设置成公开
- 阿里云镜像仓库:存放镜像的仓库
操作系统centos 7.3 关闭防火墙 ,selinux
一、安装docker
我是虚拟机装的Centos7,linux 3.10 内核,docker官方说至少3.8以上,建议3.10以上
root账户登录,查看内核版本如下:
[root@word-test ~]# uname -a
Linux word-test.com 3.10.0-1127.el7.x86_64 #1 SMP Tue Mar 31 23:36:51 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
进入docker官网在installation per distro 下的install on centos
参照文档安装,步骤如下:
删除旧版本:
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
需要的安装包
yum install -y yum-utils
设置镜像仓库
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
如果缺包就执行以下命令,然后在执行上面那条命令:
wget -O /etc/yum.repos.d/CentOS-Base.repo \
http://mirrors.aliyun.com/repo/Centos-7.repo
更新yum 软件包索引
yum makecache fast**
安装docker docker -ce社区版 ee 企业版
yum install docker-ce docker-ce-cli containerd.io
安装完成后,启动docker
[root@word-test ~]# systemctl start docker.service
[root@word-test ~]# systemctl status docker.service
使用docker version 查看是否安装成功:
Client: Docker Engine - Community
Version: 20.10.14
API version: 1.41
Go version: go1.16.15
Git commit: a224086
Built: Thu Mar 24 01:49:57 2022
OS/Arch: linux/amd64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 20.10.14
API version: 1.41 (minimum version 1.12)
Go version: go1.16.15
Git commit: 87a90dc
Built: Thu Mar 24 01:48:24 2022
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.5.11
GitCommit: 3df54a852345ae127d1fa3092b95168e4a88e2f8
runc:
Version: 1.0.3
GitCommit: v1.0.3-0-gf46b6ba
docker-init:
Version: 0.19.0
GitCommit: de40ad0
镜像加速配置:
使用Docker时需要首先下载一个官方镜像,例如mysql、wordpress。然而由于网络原因,下载一个Docker官方镜像可能会需要很长的时间,甚至下载失败。为此,阿里云容器镜像服务ACR提供了官方的镜像站点,从而加速官方镜像的下载。
在不同的操作系统下,配置加速器的方式略有不同,此次我使用的是centos7
关于加速器的地址,您登录容器镜像服务控制台后,在左侧导航栏选择镜像工具 > 镜像加速器,在镜像加速器页面就会显示为您独立分配的加速器地址。
例如:
加速器地址:[系统分配前缀].mirror.aliyuncs.com
配置镜像加速器
针对Docker客户端版本大于 1.10.0 的用户
可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
mkdir -p /etc/docker #有的直接进入,没有则创建
vim daemon.json #创建daemon.json文件并进入
{
"registry-mirrors": ["https://3qk4n8zw.mirror.aliyuncs.com"]
} #写入## 标题
也可以使用输入重定向:
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://3qk4n8zw.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload #重新加载daemon
systemctl restart docker #重启docker
二、安装 Jenkins
docker search jenkins // 查找jenkins镜像
docker pull jenkins/jenkins // pull jenkins最新镜像
创建jenkins挂载目录
mkdir /var/jenkins_home/
chmod 777 /var/jenkins_home/ #授权
启动 Jenkins 容器
docker run -d -e TZ="Asia/Shanghai" --name jenkins -p 8080:8080 -p 50000:50000 -v /var/jenkins_home:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker jenkins/jenkins:latest
参数说明:
-d:后台守护进程运行 ;
-e:设置时区
-p(小写p):端口映射,前面8080为宿主机的端口,后面8080为jenkins:latest镜像的端口(该端口是制作镜像的人制定的) ;
--name:给容器取名字为:jenkins ;
-v: 挂在数据卷 ;
-v /var/jenkins_home:/var/jenkins_home #最好不要挂在这个目录上,自己创建一个
-v把宿主机的/var/jenkins_home目录挂载到容器的/var/jenkins_home,该目录是jenkins的工作目录,主要方便在本地查看容器的文件。
-v /usr/bin/docker:/usr/bin/docker 把docker的命令 映射 ;
加上这个-v参数是为了能在Jenkins容器里面能执行docker命令
-v /var/run/docker.sock:/var/run/docker.sock
Portainer通过绑定的/var/run/docker.sock文件与Docker守护进程通信,执行各种管理操作。
jenkins/jenkins:latest: 为基础镜像 ;
网页输入locathost +端口访问 Jenkins
cat /var/jenkins_home/secrets/initialAdminPassword 查看初始密码
82634f21e5f9410a91b6ea9068fc883e
接下来安装推荐的插件,安装成功会自动重启jenkins:
进入主页面,创建第一个管理员用户:
检查实例配置没问题,点击保存并完成:
三、 配置Jenkins
3.1 Jenkins配置全局工具配置
主页面 -> 系统管理 -> 全局工具配置
指定Maven、Git路径
如果Jenkins主机没有git命令,需要安装Git:
yum install git -y
关于Maven配置可以参考:
https://blog.csdn.net/clover661/article/details/124357060?spm=1001.2014.3001.5501
3.2 凭据
系统管理 >>> Manage Credentials >>> jenkins >>> 全局凭据 >>> 添加凭据
首次添加需要从Jenkins这里进入
点击全局凭据
添加凭据
此处配了个giett代码仓库的凭据
gitee 用户:abc344327477 密码:**********
继续配一个阿里云镜像仓库凭据:
阿里云镜像仓库:
用户:abc1387723**** 密码:***********
3.3 Jenkins安装必要插件
主页面 -> 系统管理 ->管理插件
安装SSH与Git 、maven插件。
SSH插件
:
Git 插件
maven插件
3. 4 配置国内插件源
安装了中文插件Localization: Chinese (Simplified)的话
Manage Jenkins => Manage Plugins => 高级 => 升级站点,改为国内源
改成国内源 :
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
4 创建项目
4.1点击新建项目
4.2 建一个test项目
4.3 写上代码仓库地址,我的是gitee代码仓库
4.4 仓库地址获取:
4.5 编写pipeline
pipeline {
agent any
options { timestamps() }
environment {
name="java"
image="registry.cn-hangzhou.aliyuncs.com/xiaoshimei/shimei-tset:${name}$BUILD_ID"
}
stages {
stage('拉取代码') {
steps {
checkout([$class: 'GitSCM', branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[credentialsId: 'gitee', url: 'https://gitee.com/abc344327477/shopfront.git']]]) #流水线生成 编号①
}
}
stage ('代码编译') {
steps {
//代码编译
sh 'mvn clean install'
//sh 'ls -lh target/'
}
}
stage ('打包docker镜像') {
steps { //登录镜像仓库
withCredentials([usernamePassword(credentialsId: 'jingx', passwordVariable: 'PASSWD', usernameVariable: 'USER')]) { #流水线生成编号②
sh 'docker login -u$USER -p$PASSWD registry.cn-hangzhou.aliyuncs.com' #登录镜像仓库
}
//打包docker镜像
sh 'docker build -t ${image} .'
//推送镜像
sh 'docker push ${image}'
// 删除镜像
sh 'docker rmi ${image}'
}
}
stage ('Deloy') { //通过ssh部署
steps {
//拉取镜像:docker pull registry.cn-hangzhou.aliyuncs.com/xiaoshimei/shimei-tset:java$BUILD_ID
sshPublisher(publishers: [sshPublisherDesc(configName: 'centos7-198', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: 'docker pull registry.cn-hangzhou.aliyuncs.com/xiaoshimei/shimei-tset:java$BUILD_ID', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: true)]) #流水线生成编号③
//删除镜像,第一次部署记得注解掉 :docker rm -f java
sshPublisher(publishers: [sshPublisherDesc(configName: 'centos7-198', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: 'docker rm -f java ', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: true)]) #流水线生成编号④
// 运行容器:docker run -d --name java -p8010:8010 registry.cn-hangzhou.aliyuncs.com/xiaoshimei/ shimei-tset:java$BUILD_ID
sshPublisher(publishers: [sshPublisherDesc(configName: 'centos7-198', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: 'docker run -d --name java -p8010:8010 registry.cn-hangzhou.aliyuncs.com/xiaoshimei/shimei-tset:java$BUILD_ID', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: true)]) #流水线生成编号⑤
//查看容器 :docker ps
sshPublisher(publishers: [sshPublisherDesc(configName: 'centos7-198', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: 'docker ps ', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: true)]) #流水线生成编号⑥
}
}
}
}
拉取代码,流水线生成 ①:
登录镜像仓库,流水线生成 ②:
想通过ssh部署需要先部署好SSH
1 需要安装Publish Over SSH插件
2 插件配置
主界面——>系统管理——>系统设置——>Publish over SSH
配置密码密码 端口 等等
参数说明:
Passphrase:表示登入密码
path to key:SSH-key文件存放路径 文件路径可以是绝对路径 也可以是相对路径(相对于jenkins的工作目录)
key:SSH-key具体的key文本 作用同上 设置其中一个即可
disable exec: 表示是否运行执行命令 因为你在发布之后可能需要通过命令操作服务器,比如上传编译好的网站文件然后重启服务器上的tomcat
name: 一般写成 用户名@主机名 比如root@blog.cooderstory.cn 当存在多个ssh配置文件的时候 我们使用name来区分
hostanme:表示需要登入的远程主机 可以和我一样写个域名或者具体的ip
username: 就是登入的用户名
remote directory: 表示远程路径 登入到服务器后想打开哪个目录
这段SSH的配置主要是让jenkins能通过shh连接到服务器,也就是ssh连接配置
这里的配置要看具体服务器的安全设置的,有的是通过账户密码登入,有的是直接通过ssh-key登入的,或者三者都要。
生成ssh流水线方法:
通过ssh部署,流水线生成 ③:
通过ssh部署,流水线生成 ④:
通过ssh部署,流水线生成 ⑤:
通过ssh部署,流水线生成 ⑥:
配置完后点击立即构建:
构建之前给192.168.10.108机上的sock授权
测试,在浏览器输入 192.168.10.108:8010
最终访问的web界面如下
如果输出下述页面说明是正常的,页面没有加载成功样式,需要修改下项目里访问地址。