从零开始针对 .NET 应用的 DevOps 运营实践 - enkins & SonarQube自动化

发布时间 2023-07-21 15:16:53作者: jack_Meng

从零开始针对 .NET 应用的 DevOps 运营实践 - MSbuild & Java 环境搭建 

一、Overview#

最近的一段时间,在公司里我都在进行基于 Jenkins 和 SonarQube 配合已有的 Gitlab 搭建部门的持续集成环境的工作,虽然之前有使用过 GitHub Actions 和 Azure DevOps,但是从头开始搭建这样的一套 DevOps 环境还是学习到了一些新的知识点,因此,借着这个中秋国庆假期的机会,分享下整个工具链的搭建过程,如果你也有相似的需求的话,希望可以对你有所帮助

二、Contents#

  1. 从零开始针对 .NET 应用的 DevOps 运营实践 - 运行环境搭建

三、Step by Step#

3.1、一些概念#

DevOps, Development 和 Operations,从名称上就可以看出,这一名词包含了软件的开发与运营。当然,这里提到的 DevOps 是一种方法论,更多的是为了打破开发与运营人员之间的壁垒,用来促进开发人员、运营人员以及 QA 人员之间的沟通与协作。通过引入 DevOps 中使用的各种工具,我们可以通过自动化的方式,完成软件系统的构建、测试、发布,从而降低因人工操作所造成的不确定性,提升软件的交付速度、系统质量

在践行 DevOps 方法论时,经常会提到三个概念,持续集成、持续交付、持续部署,这里借由 Redhat 上介绍相关概念的一张图片来说明三者之间的联系

ci cd workflow

  • 持续集成(Continuous Integration):在传统的软件开发过程中,将个人开发的代码与整个项目代码的合并一般都会置于比较靠后的阶段,而持续集成强调的是开发人员提交了新代码之后,立刻进行构建、单元测试。根据测试的结果,确定新代码和原有代码能否正确地集成在一起
  • 持续交付(Continuous Delivery):持续交付是一种自动化的软件交付手段,在持续集成的基础上,代码库中的代码已经做好了部署到正式环境的准备,在目前的通用做法中,将构建之后的代码通过持续交付变更部署到测试环境、预发布环境中,实现对持续集成的扩展,出于业务方面的考虑,我们可以手动选择是否部署到正式环境
  • 持续部署(Continuous Deployment):作为对持续交付的延伸,持续部署能够自动的将最终的代码部署到生产环境中,完成整个的 CI/CD 流程

虽然目前的需求仅仅是为了实现持续集成,完成对于系统的自动化代码检查、自动化单元测试,但是因为后续的功能对于我们完整的实施 DevOps 方法论也是必须的,所以在这几篇的博客内容中,我也会完成对于后续功能的实践分享

3.2、前期调研#

与持续集成的场景存在一些的差异,我们在实际的开发中,并不会在新的功能分支上按照每个开发人员再建立单独的分支,因此,这里的持续集成更多的想要实现的是当开发人员提交代码到 Gitlab 时,自动触发代码检查以及单元测试,产出代码检查报告、单元测试报告、以及整个项目的测试覆盖率

因此,基于目前的需求,整个系统主要依赖于三个主要的软件系统,Gitlab、Jenkins、以及 SonarQube,当然,这里缺少了一个 bug 管理工具,因为我们部门人数不是很多,目前是和别的部门共用的 Redmine 进行的项目管理,所以本次并没有纳入到我们的需求范围内,当然, bug 管理也是推行 DevOps 中不可缺少的一部分

在挑选组件时,本着不给自己和别人挖坑的原则,优先考虑使用人数多的软件系统。因此,作为事实上的开源 CI/CD 工具的标准,毫无疑问选择 Jenkins,而对于代码的自动化检查,结合我们需要实现私有化部署,满足对多种开发语言的支持、能够与 CI/CD 工具进行有效结合的需求,这里最终选择的是 SonarQube

由于历史原因,部门系统的框架版本横跨了 VB.NET、.NET Framework 2.x,4.x 与 .NET Core,.NET 框架的程序涵盖了 Web Form、MVC、Web API,排除掉已经不维护的系统,最终需求的范围限定在支持 .NET Framework 4.x+ 以及 .NET Core 程序上。因此,这里只能选择将 Jenkins 和 SonarQube 部署到 Windows 服务器上,如果你不需要兼容 .NET Framework 的程序,推荐你部署到 Linux 服务器上

在选定好使用的软件后,就需要完成环境的配置,Jenkins 与 SonarQube 都是基于 Java 的软件,因此在安装软件之前,需要我们在服务器上完成 Java 环境的配置,同时,基于我们的系统现状,需要在服务器上安装好 .NET Framework、.NET Core、Git 以及 Node

