使用 Azure Pipelines 将项目部署到物理机

Deploy artifacts to physical machine with Azure Pipelines

我有一个使用 Azure 管道构建的项目,工件被发送到文件共享和 Azure DevOps。自托管代理当前用于构建我的项目的管道。现在我想将我的工件部署到我公司网络中的物理计算机上。 Artifacts是支持"silent installation mode"的安装文件,所以我用PowerShell执行对应的文件就可以全部安装了

我的问题是:我应该怎么做才能实现我的目标?我认为我会简单地创建一个发布管道(我使用 Microsoft 的经典 UI 管道编辑器)并添加必要的任务。最后一切都会像这样:

  1. 从构建产品的计算机复制工件 (A) 到要安装产品的计算机 (B)。
  2. 执行主要服务所需的服务安装 申请。
  3. 从主应用程序执行安装。这是 正确的做法还是我应该选择别的东西?

还有一个问题。我不太清楚我应该如何划分部署阶段,因为:步骤1仍然由计算机A上的代理完成。步骤2和3应该已经由另一个代理完成。因此,计算机 B 上也必须有一个代理(我总共需要两个代理,一个用于计算机 A 上的构建管道,一个用于目标计算机 B)。对吗?

我们有一个具有类似要求的 Web 应用程序,当我们将应用程序部署到该位置时,我们需要包含特定于位置的文件。

我不确定这是最佳路线,但我们在部署管道中使用了 Ansible。我们的 Ansible 剧本利用主机文件,其中包含要部署的位置和 jar 版本的变量。

同样,我们的情况不同,但应该一样。

例如,您也许可以这样做...

您的 Ansible 清单(主机)文件可能如下所示

[servers]
xxx.xxx.xxx.xxx

[all:vars]
app_name=mfgweb
env=qa
app_version=2020.03.4

*** If your artifact is a jar file
jar_group=com.somegroup
jar_name=some_jar <-- note: no extentsion
jar_version=2019.11.3

你的剧本可能看起来像这样

---
- hosts: localhost
  connection: local

  tasks:
  - name: Find  old working directories
    find:
        paths: /tmp
        patterns: 'ansible.*'
        file_type: directory
        age: 2d
    register: tmp_dirs

  - name: Cleanup old working directories
    file:
        path: "{{ item }}"
        state: absent
    loop: "{{ tmp_dirs.files | map(attribute='path') | list }}"

  - name: Create working directory
    tempfile:
        state: directory
        suffix: work
    register: workdir

  - name: Download artifact
    maven_artifact:
        group_id: "{{ jar_group }}"
        artifact_id: "{{ jar_name }}"
        version: "{{ jar_version }}"
        repository_url: "{{ artifacts_url }}"
        username: "{{ artifacts_user }}"
        password: "{{ artifacts_password }}"
        verify_checksum: never
        dest: "{{ workdir.path }}/{{ app_name }}/"

这只是一个示例,但您可以使用 yum and/or pip 在您的 playbook 中安装所需的软件。

Deploy artifacts to physical machine with Azure Pipelines

我觉得你已经很接近答案了,但我不确定我提供的建议是否是最好的,因为它更多的是一个品味问题,你可以在下面查看我的建议。

我们可以通过计算机 A 上的一个代理来实现这一点:

  • 使用 Remote Copy 任务通过 计算机 A.
  • 上的代理将工件复制到 computer B
  • 计算机 A.
  • 上使用 Powershell execute install files with command line arguments on remote computer 代理

这样的话,我们就不需要在B机上新建agent,也不需要划分部署阶段。