在Jenkins的帮助下让我们的应用CI与CD

上图三位大家应该很熟悉吧,借助这三者可以让我们的服务在Linux环境下持续集成、容器中持续部署。
本篇博客的项目是core webapi, .NET 5.0 在11号已经正式发布了,你们的项目都升级了吗?
在开始之前,所需要的的环境要提前准备一下
Centos7.x(连Linux系统都没有还整啥?)
jdk1.8(Jenkins和Docker的运行都需要依赖jdk)
Docker(项目最终运行于容器中)
jenkins(这个是CI、CD的关键)
dotnet core环境(编译我们的项目)
gitlab (用于托管代码的仓库)
安装jdk
yum install java-1.8.0-openjdk
安装Docker
先执行命令(使用官方脚本自动安装):curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
Docker安装完成之后我们执行Docker images 命令时,会报如下错误:
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
我们需要再执行以下命令:systemctl enable docker #开机自动启动docker
systemctl start docker #启动docker
systemctl restart docker #重启docker
安装DotNet Core环境
1.安装sudo:
yum install sudo
2.将 Microsoft 包签名密钥添加到受信任密钥列表,并添加 Microsoft 包存储库:
sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
3.安装.Net Core SDK(会自动安装相应的运行时):
sudo yum install dotnet-sdk-3.1
安装Jenkins
1.拉取库的配置到本地对应文件:
wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
2.导入公钥:
rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
3.使用yum安装我们的jenkins:
yum install -y jenkins
4.启动我们的jenkins:
执行service jenkins start命令运行我们的Jenkins,打开ip:8080(Jenkins默认为8080端口)
我用的是gitlab仓库管理我的项目,你也可以用Gogs、码云等。工具不重要,原理其实都一样。
下面说一下流程:
1.本地提交我们的代码至仓库
2.仓库触发Jenkins来构建我们的项目
3.执行shell脚本来发布我们的项目至指定文件下
4.停止、删除容器
5.根据DockerFile构建镜像,启动我们的项目
之前有幸开发过一个java的项目,当时那个项目就是以jenkins来自动化发布构建的。太方便了,特别是团队协作开发的时候,提交即部署,不需要有人手动来编译发布。
ok!话不多说
来到Jenkins面板页

这里的话我们要安装几个插件来协助我们进行自动化构建:
1.Build Authorization Token Root Plugin 查看插件详细信息的地址:https://plugins.jenkins.io/build-token-root
2.GitLab Plugin与Gitlab Hook Plugin
除此之外服务器要安装Git,不然建立代码拉取请求的时候会报错

Jenkins启动的时候会创建一个'jenkins'的用户来运行此服务,我们需要把这个用户改为root,不改的话执行shell脚本时会提示没有操作权限


新建一个任务

在源码管理中选择Git,地址的话填写你远程仓库的地址就行了,添加的凭据中只需填写用户名和密码就行了

在构建触发器中勾选以下两个方式,令牌的话自己找一个即可,这个令牌到时候会在gitlab的webhooks配置中用到

在构建方式中选择执行shell

shell脚本如下:
dotnet publish -p:PublishDir=/home/core #发布我们的项目至/home/core目录下
cp -r /var/lib/jenkins/workspace/automation/automation/Dockerfile /home/core #copy我们的DockerFile文件到/home/core文件下
docker build -t corecode /home/core/ #通过DockerFile构建镜像
docker run -d -p 8009:8009 --restart=always --name corecode corecode #启动容器
到此,Jenkins的配置工作就完了。我们还需要将gitlab与jenkins之间建立连接,从而触发构建的动作。
进入对应的项目工程内,选择钩子


我们在push代码的时候,会触发对应事件。如果上面的信息都填写完之后,将这个钩子提交即可。
我们上面的shell脚本中有一行会拷贝我们项目中的DockerFile文件至指定目录中,所以我们要把DockerFile文件放到web层中,这样好拷贝一些。

这里的DockerFile文件是我自己写的,你也可以在项目中添加Docker支持,不过它生成的DockerFile文件你还是得手动改一下

DockerFile文件中的脚本如下:
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim #依赖的基础镜像,第一次pull的时候会很慢,之后会很快(联合文件系统)
WORKDIR /app/work #工作目录
EXPOSE 8009 #对外的端口
COPY . . #将本地的文件拷贝到容器镜像中
#容器内同步上海的时间
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone
CMD ["dotnet", "automation.dll"] #运行我们的项目
提交我们的代码,在gitlab上查看我们的钩子状态,如果是201的状态码证明是成功的。如果是403的话,一定要检查好url信息,实在不行重启一下jenkins(之前重启一下就好了)



第一次执行完之后,我们需要更改一下shell脚本。删除掉打包镜像的文件夹下的文件,并且移除掉容器.