对于 Git、Node、.NET SDK 的安装,下载安装包后,一直 next 即可,加上这里主要针对的是 .NET 程序员,以及我们的服务器是断网的,所以这里主要列举的是两个相对来说稍微复杂的环境配置,一个是对于 MSBuild 工具的离线下载,另一个则是 Java 环境的配置

3.3、MSBuild 安装#

因为在整个过程中会涉及到对应用程序的编译生成,对于 .NET Core 应用,完全可以采用 .NET Core CLI 中的各种命令来实现,而对于 .NET Framework 程序来说,则需要一个执行应用程序生产的平台,MSBuild 就是这样的一个工具,我们在开发过程中使用 Visual Studio 进行程序编译时,其实也是会借用 MSBuild 来进行的

因此,最简单的办法,就是在服务器上安装 VS 即可,当然,这个过于简单粗暴了,以及在服务器上安装我们开发使用的 IDE 也过于浪费,所以这里还是会选择独立的安装 MSBuild

与 VS 相似,MSBuild 也有不同的版本,为了避免一些莫名其妙的问题,在 MSBuild 的版本选择上,最好选择与你们开发时用的 VS 匹配的版本,因为我们在开发中会使用到了 VS 2017 和 VS 2019 这两个版本,所以这里我会安装两个 MSBuild 到服务器上

对于 MSBuild,之前很多文章中说可以直接把你本地电脑中的 VS 所包含的 MSBuild,丢到服务器上就可以了,经过我的多次尝试,在踩坑的路上越走越远,这里还是建议你通过 Visual Studio Build Tools 进行安装

在 VS 的下载页面,这里是以 VS 2019 的下载页面进行示例,在 Visual Studio 2019 工具这个内容块中,找到生成工具这个下载项,下载即可

Visual Studio Build Tools

这里你可以直接通过我给出的这两个地址,直接下载对应的生成工具,打开软件,找到 MSBuild 这个组件进行安装即可

当然,这个下载完成的也只是一个在线安装包,还是需要连接网络进行下载的,如果你们的服务器也是没有连接外网权限的话,这里需要换个方式

对于离线安装,找到下载后的安装器所在的路径,打开 CMD,输入下面的命令,即可按需下载需要的组件到指定的位置,例如这里我是将下载好的文件放在我桌面上的 msbuild 文件夹下的 offline 文件夹中

Copy
vs_buildtools.exe --layout C:\Users\danvi\Desktop\msbuild\offline --add Microsoft.VisualStudio.Workload.MSBuildTools --add Microsoft.VisualStudio.Workload.WebBuildTools --lang zh-CN

整个命令包含了三个部分的内容

  • --layout:指定离线安装文件所在的路径
  • --add:指定需要下载的组件,因为我们的系统是 Web 项目,为了防止在 MSBuild 中生成出错,所以这里除了 MSBuild 还需要下载了一个 WebBuildTools
  • --lang:指定安装包的语言

离线下载安装包

同新版本的 VS 的安装一样,当我们输入命令之后,会打开如下的页面,等待安装器的下载完成即可

下载安装器

当下载器安装完成后,会自动弹出一个新的控制台页面,坐和放宽,此时已经开始自动下载我们需要的组件,当全部组件下载完成时,按照提示的内容关闭弹出的页面即可

组件安装完成

找到你所指定的下载路径,将整个文件夹拷贝到服务器上,然后点击 vs_buildtools.exe 进行安装,具体安装的组件则可以通过右侧的安装详细信息进行查看,如果你在使用中发现缺少你需要的,按照上面的方法添加新的参数即可

安装 MSBuild

3.4、Java 环境配置#

