Flexus X 实例 Docker+Jenkins+gitee 实现 CICD 自动化部署 - 解放你的双手~

电子说

1.3w人已加入

描述

前言

828 B2B 企业节特惠来袭,Flexus X 实例引领自动化部署新纪元!Docker 携手 Jenkins 与 Gitee,共创 CICD 无限可能!在快速迭代的数字时代,我们自豪地推出这一前沿解决方案,为您的 C# Web API 项目注入前所未有的敏捷动力。通过集成 Docker 容器化技术、Jenkins 持续集成/持续部署(CICD)平台,以及 Gitee 高效版本控制系统,我们旨在打造一个无缝衔接的开发到部署流水线,让您的项目在数字化转型的浪潮中乘风破浪,遥遥领先!

一个高度自动化的环境,每一次代码提交都能触发自动化的构建、测试与部署流程。在这个流程中,Docker 确保了应用运行环境的标准化与一致性,无论本地开发还是云端部署,都能享受到“所见即所得”的便捷;Jenkins 作为强大的 CICD 引擎,自动化地管理着整个流程,从代码拉取、编译构建到部署发布,每一步都精准无误;而 Gitee,作为您的代码仓库,不仅提供了安全的版本控制服务,还通过集成 Jenkins 触发器,实现了代码变更与部署流程的即时联动。

本实践指南将带您深入探索 Docker+Jenkins+Gitee 的完美结合,一步步构建起一套高效、可靠的 CICD 自动化部署体系。您将学会如何配置 Jenkins 以监听 Gitee 的 Webhooks,实现代码提交的即时响应;如何利用 Docker 容器快速打包并运行您的 C# Web API 应用;以及如何通过 Jenkins 脚本化地管理整个部署流程,包括环境配置、依赖安装、测试执行与部署发布等关键环节。

实验步骤

环境准备

本实验沿用了上一个实验,环境是 Flexus X 实例自定义模式,使用了 4vCPUs | 12GiB,镜像是最高版本的 ubuntu,在上一个实验中使用 xshell 连接了服务器,随后在服务器中安装了 git、dokcer。这里就不重复介绍了,可自行操作或参考上一个实验!

828华为云征文|Flexus X实例C#/.Net Core 结合(git代码管理、docker自定义镜像)快速发布部署-让你的项目飞起来~-CSDN博客
 

安装 Portainer

介绍:

Portainer 是一款开源的轻量级管理 UI,旨在简化 Docker 和 Kubernetes 环境的管理。Portainer 提供了状态显示面板、应用模板快速部署、容器镜像网络数据卷的基本操作(包括上传下载镜像,创建容器等操作)、事件日志显示、容器控制台操作、Swarm 集群和服务的集中管理和操作等功能。这些功能基本能满足中小型单位对容器管理的全部需求。

拉取镜像

使用 Docker 命令拉取 Portainer 的 Docker 镜像:

docker pull portainer/portainer-ce

华为云

拉取镜像报错了!!!在尝试从 Docker 镜像仓库(如 Docker Hub)获取镜像时遇到了问题。我们可能需要配置 Docker 以使用国内的镜像源,因为直接访问 Docker Hub 有时可能会很慢或不稳定

更换镜像源

在 Linux 系统中,Docker 的配置文件通常位于/etc/docker/daemon.json。如果该文件不存在,则需要手动创建。

华为云

从查询结果来看,我目前并没有这个文件,下面我自己创建一个!

// 创建文件 cd etc/dockertouch daemon.json //编辑文件 vim daemon.json// 在文件中输入以下内容 注意:刚打开文件要输入 i 才可以进入编辑模式{  "registry-mirrors": [    "https://gallery.ecr.aws/",    "https://gitverse.ru/docs/artifactory/gitverse-registry/",    "https://docker.lmirror.top",    "https://atomhub.openatom.cn/"  ]}// 退出编辑模式,从插入模式回到普通模式,只需要按下 Esc 键// 退出 Vim// 修改完成后我们需要完全退出 Vim 编辑器,可以使用以下命令::q //如果没有做任何修改,则退出 Vim。:q! //强制退出 Vim,不保存任何修改。:wq 或 :x //保存修改并退出 Vim。:ZZ //和 :wq 一样,保存修改并退出 Vim,但更简短。

