• Azure DevOps (十一) 通过Azure Devops部署一个.NET Core WebAPI


    前几篇文章中,我们讨论了如何通过流水线实现项目的编译、上传、打包、部署等操作,今天我们来实现一套完整的流程,把之前碎片化的知识点给串起来。

    文章配套视频专栏:

    https://space.bilibili.com/38649342/channel/seriesdetail?sid=2267536

    本次我们使用一个ASP.NET Core的WebApi项目来进行项目的演示,后面也会写java和golang的。

    首先我们先创建一个ASP.NET Core WebAPI的模板项目,使用IDE创建就可以,我用的是jb全家桶的rider.

     

    创建完成之后,我们稍微对项目做一点点修改,主要修改的内容为:关闭HTTP重定向,关闭鉴权,更改启动端口为5001.

    在Program.cs中删除 HTTP重定向,鉴权的代码,在luanchsetting.json中更改启动端口为5000,注意这里改的只是你本地debug时候的端口和编译后部署时的不是一个配置。

     

     

     这些搞好之后,启动项目,会自动弹开swagger的页面,我们访问一下里面的模板接口,可以看到返回了一个标准的json数据结构。

     

    这些都准备好之后,我们把我们的代码推送到仓库里去,创建仓库的步骤不在赘述,我在系列文章的第一篇里已经做了介绍:《Azure DevOps (一) 托管自己的Git仓库

    代码推送好之后,我们开始创建编译流水线来编译我们的webapi代码。

    点击流水线,创建流水线之后右侧第一个选项就是.NET Core。毕竟是微软的亲儿子,地位都不一样,点击添加之后,我们可以看到有很多的选项

    来执行不同的阶段,我们本次的目标是部署项目,所以我们使用publish来执行。

     

     

     添加的时候这里要注意下把web project的勾给取消掉,打这个勾是默认编译mvc项目的他会去找你的wwwroot文件和webconfig

     

     

     

    勾选完之后我们执行一下编译,然后就发现了一个天大的雷,身为微软的亲儿子,这个.NET Core的编译插件居然TM的不支持.NET 6,是的,你没听错,我都怀疑这爹不是亲的。(╯‵□′)╯︵┻━┻

     

     

     

     既然出了这档子事儿,我们也只能自己想办法了,我选择的是自己下载.NET6的SDK,自己编译。

    我们打开.net core的官网,选择linux安装.net core sdk  网站地址:https://docs.microsoft.com/zh-cn/dotnet/core/install/linux-ubuntu#2110-

    因为我们流水线的运行环境是乌班图,所以我装的是乌班图的。

    安装命令如下:

    复制代码
    wget https://packages.microsoft.com/config/ubuntu/21.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
    sudo dpkg -i packages-microsoft-prod.deb
    rm packages-microsoft-prod.deb
    sudo apt-get update; \
    sudo apt-get install -y apt-transport-https && \
    sudo apt-get update && \
    sudo apt-get install -y dotnet-sdk-6.0
    复制代码

    然后我们在执行一下编译命令 dotnet publish

    最后我们整理一下azure的流水线脚本,因为没有插件可用,所以这次的脚本需要我们自己纯手打,我们在script节点中加入sdk安装命令,然后创建第二个scprit节点用来进行项目的编译

    当然全部写在一个里面也没有什么问题,但是还是建议分开,看着清爽。

    脚本如下:

    复制代码
    # Starter pipeline
    # Start with a minimal pipeline that you can customize to build and deploy your code.
    # Add steps that build, run tests, deploy, and more:
    # https://aka.ms/yaml
    
    trigger:
    - main
    
    pool:
      vmImage: ubuntu-latest
    
    steps:
    - script: echo Hello, world!
      displayName: 'Run a one-line script'
    
    - script: |
        echo Add other tasks to build, test, and deploy your project.
        echo See https://aka.ms/yaml
        wget https://packages.microsoft.com/config/ubuntu/21.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
        sudo dpkg -i packages-microsoft-prod.deb
        rm packages-microsoft-prod.deb
        sudo apt-get update; \
        sudo apt-get install -y apt-transport-https && \
        sudo apt-get update && \
        sudo apt-get install -y dotnet-sdk-6.0
      displayName: 'Run a multi-line script'
    - script:
       cd /home/vsts/work/1/s;
       dotnet publish;
       cd /home/vsts/work/1/s/azure_dotnet_app/bin/Debug/net6.0/publish/;
       ls
      displayName: "publish dotnet"
    复制代码

    然后我们运行一下看看效果,可以看到成功的安装了SDK6

     

    然后执行dotnet publish,这次成功完成了编译

     

     

     编译完之后,我们需要添加一下制品上传步骤,和我们之前的文章中一样,我们需要把制品上传到流水线的仓库上去方便后面使用。

    编辑流水线,添加制品上传,目录选择我们的publish的目标目录,最后完成的流水线脚本如下:

    复制代码
    # Starter pipeline
    # Start with a minimal pipeline that you can customize to build and deploy your code.
    # Add steps that build, run tests, deploy, and more:
    # https://aka.ms/yaml
    
    trigger:
    - main
    
    pool:
      vmImage: ubuntu-latest
    
    steps:
    - script: echo Hello, world!
      displayName: 'Run a one-line script'
    
    - script: |
        echo Add other tasks to build, test, and deploy your project.
        echo See https://aka.ms/yaml
        wget https://packages.microsoft.com/config/ubuntu/21.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
        sudo dpkg -i packages-microsoft-prod.deb
        rm packages-microsoft-prod.deb
        sudo apt-get update; \
        sudo apt-get install -y apt-transport-https && \
        sudo apt-get update && \
        sudo apt-get install -y dotnet-sdk-6.0
      displayName: 'Run a multi-line script'
    - script:
       cd /home/vsts/work/1/s;
       dotnet publish;
       cd /home/vsts/work/1/s/azure_dotnet_app/bin/Debug/net6.0/publish/;
       ls
      displayName: "publish dotnet"
    
    
    - task: PublishBuildArtifacts@1
      inputs:
        PathtoPublish: '/home/vsts/work/1/s/azure_dotnet_app/bin/Debug/net6.0/publish/'
        ArtifactName: 'dotnet_app'
        publishLocation: 'Container'
    复制代码

    完成之后运行流水线,我们就可以在流水线的运行脚本结果中看到我们的流水线制品

     

     然后接下来,我们去创建发布流水线,发布流水线的内容非常简单,前几篇的文章中我们使用的是FTP,后来我发现SFTP更好用,所以这里我们用SFTP

     

     

     然后我们去准备一下服务器的环境,在服务器上安装一下sdk和nginx,顺道配置一下守护进程,代码如下:

    centos安装sdk:

    sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
    sudo yum install dotnet-sdk-6.0

    安装nginx

    yum install nginx
    systemctl restart nginx

    配置守护进程

    复制代码
    [Unit]
    Description=Example .NET Web API App running on Ubuntu
    
    [Service]
    WorkingDirectory=/home/dotnet_app
    ExecStart=/usr/bin/dotnet /home/dotnet_app/azure_dotnet_app.dll
    Restart=always
    # Restart service after 10 seconds if the dotnet service crashes:
    RestartSec=10
    KillSignal=SIGINT
    SyslogIdentifier=dotnet-example
    User=root
    Environment=ASPNETCORE_ENVIRONMENT=Production
    Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
    
    [Install]
    WantedBy=multi-user.target
    复制代码

    配置反向代理:

    复制代码
    server {
            listen       80;
            listen       [::]:80;
            server_name  _;
            root         /usr/share/nginx/html;
      location / {
            proxy_pass         http://localhost:5000;
            proxy_http_version 1.1;
            proxy_set_header   Upgrade $http_upgrade;
            proxy_set_header   Connection keep-alive;
            proxy_set_header   Host $host;
            proxy_cache_bypass $http_upgrade;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header   X-Forwarded-Proto $scheme;
        }
            # Load configuration files for the default server block.
            include /etc/nginx/default.d/*.conf;
    复制代码

    启动守护进程:

    systemctl enable app
    systemctl start app
    systemctl status app

    查看服务状态,服务正常运行。

     

     然后,我们更改一下项目的源代码,返回一句祖传问候

     

     然后在流水线中添加脚本命令:systemctl restart app

     

     最后我们重新运行一下流水线,等待流水线运行完后,我们访问一下接口地址

     

     

    成功输出祖传问候,第一个ASP.NET Core的流水线创建成功,完结撒花。

    文章虽短,但是写这篇文章用了三个小时才完成,踩了一堆的坑,大家在调试过程中需要多多注意。

  • 相关阅读:
    XiaodiSec day028 Learn Note 小迪安全学习笔记
    机器学习和深度学习的区别
    Win11如何开启移动热点?Win11开启移动热点的方法
    【MySQL】增删改查进阶
    (四)进程管理:进程基本概念
    KWin、libdrm、DRM从上到下全过程 —— drmModeAddFBxxx(17)
    代季峰对话张祥雨 | 自动驾驶感知新时代!新一代环视感知算法BEVFormer有哪些优势...
    leetcode-每日一题-119-杨辉三角2(简单,dp)
    上半年业绩韧性增强,两大核心业务成第二增长点,商汤用硬科技冲刺AI长跑
    adb设备调试常用命令
  • 原文地址:https://www.cnblogs.com/Tassdar/p/16170323.html