rm -rf /home/core/*
dotnet publish -p:PublishDir=/home/core
cp -r /var/lib/jenkins/workspace/automation/automation/Dockerfile /home/core
docker stop corecode
docker rm corecode
docker rmi corecode
docker build -t corecode /home/core/
docker run -d -p 8009:8009 --restart=always --name corecode corecode
是不是觉得方便多了?按照上面的流程,就如下面这张图一样

这是单机的流程,如果是分布式的话就另论了。如果服务之间耦合度比较高,更新的时候就得有个先后,具体的以同学们实际业务场景为主,这里的话希望能有个抛砖引玉的作用!
当然如果你要用nginx做静态代理部署前端项目,其实也是一样的,每次打包一个新的dist文件并拷贝到指定位置,并配置好监听的端口即可。
本片博客到这里就结束了,如果您在配置的过程中遇到什么问题可以与我交流。如果有什么不足的地方请担待!
路漫漫其修远兮吾将上下而求索,我相信您也一样。我叫张韬,一名成长中的全栈攻城狮(努力中...)
在Jenkins的帮助下让我们的应用CI与CD的更多相关文章
- Jenkins 在windows下的安装与配置
1. 安装Jenkins war包安装:启动Jenkins命令,打开cmd至Jenkins安装目录下,运行命令 java -jar jenkins.war 如果改变默认端口,则指定端口例如端口号108 ...
- jenkins在windows下的最快安装方法
jenkins在windows下的安装 2016年04月21日 13:00:09 阅读数:22828 在初步了解了jenkins是什么?jenkins的特点.基本结构,及大概的功能介绍后,就开始对je ...
- 1.Jenkins 在windows下的安装与配置
1. 安装Jenkins 1.war包安装:启动Jenkins命令,打开cmd至Jenkins安装目录下,运行命令 java -jar jenkins.war 如果改变默认端口,则指定端口例如端口号1 ...
- Jenkins集群下的pipeline实战
关于Jenkins集群 在<快速搭建Jenkins集群>一文中,我们借助docker快速搭建了Jenkins集群,今天就在这个集群环境中创建pipeline任务,体验Jenkins集群下的 ...
- Jenkins使用总结,2.0 新时代:从 CI 到 CD
Jenkins近阶段使用的总结篇,只写了个引子,却一直未动手写完,今天补上. 前几篇文章提到在内网jenkins直接构建部署升级线上环境,job都是暴露在外面,很容易被误操作,需要做简单的权限控制,以 ...
- CI与CD之Docker上安装Jenkins
一.CI,CD,Jenkins的介绍 CI:持续集成(Continuous integration,简称 CI),在传统的软件开发环境中,有集成,但是没有持续集成这种说法,长时间的分支与主干脱离,导致 ...
- 群晖下 gitea+drone+harbor实现CI/CD 发布到云服务器
常用命令 sudo -i然后输入密码登录root账户(群晖默认只能使用admin账号登陆) vim xxx编辑(编辑是进去之后按i,退出并保存是按esc,然后:wq!再回车) mkdir xx创建文件 ...
- jenkins 入门教程(下)
接上回继续学习jenkins,这次主要来看一些疑难杂症: 一.yum install安装方式 除了直接java -jar jenkins.war方式,还可以用yum安装,这种方式下提供了更多的可配置选 ...
- 【Jenkins】linux下Jenkins集成ant进行编译并发送结果
三个文章吧: 1 如何使用ant编译执行jmeter测试用例,并生成html报告 2 如何在Linux下搭建jenkins环境. 3 如何在Linux下搭建的jenkins中执行ant构建运行,并发送 ...
随机推荐
- Java nio Server端示例
public class ServerNio { public static void main(String[] args) throws IOException, InterruptedExcep ...
- sql server DDL语句 建立数据库 定义表 修改字段等
一.数据库:1.建立数据库 create database 数据库名;use 数据库名; create database exp1;use exp1; mysql同样 2.删除数据库 drop dat ...
- redis简介以及redis集群配置
简介: redis 是一个高性能的key-value数据库..它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set --有序 ...
- configfs_sample.c 理解
1. 编译运行 代码从如下链接获得: https://github.com/torvalds/linux/blob/master/samples/configfs/configfs_sample.c ...
- [Luogu P4215] 踩气球 (线段树)
题面 传送门:https://www.luogu.org/problemnew/show/P4215 Solution 这题十分有意思. 首先,我们可以先想想离线做法,因为在线做法可以从离线做法推出. ...
- 线上Java程序占用 CPU 过高,请说一下排查方法?
我是风筝,公众号「古时的风筝」,一个兼具深度与广度的程序员鼓励师,一个本打算写诗却写起了代码的田园码农! 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在 ...
- 11/6笔记 补充(Redis持久化,RDB&&AOF)
11/6补充笔记 修改redis-6379.conf里面的save10秒2个数据发生改变 (save 10 2) 修改一次数据不发生改变,修改2次数据才发生改变 继续修改数据,发现还是一样的规律 增删 ...
- vscode实现远程linux服务器上Python开发
最近需要训练一个生成对抗网络模型,然后开发接口,不得不在一台有显卡的远程linux服务器上进行,所以,趁着这个机会研究了下怎么使用vscode来进行远程开发. 1 配置免密登录¶ (1)在 ...
- Scrapy分布式爬虫,分布式队列和布隆过滤器,一分钟搞定?
使用Scrapy开发一个分布式爬虫?你知道最快的方法是什么吗?一分钟真的能 开发好或者修改出 一个分布式爬虫吗? 话不多说,先让我们看看怎么实践,再详细聊聊细节~ 快速上手 Step 0: 首先安装 ...
- Js中函数声明和函数表达式的区别
先看以下几段烧脑的代码: f();//=>? var f = function () { console.log("var"); } function f() { conso ...