接下来我们重启 docker 服务

[root@localhost]# systemctl daemon-reload[root@localhost]# systemctl restart docker

再次拉取 Portainer 的 Docker 镜像,此时已经可以正常拉取了!

华为云

启动容器

执行下面命令运行 Portainer 容器

docker run -d -p 9000:9000 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/docker/volumes:/var/lib/docker/volumes portainer/portainer-ce

运行容器后,去华为服务器控制台开放我们的 9000 端口

华为云

使用我们的服务器 IP 地址+端口号,访问可视化界面,第一次访问需要配置账号密码

华为云

点击 LiveConnect 打开本地 docker,可以查看宿主机配置信息、查看容器、镜像、网络、卷等相关信息。

华为云

安装 jenkins

介绍:

Jenkins 是一个开源的持续集成和持续部署(CI/CD)工具,它支持各种编程语言和平台,广泛应用于软件开发和交付过程中。Jenkins 可以监视源代码仓库(如 Git、SVN 等)的变化,并在代码提交后自动执行构建过程,包括编译、测试和打包等步骤。

拉取镜像

使用 docker pull jenkins/jenkins:lts 命令拉取 Jenkins 的长期支持(LTS)版本镜像

运行容器

# 在宿主机上创建一个目录,用于存放 Jenkins 的数据 mkdir -p /var/jenkins_home# 为了确保 Jenkins 容器能够正常访问该目录,需要设置适当的权限 chmod 777 /var/jenkins_home# 启动容器 docker run -d --name myjenkins -p 8080:8080 -p 50000:50000 -v /var/jenkins_home:/var/jenkins_home -v /etc/localtime:/etc/localtime -v /usr/bin/docker:/usr/bin/docker -v /var/run/docker.sock:/var/run/docker.sock --restart=always jenkins/jenkins:lts# 参数说明:-d:以后台模式运行容器。--name myjenkins:为容器指定一个名称。-p 8080:8080:将容器的 8080 端口映射到宿主机的 8080 端口,用于访问 Jenkins 的 Web 界面。-p 50000:50000:将容器的 50000 端口映射到宿主机的 50000 端口,用于 Jenkins 的节点和主控节点之间的通信。-v /var/jenkins_home:/var/jenkins_home:将宿主机的/var/jenkins_home 目录挂载到容器的/var/jenkins_home 目录,用于持久化 Jenkins 的数据。-v /etc/localtime:/etc/localtime:将宿主机的时区文件挂载到容器内,确保容器内的时间与宿主机一致。-v /usr/bin/docker:/usr/bin/docker 和 -v /var/run/docker.sock:/var/run/docker.sock:允许容器内的 Jenkins 使用宿主机的 Docker 命令和 Docker 引擎。--restart=always:设置容器在退出时总是自动重启。

执行完后使用 docker ps 命令查看正在运行的容器列表,确认 Jenkins 容器已经启动。

老样子,开放 8080 端口,ip+端口访问页面!

华为云

获取管理员密码

第一次访问需要输入管理员密码,我们有两种方法可以获取到密码!

1. 查看日志

使用 docker logs myjenkins 命令查看 Jenkins 容器的输出日志,找到包含管理员密码的行。

2. 直接查看文件

也可以在宿主机的/var/jenkins_home/secrets/initialAdminPassword 文件中找到管理员密码。

华为云

这里我直接打开刚刚安装的 portainer 界面,找到容器,点击日志图标!

华为云

如下所示 Please use the following password to proceed to installation: 的下面一行就是密码!

华为云

选择安装建议安装的插件!

华为云

安装插件需要等待一会~~~

华为云

安装完成后系统提示我们创建一个新用户,这里我选择使用 admin 用户继续!

华为云

在设置中安装 Gitee 插件

华为云

点击 New Item 创建一个新任务!

华为云

新建流水线项目

Portainer 配置

然后选择第一种任务模式,自由风格软件项目

华为云

在源代码管理 Source Code Management 中选择 Git,打开 gitee 找到自己需要部署的仓库,复制地址。

华为云

粘贴到 Repository URL 中,第一次创建 Credentials 是空的,我们点击下面的 add 新建一个,

华为云

新建 Credentials 时我们只需要填写 Username 和 Password,其他空着就好!

华为云

