在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  查看插件详细信息的地址://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文件并拷贝到指定位置,并配置好监听的端口即可。

本片博客到这里就结束了,如果您在配置的过程中遇到什么问题可以与我交流。如果有什么不足的地方请担待!😅

路漫漫其修远兮吾将上下而求索,我相信您也一样。我叫张韬,一名成长中的全栈攻城狮(努力中…😄)