zoukankan      html  css  js  c++  java
  • 利用Jenkins+SVN+Windows服务对NetCore项目实行持续集成、自动化部署CI/CD

    前言:
    最近在做NetCore项目,因为项目是部署在WinServer的IIS上(别问我为啥不用Linux),而更新的办法是采用mstsc(远程桌面)后手动复制覆盖dll文件。
    而作为一个只会CRUD的菜鸟本鸟,在每次修改完代码提交SVN以后,都得知会专人等待发布更新,相当痛苦。
    由于是项目开发初期,代码的版本迭代很频繁,不及时更新造成的结果就是与前端的对接也相应延后,项目进度拖延是肯定的,这好吗?这不好!
    由此可见部署一套可行的版本管理、CI/CD方案是多么重要。
    下面本人将展示,自己安装配置这一套的全过程(多图警告!)

    1. 准备工具:

    2. 搭建SVN Server服务并建立svn仓库

    • 下载上面的安装包以后,我们就开始安装SVNServer了,一路下一步就ok了,这里我指定端口为4437

    • 安装完了SVN服务,我们就要建立一个用于管理代码版本的SVN仓库了

    • 这里建一个名为Net5Repo的仓库

    • 并建一个具有读写权利的用户admin

    • 建完了仓库,我们再把SVN连接工具安装上(也是一路下一步,这里不多赘述)。

    • 然后找个文件夹CheckOut下来。因为我们是搭的本地SVN服务,路径就是https://localhost:4437/svn/ {仓库名},这里{仓库名}就是上面我们建的Net5Repo

    • 点击OK后会验证账户密码,输入正确以后就能把仓库拉取下来了。

    3. 新建Net5.0项目,并传至svn仓库

    • 打开VS2019新建Net5.0项目,

    • 这里我们就建一个名为NetApi的Web项目

    • 注意选择NetCore版本

    • 这里用运行win+r打开cmdcd到项目根目录,然后启动项目。

    cd C:WorkSpaceSVNNet5RepoNetApi
    dotnet run

    • 因为net 5.0集成了swagger,因此我们可以直接访问Api地址: https://localhost:5001/swagger/index.html

    • swagger可以代替接口文档对接前端,实际开发中只要把这个地址丢过去就行了,简直不要太完美。

    • 提交我们项目的第一版到SVN仓库

    • 但是可以看到 提交的文件非常多,乱七八糟,有些是vs编译产生的临时文件,例如/bin/obj*.csproj.user(vs用户的本地配置文件),我们肯定是不能维护进版本库的,因此添加规则,忽略之。

      • 首先右键我们的项目文件夹NetApi,依次选择TortoiesSVN->Properties,点击New...,选择Other,属性名选择svn:global-ignores,然后敲入binobj,点击ok。

      • 然后对NetApi文件夹下的bin以及obj文件夹标记为删除,最后提交。这样一来编译产生的文件就不会出现在提交列表里,非常的干净清爽。

    4. 安装并配置jenkins

    • 首先安装Jenkins

      • 这里把端口指定为8888
      • 然后按提示步骤一步步下去。
      • 这里要注意选择安装推荐的插件,可以省不少事。
      • 安装完插件重启后,会让你创建管理员,这里我们创建一个admin账户。
    • 然后登录jenkins

    • 安装Subversion插件,依次点击Manage Jenkins->Manage Plugins,搜索Subversion勾选安装并重启。

    • 接下来就开始配置任务了,我们在首页点击新建Item,任务名就叫NetApi,选择FreeStyle Project (yeah~ freestyle!)

    1. 我们在源码管理里选择Subversion(SVN)

    2. 构建触发器里定义条件,选择Poll SCM(具体规则可以点击右侧的查看),这里我们设定5分钟检测一次 H/5 * * * *

    3. 我们先保存后点击Build Now构建一次看看效果。可以看到东西都被下载到了工作区。

    4. 这里我们以Jenkins构建后的工作区(workspace)为主,编译发布NetCore项目,然后建立成服务。

      • 我们打开cmdcd到工作区里,一般文件路径为:主目录路径(可在首页点击Manage Jenkins->Configure System中查看)workspace任务名(这里我们是NetApi)
        cd C:WindowsSystem32configsystemprofileAppDataLocalJenkins.jenkinsworkspaceNetApi

      • 然后发布到指定文件夹(微软dotnet CLI指令文档),这里指定为 C:WorkSpacePublishSiteNetApi
        dotnet publish -o C:WorkSpacePublishSiteNetApi

      • 可以看到编译后的文件都被发布到了我们指定的目录下,

      • 接着我们以管理员方式打开cmd,输入以下指令,建立服务。服务名为NetApibindPath需要绝对路径指定到具体的*.exe文件,端口我们设置为8800,启动方式为auto(自动),然后敲入启动指令,却发现失败了。
        sc create NetApi binPath= "C:WorkSpacePublishSiteNetApiNetApi.exe --urls="http://127.0.0.1:8800"" DisplayName= "net接口" start= auto

      • 查阅文档是缺少了引用包,Microsoft.Extensions.Hosting.WindowsServicesMicrosoft.AspNetCore.Hosting.WindowsServices,并修改Program.csIHostBuilder方法。我们照做之,代码如下。

      namespace NetApi
      {
          public class Program
          {
              public static void Main(string[] args)
              {
                  CreateHostBuilder(args).Build().Run();
              }
              public static IHostBuilder CreateHostBuilder(string[] args) =>
                   Host.CreateDefaultBuilder(args)
                      .UseWindowsService()//添加此行
                      .ConfigureWebHostDefaults(webBuilder =>
                      {
                          webBuilder.UseStartup<Startup>();
                      });
          }
      }
      
      • 然而此处有一个坑,因为发布后的版本采用的环境是Production,新建项目默认只在Development开启Swagger,因此我们需要修改Startup.csConfigure方法。
      public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
      {
      if (env.IsDevelopment())
      {
         app.UseDeveloperExceptionPage();
      }
         app.UseSwagger();
         app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "NetApi v1"));
         app.UseRouting();
         app.UseAuthorization();
         app.UseEndpoints(endpoints =>
         {
             endpoints.MapControllers();
         });
      }
      
      • 然后我们提交svn,可以看到jenkins自动构建了本次提交。

      • 重复上述cdjenkins工作区,然后发布dotnet publish -o 的工作,我们成功注册了NetApi的服务,并启动之。

      • 然后打开浏览器访问 http://localhost:8800/swagger/index.html 可以看到服务起来了。

      • 打开任务管理器也能看到

      • 如此一来我们也就清楚了,该如何利用cmd的命令行来编译、发布并部署Net5.0项目,继续配置jenkins

    5. 构建里我们选择Execute Windows batch command。并贴入如下代码并保存。

      sc stop NetApi
      dotnet publish -o C:WorkSpacePublishSiteNetApi
      sc start NetApi
      
      • 点击Build Now,检查下是否构建成功。

      • 可以看到一切顺利,服务也成功跑起来了。

    好了到此,我们就算是把这一套CI/CD给安装配置完毕了,写个简单接口测试下

    • 新建控制器 UserController.cs,添加Login的Get方法,返回success字符串。

    • 然后提交svn。

    • 直接打开swagger页面,刷新下,自动发布更新了。。

    • 看下jenkins自动构建了。

    完毕。

  • 相关阅读:
    ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车按键启动和蜂鸣器报警
    ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车指定花式动作
    ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车指定花式动作
    ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车指定花式动作
    ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车前后左右综合实验
    ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车前后左右综合实验
    ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车前后左右综合实验
    asp中设置session过期时间方法总结
    asp中设置session过期时间方法总结
    ASP.NET关于Session_End触发与否的问题
  • 原文地址:https://www.cnblogs.com/qinko/p/14142805.html
Copyright © 2011-2022 走看看