username 就是刚刚打开 gitee 项目时如下图框框位置,然后 password 官方是建议使用私人令牌的,直接点击蓝色字体参考步骤生成私人令牌复制过来就好了!

华为云

Branches to build 选择你当前仓库要构建的分支,我这里默认是 master 分支

华为云

在这里可以选择远程触发构建,代码变更构建,定时构建等等,我这里选择的是 Build when a change is pushed to Gitee,当 gitee 上的代码发送推送时触发构建!

华为云

勾选之后,滑到下面,点击 Generate,会生成一条密码。注意(这里的上图的 Webhook 和下面生成的密码都要记录下来,稍后我们要配置到 gitee 上)

华为云

Build Environment 中我们勾选第一个,每次构建前删除之前的工作区,以节省内存。

华为云

在 Build Steps 中我们选择新增一个 Execute shell,编写命令来管理容器和镜像。

华为云

输入如下代码!

华为云

下面是对代码的解释,可以根据自己的项目差异进行调整!

# 将当前工作目录更改为 Jenkins 的一个特定工作空间 cd /var/lib/jenkins/workspace/auth_server# 强制删除所有已停止的 Docker 容器 docker container prune -f# 列出所有 Docker 容器(包括未运行的),然后通过管道 (|) 将输出传递给 grep "auth"docker container ls -a | grep "auth"  if [ $? -eq 0 ];then      # 如果存在名为 auth 的容器,并且该容器正在运行,这条命令将停止该容器。    docker container stop auth      # 这条命令删除名为 auth 的容器    docker container rm auth  fi# 强制删除所有未使用的 Docker 镜像 docker image prune -f# 构建一个新的 Docker 镜像 docker build -t auth .# 启动容器 docker run  -d -p 5000:5000 --restart=always --name auth auth

gitee 配置 WebHooks

打开代码仓库,在管理中找到 WebHooks,点击添加 WebHook

华为云

将上面 Jenkins 项目设置中的 Gitee webhook URL 和 Gitee Webhook 密码复制下来,填进去!

华为云

注意:因为 Gitee 中的 bug,就算配置成功了,测试 WebHook 也会出现 404 错误,不要着急,稍后我们去修改一下代码提交一次!

构建

修改完配置之后,我们先手动进行构建一次,测试一下,点击项目中的 build Now。

华为云

在下面会出现每一次的构建记录,点击最新的一次,再点击 Console Output,可以查看我们的构建日志。由下图可见,我此次构建失败了!!!

华为云

从报错信息看出,这个错误信息表示在执行 Jenkins 构建任务时,尝试连接到 Docker 守护进程的 Unix 套接字(/var/run/docker.sock)时遇到了权限问题。因此,构建任务失败。

要解决这个问题,需要确保 Jenkins 用户具有访问 Docker 守护进程的权限。

华为云

打开终端并输入以下命令以创建名为'jenkins' 的用户

sudo adduser jenkins

将'jenkins' 用户添加到 'docker' 组

sudo usermod -a -G docker jenkins

在编辑完成后,需要重新加载 systemd 配置以使更改生效。运行以下命令:

sudo systemctl daemon-reload

重启 Docker 服务以应用新的配置:

sudo systemctl restart docker

如果上述方法不起作用,可以尝试更改/var/run/docker.sock 的权限,使其对所有用户可读写。执行以下命令:

sudo chmod 666 /var/run/docker.sock

请注意,这种方法可能会带来安全风险,因为它允许所有用户访问 Docker 守护进程。在生产环境中,建议仅将特定用户添加到 docker 用户组。

构建成功!

华为云

打开 Portainer 看一下,虽然容器与宿主机映射的是 5000 端口,但其实因为我们没有给.net 项目配置端口,实际上默认还是 8080,这样会与 jenkins 的默认端口冲突,因此我们修改一下代码!

华为云

华为云

修改代码,自动部署

在 appsetting 中加入配置,提交代码!

  "Kestrel": {    "EndPoints": {      "Http": {        "Url": "http://+:5000"      }    }  }

因为我们之前已经配置好了,在代码提交之后,会自动发送一个请求到我们的 jenkins

华为云

然后 jenkins 就会自动开启构建任务了

华为云

老样子,开放 5000 端口!

华为云

访问一下我们的接口,成功!

华为云



审核编辑 黄宇

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分