Jenkins持续集成(CI)
Jenkins持续集成(CI)
CI/CD是什么
CI(Continuous integration),中文意思是持续集成)是一种软件开发时间。持续集成强调开发人员提交了新代码之后,立刻进行构建、(单元)测试。根据测试结果,我们可以确定新代码和原有代码能否正确地集成在一起。借用网络图片对CI加以理解。
CD(Continuous Delivery), 中文意思持续交付)是在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境(类生产环境)中。比如,我们完成单元测试后,可以把代码部署到连接数据库的Staging环境中更多的测试。如果代码没有问题,可以继续手动部署到生产环境。下图反应的是CI/CD 的大概工作模式。
一个完整的构建系统必须包括:
一个自动构建过程,包括自动编译、分发、部署和测试等。
一个代码存储库,即需要版本控制软件来保障代码的可维护性,同时作为构建过程的素材库。
一个持续集成服务器。
其中自动构建和代码存储库,都是有相应的软件配合,开发人员需要的学习成本不高,复杂在各模块的相互配合,这一期间可能需要大量时间去调试。一旦调试完毕,对于之后工作效率的提升是成倍的。
Jenkins是什么?
Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具,起源于Hudson(Hudson是商用的),主要用于持续、自动的构建/测试软件项目、监控外部任务的运行。Jenkins用Java语言编写,可在Tomcat等流行的servlet容器中运行,也可独立运行。通常与版本管理工具(SCM)、构建工具结合使用。常用的版本控制工具有SVN、GIT,构建工具有Maven、Ant、Gradle。
Jenkins基本工作原理
Jenkins安装配置
准备工作
- 需要准备一台服务器,大家可以在网上买,个人学习的话还是建议大家去安装一个虚拟机,去装一个Linux系统
- 需要准备一个远程连接工具,连接到Linux系统
- 机器上安装了Docker
开始安装
- 启动docker,下载Jenkins镜像文件
docker pull jenkins/jenkins
- 创建Jenkins挂载目录并授权权限(我们在服务器上先创建一个jenkins工作目录 /var/jenkins_mount,赋予相应权限,稍后我们将jenkins容器目录挂载到这个目录上,这样我们就可以很方便地对容器内的配置文件进行修改。 如果我们不这样做,那么如果需要修改容器配置文件,将会有点麻烦,因为虽然我们可以使用docker exec -it –user root 容器id /bin/bash 命令进入容器目录,但是连简单的 vi命令都不能使用)
mkdir -p /var/jenkins_mount
chmod 777 /var/jenkins_mount
-
创建并启动Jenkins容器
-d 后台运行镜像
-p 10240:8080 将镜像的8080端口映射到服务器的10240端口。
-p 10241:50000 将镜像的50000端口映射到服务器的10241端口
-v /var/jenkins_mount:/var/jenkins_mount /var/jenkins_home目录为容器jenkins工作目录,我们将硬盘上的一个目录挂载到这个位置,方便后续更新镜像后继续使用原来的工作目录。这里我们设置的就是上面我们创建的 /var/jenkins_mount目录
-v /etc/localtime:/etc/localtime让容器使用和服务器同样的时间设置。
–name myjenkins 给容器起一个别名
docker run -d -p 10240:8080 -p 10241:50000 -v /var/jenkins_mount:/var/jenkins_home -v /etc/localtime:/etc/localtime --privileged=true --name myjenkins jenkins/jenkins
- 查看jenkins是否启动成功,如下图出现端口号,就为启动成功了
docker ps -l
- 查看Docker容器日志
docker logs myjenkins]]
- 配置镜像加速,进入 cd /var/jenkins_mount/ 目录。
cd /var/jenkins_mount/
修改 vi hudson.model.UpdateCenter.xml里的内容
将 url 修改为 清华大学官方镜像:https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
修改后
- 访问Jenkins页面,输入你的ip加上10240
- 管理员密码获取方法,编辑initialAdminPassword文件查看,把密码输入登录中的密码即可,开始使用。
vi /var/jenkins_mount/secrets/initialAdminPassword
- 到此以全部安装成功,尽情的使用吧!
解决下载插件慢
Jenkins 在启动的时候需要安装一些插件,下载速度很慢不说还很多报错,让人很是抓狂,下面是解决办法:
找到 default.json 文件
在 Jenkins 的安装目录里查找
find / -name default.json
/var/lib/jenkins/updates/default.json
替换 default.json 中的内容
将 updates.jenkins-ci.org/download 替换为 mirrors.tuna.tsinghua.edu.cn/jenkins,
将 www.google.com 替换为 www.baidu.com,
具体命令如下:
sed -i 's/www.google.com/www.baidu.com/g' default.json
sed -i 's/updates.jenkins-ci.org\/download/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json
重启Jenkins
根据你具体的安装方式、启动方式,重启一下 Jenkins,然后在页端重新安装插件,就会看到速度非常快了!
Asp.Net Core+JenKins示例
新建一个.Net Core项目
添加Docker支持
添加Docker支持,并选择Linux或者Windows平台,这取决你想要将程序发布在什么平台上,添加Docker支持会帮我们新建一个Dockerfile,内容如下:
FROM microsoft/dotnet:2.1-aspnetcore-runtime #基础镜像为dotnetcore
MAINTAINER gwDeveloper #作者
LABEL description="this is a test website" #描述
LABEL version="1.0" #描述
WORKDIR /app #工作目录
COPY . . #将当前目录下的文件,复制到WORKDIR目录
EXPOSE 5004 #容器暴露5004端口
ENTRYPOINT ["dotnet","JenkinsDemo.dll"] #运行donet命令,参数是JenkinsDemo.dll
Dockerfile编写完毕,将代码上传 (本文使用的是GitHub)
Jenkins配置
我们本次新建的任务是自由风格的任务
新建任务
选择新建自由风格的任务
freedom
因为我们要使用WebHook达到Push操作触发Jenkins自动构建的效果,所以,首先进行WebHook的配置
WebHook:当事件发生时,源网站可以发起一个HTTP请求到webhook配置的URL。配置之后,用户可以通过在一个站点触发事件,之后再调用另一个站点的行为。可以是任何操作
登录 Jenkins
系统设置
在Github插件的配置中,点击“高级”按钮
高级
覆盖 Hook URL输入 Jenkins地址+github-webhook/
webhook
配置Github项目仓库
点击 "Add webhook"
new webhook.png
选择 "Let met select indibidual events" , 以Push为例
push
GitHub配置完毕,接下来继续Jenkins的配置,
配置Git地址并选择构建触发器,并且选择"Github Hook"触发
hook
在本地代码库做一些修改,并Push至Github后,查看Jenkins构建效果
build
可以看到,已经已经通过push操作触发了构建动作,但是我们这里没有进行构建操作,但是说明webhook这条路是通的。
GitHub Hook Log 如下:
log
接下来进行构建
在Jenkins可以直接通过执行脚本命令进行构建操作
可以直接在Shell工具中将需要执行的脚本写下来,也可以把脚本文件放在服务器上,通过shell来调用,我们这里是直接写的脚本。但实际生产环境,我认为把脚本文件也使用git进行维护比较好,这样不用每次修改脚本都需要到服务器上,push操作的同时也可以更新脚本文件。
cd /var/lib/jenkins/workspace/JenkinsDemo/src/ #cd 到工作目录,也可以通过Jenkins全局变量($WorkSpace)代替路径
rm -rf /var/lib/jenkins/workspace/jenkins_publish #删除已存在的publish目录
mkdir /var/lib/jenkins/workspace/jenkins_publish #新建目录
dotnet publish -r centos.7-x64 -c:Release -o /var/lib/jenkins/workspace/jenkins_publish #dotnet 构建
cd /var/lib/jenkins/workspace/jenkins_publish #cd到构建好的项目目录
docker login -u dockerhubusername -p password #登录dockerhub(本步骤是因为k8s部署的时候需要从docker库拉取所需的docker镜像)
docker build -t dockerdemo . #docker build 构建镜像(docker build -t name . )**此处命令最后有一个 “.” 如果不加会导致构建失败**此处会默认使用本目录下的Dockerfile进行构建
docker push dockerhubusername/dockerdemo:lastest #docker push 镜像到远程仓库(docker tag image username/repository:tag)
kubectl apply -f deploy.yaml #使用yaml配置文件将最新的docker镜像部署到k8s集群
接下来是k8s的配置,我们在这里是直接调用已经放在服务器上的配置文件,k8s配置文件的格式如下:
apiVersion: extensions/v1beta1 #不同版本的k8s此处有所不同 针对 "kind:Deployment",1.6版本之前 apiVsersion:extensions/v1beta1; 1.6版本到1.9版本之间:apps/v1beta1; 1.9版本之后:apps/v1
kind: Deployment
metadata:
labels:
k8s-app: dockerdemo
name: dockerdemo
namespace: dockerdemo
spec:
replicas: 2 #RC管理的Pod,需要运行的副本数
selector:
matchLabels:
k8s-app: dockerdemo
template:
metadata:
labels:
k8s-app: dockerdemo
spec:
containers:
- name: dockerdemo #容器的名字
image: dockerhubusername/dockerdemo:lastest #容器使用的镜像地址
ports:
- containerPort: 80 #容器开放对外的端口
---
# ------------------- Service ------------------- #
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: dockerdemo
name: dockerdemo
namespace: dockerdemo
spec:
type: NodePort
ports:
- port: 5004 #供集群中其它container访问端口
targetPort: 80 #service对外暴露的端口,任何人访问80端口都会被service代理到后端pod的5004端口
nodePort: 30001 #节点暴露的端口
selector:
k8s-app: dockerdemo
以上内容都配置好了之后,我们可以再次push一次代码,查看部署情况
dockerbuild
可以看到dockerfile脚本的执行情况,docker镜像已构建完成并 image已经构建完成并推送到远程服务器