因为 Jenkins 与 SonarQube 均是 Java 程序,并且 SonarQube 对 Java SDK 的版本有具体的要求,这里我选择的是 OpenJDK 11,你可以从此处(https://jdk.java.net/archive/) 获取到 OpenJDK 的各个发行版本

下载 Java SDK

与 .NET SDK 不同,在习惯了一路 next 就可以安装各种的操作后,在安装 OpenJDK 时,需要手动的将 SDK 的路径以及相关的环境变量添加到操作系统中

解压下载完成的压缩包到指定的路径,例如这里我的路径是 E:\sdk\jdk-11.0.2,此时我们需要对环境变量进行配置,从而确保 Java 环境的正确安装

右击我的电脑,选择属性,打开系统信息页面,点击右侧的高级系统设置,打开系统属性弹窗,当然,你也可以通过 Windows 10 的搜索直接搜索环境变量关键字找到这个页面

环境变量设置

点击环境变量按钮,在系统变量的类别下,我们执行如下的三步操作

  • 新建系统环境变量 JAVA_HOME,变量值为解压后的 OpenJDK 所在的路径,例如我这里配置的 E:\sdk\jdk-11.0.2

    新建 JAVA_HOME 变量

  • 新建系统环境变量值 CLASS_PATH,具体对应的值为 %Java_Home%\lib;

    新建 CLASS_PATH 环境变量

  • 修改已经存在的 PATH 变量,将 %JAVA_HOME%\bin 添加到环境变量中

    修改 PATH 变量

至此,针对 Java 的环境配置已经完成,此时为了避免一些奇怪的错误,建议你重启下电脑。在重启之后,可以通过 java --version 命令来查看是否已经配置成功,如果如下图一样可以显示出 Java 的版本信息,则代表 Java 环境已经配置成功

Java 版本信息

3.5、总结#

自此,目前使用到的软件所需的环境就已经安装配置完成了,在下一篇中就可以安装我们主要使用到的两个软件 Jenkins 和 SonarQube,从而配合我们已经存在的 Gitlab,构建自己的 CI/CD 服务

四、References#

 

 

 出处:https://www.cnblogs.com/danvic712/p/build-a-devops-environment-for-the-dotnet-application.html

=======================================================================================

从零开始针对 .NET 应用的 DevOps 运营实践 - Jenkins & SonarQube 安装配置 

一、Overview#

继续 DevOps 实施的相关内容,在上一篇的博客中,完成了对于工具链中使用到的软件所需的运行环境的配置,在这一篇的博客中,将聚焦于我们使用到的两个主要的软件:Jenkins 与 SonarQube 在 Windows 服务器上的部署安装,为后续 DevOps 的实施,构建软件基础

二、Contents#

  1. 从零开始针对 .NET 应用的 DevOps 运营实践 - 运行环境搭建
  2. 从零开始针对 .NET 应用的 DevOps 运营实践 - Jenkins & SonarQube 安装配置

三、Step by Step#

3.1、前言#

在 Jenkins 与 SonarQube 的版本选择上,这里我选择的都是最新的 LTS 版本,也就是长期支持版本,如果你没有什么特定的需求的话,建议不要选择过于古老的软件版本

这里请重点关注 SonarQube 的版本问题,对于自动化代码检查的数据,SonarQube 支持持久化到常见的数据库中(默认使用的是 H2 数据库),然而 8.x 之后的版本只支持持久化到 Oracle、SQL Server 以及 PostgreSQL,嗯,同 Gitlab 一样,没有 MySQL

因此,如果你需要持久化数据到 MySQL 数据库,最后一个能选择的版本则是 7.7 版本(电梯直达),并且这个版本只支持 MySQL 5.6、5.7,考虑到后续已经不再支持 MySQL 数据库的缘故,请谨慎考虑是否一定要采用该版本

3.2、Jenkins#

3.2.1、程序安装

打开 Jenkins 官网,找到下载页面(https://www.jenkins.io/download/),选择最新的 LTS 版本下载,针对 Windows 平台,可以通过 war 包运行,在 docker 中运行,以及通过 msi 安装包安装之后,作为一个 Windows 服务运行

作为一个需要持续运行的服务,这里我选择通过 msi 方式的来完成程序的部署

下载地址

双击 msi 安装文件,配置软件的安装路径,对于这种基础的软件服务,建议还是放在默认的位置

选择安装路径

因为 Jenkins 在安装之后,是会作为一个独立的 Windows 服务的,如果你需要使用域账户或本地账户作为服务的运行方来运行该服务的话,这里需要进行配置账户、密码

使用账户凭证

Jenkins 默认使用 8080 端口,可以点击下方的 Test Port 按钮来测试当前设定的端口是否已经被占用

设置运行端口

在上一篇中有提到 Jenkins 是基于 Java 进行开发的,在软件的安装过程中,安装程序默认会带出来我们配置的 Java SDK 信息,当然,你也可以在这里针对 Jenkins 设置不同的 Java SDK

设置 Java 版本

完成所需运行环境的配置之后,将 Jenkins 服务所使用的 8080 端口添加到防火墙的白名单中,从而允许别的机器可以访问到该服务

防火墙错误

当配置完成之后,点击 Install 等待安装完成即可,当安装向导提示安装完成时就可以通过浏览器访问 Jenkins

安装完成

3.2.2、基础配置

打开浏览器,按照页面上的提示,我们需要找到位于指定路径上的密码,复制到页面上的输入框,来完成 Jenkins 的解锁,从而继续后续的操作

解锁 Jenkins

解锁之后,Jenkins 会提示你安装一些必要的插件,这里如果你因为网络问题没有安装成功或者压根没有弹出这个页面,也没有关系,后续可以在程序中手动的选择需要安装的插件

插件安装

等待插件的安装完成 or 直接跳过插件的安装,创建一个管理员账户,用来管理我们的 Jenkins 系统,点击下一步,会需要我们配置一个 Jenkins URL,这个地址采用默认的地址即可,这里一定要注意,如果你调整了该 URL 的配置,后续一定要通过 Web 服务器进行反向代理,否则后续会出现各种问题

Jenkins URL

点击保存并完成之后,基本的 Jenkins 运行环境就安装配置完成了,当然,为了实现我们的需求,还需要后续在此基础上,安装各种所需的插件,从而实现构建流水线来完成持续集成的功能

Jenkins

3.3、SonarQube#

3.3.1、程序安装

同 Jenkins 一样,SonarQube 同样选择最新的 LTS 版本进行下载了(电梯直达

SonarQube 下载

SonarQube 下载完成的是一个压缩包,解压压缩包,找到 bin 目录,里面列出了在不同操作系统运行程序的方式,因为我们是在 Windows 平台,所以这里选择 windows-x86-64 文件夹。同样的,作为一个需要常驻的服务,这里最好也将应用作为 Windows 服务进行运行

右击 InstallNTService.bat 选择以管理员身份运行,再使用管理员身份运行 StartNTService.bat 即可

启动 SonarQube 服务

打开浏览器,SonarQube 默认使用 9000 端口,等待一段时间,如果可以看到如下的页面,则代表应用已经安装成功,点击右上角的 Log in,输入默认的账户、密码即可登录到系统中(默认的账户、密码都是 admin)

PS:如果 9000 端口已经被占用了,可以找到 conf 文件下的 sonar.properties 文件修改 sonar.web.port 配置然后重启服务即可

SonarQube 安装

3.3.2、数据持久化

对于自动化的代码检查数据,是具有一定的价值的,因为目前数据还是存储在 SonarQube 内置的 H2 数据库中,为了便于后续的使用,这里选择持久化到 SQL Server 数据库中

PS:请关注你使用的 SonarQube 所支持的数据库版本信息

新建一个数据库,这里必须调整数据库的排序规则为 CS(case-sensitive,区分大小写)、AS(accent-sensitive,区分重低音),例如这里我选择的排序规则为 Chinese_PRC_CS_AS

创建数据库

数据库创建之后,需要执行如下的 SQL 语句,确保当前库的 is_read_committed_snapshot_on 属性设置为 true,这里的 sonar 就是我新建的数据库名称

Copy
-- 查看 is_read_committed_snapshot_on 是否启用
SELECT is_read_committed_snapshot_on FROM sys.databases WHERE name='sonar';

-- 打开 is_read_committed_snapshot_on
ALTER DATABASE sonar SET READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMMEDIATE;

数据库设置完成之后,我们需要下载 Microsoft SQL JDBC Driver 7.2.2 package 这个 SQL Server 的 JDBC 驱动到本地,这里选择下载压缩包

下载 JDBC 驱动

找到下载之后的压缩包解压,选择 auth 路径下的 x64 文件夹,获取到这个 64 位的 sqljdbc_auth.dll 文件,拷贝到 SonarQube 的路径下,这里我在 \extensions\jdbc-driver 路径下新建了一个 mssql 文件夹用来存放这个 dll 文件

拷贝授权文件

驱动下载完成后,找到 conf 文件下的 sonar.properties 文件,修改数据库连接信息,重新启动 SonarQube 服务,等待数据库表的创建完成,嗯,这个过程比较慢,耐心等待

修改 SQL Server 配置

等待应用的重新启动完成,与 Jenkins 相同,我们可以安装各种插件来丰富 SonarQube,这里我们可以在登录系统后,点击 Administration 菜单,在 Marketplace 中,下载所需的插件,例如这里可以下载中文的语言包,重启之后,系统就变成了中文

下载中文插件

同样的,针对服务器无法连接外网的同学,我们可以从网络上找到需要的插件进行下载,然后放到程序运行路径下的 \extensions\plugins 文件夹中,重启服务即可

3.4、总结#

自此,Jenkins 和 SonarQube 就已经安装配置完成了,当然,为了实现我们的需求,在实际使用时 Jenkins 还需要安装一些必须的插件,在下一章中,就可以通过与 Gitlab 进行串接,完成 .NET 应用的持续集成工作

 

 

出处:https://www.cnblogs.com/danvic712/p/install-jenkins-and-sonarqube-on-windows-server.html