Jenkins持续集成(CI)

Jenkins持续集成(CI)

CI/CD是什么

CI(Continuous integration),中文意思是持续集成)是一种软件开发时间。持续集成强调开发人员提交了新代码之后,立刻进行构建、(单元)测试。根据测试结果,我们可以确定新代码和原有代码能否正确地集成在一起。借用网络图片对CI加以理解。

img

CD(Continuous Delivery), 中文意思持续交付)是在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境(类生产环境)中。比如,我们完成单元测试后,可以把代码部署到连接数据库的Staging环境中更多的测试。如果代码没有问题,可以继续手动部署到生产环境。下图反应的是CI/CD 的大概工作模式。

img

一个完整的构建系统必须包括:

  1. 一个自动构建过程,包括自动编译、分发、部署和测试等。

  2. 一个代码存储库,即需要版本控制软件来保障代码的可维护性,同时作为构建过程的素材库。

  3. 一个持续集成服务器。

其中自动构建和代码存储库,都是有相应的软件配合,开发人员需要的学习成本不高,复杂在各模块的相互配合,这一期间可能需要大量时间去调试。一旦调试完毕,对于之后工作效率的提升是成倍的。

Jenkins是什么?

Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具,起源于Hudson(Hudson是商用的),主要用于持续、自动的构建/测试软件项目、监控外部任务的运行。Jenkins用Java语言编写,可在Tomcat等流行的servlet容器中运行,也可独立运行。通常与版本管理工具(SCM)、构建工具结合使用。常用的版本控制工具有SVN、GIT,构建工具有Maven、Ant、Gradle。

Jenkins基本工作原理

image-20220130140129841

Jenkins安装配置

准备工作

  1. 需要准备一台服务器,大家可以在网上买,个人学习的话还是建议大家去安装一个虚拟机,去装一个Linux系统
  2. 需要准备一个远程连接工具,连接到Linux系统
  3. 机器上安装了Docker

开始安装

  1. 启动docker,下载Jenkins镜像文件
docker pull jenkins/jenkins

Jenkins镜像文件

  1. 创建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
  1. 创建并启动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容器

  1. 查看jenkins是否启动成功,如下图出现端口号,就为启动成功了
docker ps -l

查看Jenkins是否启动成功

  1. 查看Docker容器日志
docker logs myjenkins]]

查看docker容器日志

  1. 配置镜像加速,进入 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

修改后

修改后

  1. 访问Jenkins页面,输入你的ip加上10240

打开主页

  1. 管理员密码获取方法,编辑initialAdminPassword文件查看,把密码输入登录中的密码即可,开始使用。
vi /var/jenkins_mount/secrets/initialAdminPassword

获取密码

  1. 到此以全部安装成功,尽情的使用吧!

安装完成

解决下载插件慢

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

img

添加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配置

我们本次新建的任务是自由风格的任务

img

新建任务

选择新建自由风格的任务

img

freedom

因为我们要使用WebHook达到Push操作触发Jenkins自动构建的效果,所以,首先进行WebHook的配置

WebHook:当事件发生时,源网站可以发起一个HTTP请求到webhook配置的URL。配置之后,用户可以通过在一个站点触发事件,之后再调用另一个站点的行为。可以是任何操作
登录 Jenkins

img

系统设置

在Github插件的配置中,点击“高级”按钮

img

高级

覆盖 Hook URL输入 Jenkins地址+github-webhook/

img

webhook

配置Github项目仓库
点击 "Add webhook"

img

new webhook.png

选择 "Let met select indibidual events" , 以Push为例

img

push

GitHub配置完毕,接下来继续Jenkins的配置,
配置Git地址并选择构建触发器,并且选择"Github Hook"触发

img

hook

在本地代码库做一些修改,并Push至Github后,查看Jenkins构建效果

img

build

可以看到,已经已经通过push操作触发了构建动作,但是我们这里没有进行构建操作,但是说明webhook这条路是通的。
GitHub Hook Log 如下:

img

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一次代码,查看部署情况

img

dockerbuild

可以看到dockerfile脚本的执行情况,docker镜像已构建完成并 image已经构建完成并推送到远程服务器

原文链接

CI/CD是什么?如何理解持续集成、持续交付和持续部署

什么是 CI 持续集成

CI持续集成介绍

Jenkins搭建.NET自动编译发布本地环境

Jenkins详细教程

Asp.net Core 使用Jenkins + Dockor 实现持续集成、自动化部署(二):部署

基于Jenkins的.Net Core应用自动部署

k8s+Jenkins+GitLab-自动化部署asp.net core项目

posted @ 2022-01-30 14:57  AJun816  阅读(503)  评论(0编辑  收藏  举报