在Windows服务器上从bitbucket到iis的自动部署

9q78igpj  于 2022-12-29  发布在  Windows
关注(0)|答案(2)|浏览(270)

我想使用bitbucket作为本地服务器和我要部署到的实时服务器之间的中间件。
我正在使用windows服务器2012和iis 8。我正在做一个ASP.NET MVC 5项目。
基本上,我希望重新创建Azure的相同工作流,以实现持续集成:
在本地处理应用程序,然后将更改提交到bitbucket中的master(不一定)分支,服务器随后将与master分支同步以反映更改。
我假设起点是在本地和live服务器上都有一个bitbucket库的副本,但是我很难把本地和live服务器链接到bitbucket。

s5a0g9ez

s5a0g9ez1#

以下是场景:您有一个. NET核心应用程序,它位于Bitbucket存储库中,您使用IIS将其托管在Windows服务器上,并且您希望使用Bitbucket管道设置CI/CD。2如果是这种情况,请继续阅读。
在你过于兴奋之前,请确保已经满足了以下先决条件:

  • 您已经有一个. NET核心项目
  • 已在服务器上配置SSH
  • 在服务器上生成SSH密钥并复制公钥
  • 您的项目位于Bitbucket存储库中
  • 您已在存储库设置中启用了管道

首先,在项目的根目录下创建一个bitbucket-pipelines.yml文件。

    • 步骤1.**
image:  mcr.microsoft.com/dotnet/core/sdk:3.1

在文件的顶部指定你想要使用的镜像。在这种情况下,选择dotnet/core/sdk:3.1镜像,它允许你在后面的步骤中运行dotnet命令。
然后使用pipelines关键字,设置管道中的第一步。

image:  mcr.microsoft.com/dotnet/core/sdk:3.1
pipelines:
    default: 
      - step:
        name: Build App
        caches:
          - dotnetcore
        script:
          - dotnet restore
          - dotnet build --no-restore
          - dotnet publish --no-restore -c Release -o $BITBUCKET_CLONE_DIR/release
        artifacts:
          - release/**

default关键字设置了一个默认步骤,如果分支名称不匹配或文件中没有指定的分支,该步骤将执行。如果您希望将步骤限制在某些分支,您可以使用branches关键字进行指定,如下所示。

branches:
  master:
    - step:

step关键字引入了管道中的第一步,并在script下运行列表中的命令,name只是你给步骤的一个名字。使用缓存来缓存外部依赖项并加快构建时间。你可以阅读更多关于缓存here的信息。
接下来,运行dotnet命令来恢复、构建和发布您的项目。$BITBUCKET_CLONE_DIR是一个环境变量,它指示管道运行时项目被克隆的路径。为了确保发布的文件在该目录中,我将publish命令中的输出设置为克隆目录中名为"release"的目录($BITBUCKET_CLONE_DIR/release)。
对象是在步骤中创建的已保存文件。对象可以从一个步骤传递到另一个步骤。您需要在下一步中使用对象将其移动到服务器。

    • 第2步。**
image:  mcr.microsoft.com/dotnet/core/sdk:3.1
pipelines:
    default: 
      - step:
        name: Build App
        caches:
          - dotnetcore
        script:
          - dotnet restore
          - dotnet build --no-restore
          - dotnet publish --no-restore -c Release -o $BITBUCKET_CLONE_DIR/release
        artifacts:
          - release/**
       #2nd step to deploy to the server
       - step:
         name: Deploy to server
         deployment: staging
         script:
           - pipe: atlassian/scp-deploy:0.3.9
           variables: 
             USER: $USER
             SERVER: $SERVER
             REMOTE_PATH: $REMOTE_PATH
             LOCAL_PATH: 'release/*'
             DEBUG: 'true'

在第二步中,将使用deployment关键字,以便该步骤使用特定于该环境的配置运行。您可以在资料档案库设置中为每个部署设置变量。管道atlassian/scp-deploy使用scp(安全复制协议)将发布的文件移动到服务器。该管道需要一些必要的参数才能通过SSH连接到服务器。

  • USER是服务器上的用户
  • SERVER是服务器的IP或URL
  • REMOTE_PATH是要将文件复制到服务器上的路径,在运行管道之前必须存在
  • LOCAL_PATH是我们需要复制的文件所在的路径。在这种情况下,只需将相对路径设置为我们在上一步中生成的工件
  • DEBUG是可选的,缺省情况下设置为false,但我在处理管道时将其保持为true

此管道的文档可在here中找到。
SSH密钥将另存为资料档案库设置并添加到默认位置,scp管道会自动检查并使用该位置(如果存在)。该管道有一个可选的SSH_KEY参数,允许您使用特定密钥。如果使用此方法,则需要首先将专用密钥编码为base64。

    • 步骤3.**
image:  mcr.microsoft.com/dotnet/core/sdk:3.1
pipelines:
    default: 
      - step:
        name: Build App
        caches:
          - dotnetcore
        script:
          - dotnet restore
          - dotnet build --no-restore
          - dotnet publish --no-restore -c Release -o            $BITBUCKET_CLONE_DIR/release
        artifacts:
          - release/**
      #2nd step to deploy to the server
       - step:
         name: Deploy to server
         deployment: staging
         script:
           - pipe: atlassian/scp-deploy:0.3.9
           variables: 
             USER: $USER
             SERVER: $SERVER
             REMOTE_PATH: $REMOTE_PATH
             LOCAL_PATH: 'release/*'
             DEBUG: 'true'
        #3rd step runs script on server
        - step:
          name: Run batch script
          caches:
            - docker
          script:
            - pipe: docker://accessefm/bat-script-runner:latest
              variables:
              HOST: $SERVER
              USER: $USER
              PORT: $PORT
              SCRIPT_REMOTE_PATH: $DEPLOY_SCRIPT_PATH
              ARGUMENTS: '$SRC $DEST'

在最后一步中,需要在服务器上执行批处理脚本。这是必要的,因为在将管道发布的文件移动到服务器中的项目目录之前,我们需要停止IIS服务,并在完成此操作后重新启动IIS。
在我的例子中,我需要运行一个批处理脚本,因为Windows服务器版本不支持运行Bash脚本,并且必须创建一个自定义管道才能这样做。(服务器必须安装WSL).不过,如果你和我在同一条船上,您可以使用我创建的accessefm/bat-script-runner管道或创建您自己的自定义管道。创建自定义管道的文档可以在here中找到。
就是这样!一个简单的解决方案,只使用Bitbucket管道将. NET核心应用程序部署到服务器上。请记住,这是一个基本的示例,您可能需要增强管道,以便按照您的团队标准工作。
Answer credit Miguel A. Delgado

cu6pst1q

cu6pst1q2#

你应该用Jenkins。
我使用Jenkins创建了一个“自动夜间构建”,它从我的BitBucket repo中提取文件,运行构建,然后将这些文件移动到服务器。
它是免费的,而且它很棒,很容易设置!
https://jenkins.io/

相关问题