Узнайте, как развернуть сервер Jenkins с помощью Azure Bicep.

В этой статье показано, как развернуть Jenkins с помощью Infrastructure-As-Code с Azure Bicep, доменным языком (DSL) для декларативного развертывания ресурсов Azure.

Jenkins — это сервер автоматизации с открытым исходным кодом, который помогает автоматизировать сборку, тестирование и развертывание любого проекта на нескольких платформах.

Jenkins помогает избежать критических изменений, чтобы вы могли сэкономить время и обеспечить поставку высококачественного программного обеспечения. Его веб-интерфейс позволяет легко управлять приложениями и тестировать их перед запуском в производство.

Этот шаблон Bicep включает в себя последние версии рекомендуемых сообществом плагинов, включая конвейеры и интеграцию с Git.

Предпосылки

Для развертывания решения вам потребуется следующее:

Давайте начнем!

  • Примечание. Перед развертыванием этого решения мы должны принять юридические условия образа виртуальной машины. Чтобы прочитать и принять юридические условия, вы можете использовать PowerShell для принятия условий с помощью приведенного ниже командлета:
Get-AzMarketplaceTerms `
-Publisher 'bitnami' `
-Product 'jenkins' `
-Name '1-650' |
Set-AzMarketplaceTerms -Accept

Обзор решения

Мы создадим шаблон Bicep, который создает сервер Jenkin.

Решение будет включать следующие файлы:

  • main.bicep: это шаблон бицепса.
  • azuredeploy.parameters.json: эти файлы параметров содержат значения, используемые для развертывания шаблона Bicep.

Этот шаблон предоставляет учетную запись хранения, виртуальную сеть, группы доступности, общедоступный IP-адрес и сетевой интерфейс, необходимые для установки.

Теперь давайте поработаем над нашим шаблоном бицепса.

1. Шаблон Azure Bicep — параметры

Создайте новый файл в своем рабочем каталоге и назовите его «main.bicep». Определим следующие параметры:

param location string
param networkInterfaceName string
param networkSecurityGroupName string
param networkSecurityGroupRules array
param subnetName string
param virtualNetworkName string
param addressPrefixes array
param subnets array
param publicIpAddressName string
param publicIpAddressType string
param publicIpAddressSku string
param virtualMachineName string
param virtualMachineComputerName string
param osDiskType string
param virtualMachineSize string
param adminUsername string
@secure()
param adminPassword string

2. Шаблон Azure Bicep — переменные

Мы определим следующие переменные:

var nsgId = resourceId(resourceGroup().name, 'Microsoft.Network/networkSecurityGroups', networkSecurityGroupName)
var vnetId = resourceId(resourceGroup().name, 'Microsoft.Network/virtualNetworks', virtualNetworkName)
var subnetRef = '${vnetId}/subnets/${subnetName}'

3. Шаблон Azure Bicep — ресурсы

Мы определим следующие ресурсы:

resource networkInterfaceName_resource 'Microsoft.Network/networkInterfaces@2021-03-01' = {
  name: networkInterfaceName
  location: location
  properties: {
    ipConfigurations: [
      {
        name: 'ipconfig1'
        properties: {
          subnet: {
            id: subnetRef
          }
          privateIPAllocationMethod: 'Dynamic'
          publicIPAddress: {
            id: pip.id
          }
        }
      }
    ]
    networkSecurityGroup: {
      id: nsgId
    }
  }
  dependsOn: [
    networkSecurityGroupName_resource
    virtualNetworkName_resource
    pip
  ]
}
resource networkSecurityGroupName_resource 'Microsoft.Network/networkSecurityGroups@2019-02-01' = {
  name: networkSecurityGroupName
  location: location
  properties: {
    securityRules: networkSecurityGroupRules
  }
}
resource virtualNetworkName_resource 'Microsoft.Network/virtualNetworks@2020-11-01' = {
  name: virtualNetworkName
  location: location
  properties: {
    addressSpace: {
      addressPrefixes: addressPrefixes
    }
    subnets: subnets
  }
}
resource pip 'Microsoft.Network/publicIpAddresses@2019-02-01' = {
  name: publicIpAddressName
  location: location
  properties: {
    publicIPAllocationMethod: publicIpAddressType
  }
  sku: {
    name: publicIpAddressSku
  }
}
resource virtualMachineName_resource 'Microsoft.Compute/virtualMachines@2021-03-01' = {
  name: virtualMachineName
  location: location
  properties: {
    hardwareProfile: {
      vmSize: virtualMachineSize
    }
    storageProfile: {
      osDisk: {
        createOption: 'FromImage'
        managedDisk: {
          storageAccountType: osDiskType
        }
      }
      imageReference: {
        publisher: 'bitnami'
        offer: 'jenkins'
        sku: '1-650'
        version: 'latest'
      }
    }
    networkProfile: {
      networkInterfaces: [
        {
          id: networkInterfaceName_resource.id
        }
      ]
    }
    osProfile: {
      computerName: virtualMachineComputerName
      adminUsername: adminUsername
      adminPassword: adminPassword
      linuxConfiguration: {
        patchSettings: {
          patchMode: 'ImageDefault'
        }
      }
    }
    diagnosticsProfile: {
      bootDiagnostics: {
        enabled: true
      }
    }
  }
  plan: {
    name: '1-650'
    publisher: 'bitnami'
    product: 'jenkins'
  }
}

4. Файл параметров

Создайте новый файл с именем «azuredeploy.parameters.json». Код ниже показывает определение файла параметров:

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "location": {
            "value": "eastus"
        },
        "networkInterfaceName": {
            "value": "jenkinsvm109"
        },
        "networkSecurityGroupName": {
            "value": "jenkinsvm-nsg"
        },
        "networkSecurityGroupRules": {
            "value": [
                {
                    "name": "HTTP",
                    "properties": {
                        "priority": 1010,
                        "protocol": "TCP",
                        "access": "Allow",
                        "direction": "Inbound",
                        "sourceApplicationSecurityGroups": [],
                        "destinationApplicationSecurityGroups": [],
                        "sourceAddressPrefix": "*",
                        "sourcePortRange": "*",
                        "destinationAddressPrefix": "*",
                        "destinationPortRange": "80"
                    }
                },
                {
                    "name": "HTTPS",
                    "properties": {
                        "priority": 1020,
                        "protocol": "TCP",
                        "access": "Allow",
                        "direction": "Inbound",
                        "sourceApplicationSecurityGroups": [],
                        "destinationApplicationSecurityGroups": [],
                        "sourceAddressPrefix": "*",
                        "sourcePortRange": "*",
                        "destinationAddressPrefix": "*",
                        "destinationPortRange": "443"
                    }
                },
                {
                    "name": "SSH",
                    "properties": {
                        "priority": 1030,
                        "protocol": "TCP",
                        "access": "Allow",
                        "direction": "Inbound",
                        "sourceApplicationSecurityGroups": [],
                        "destinationApplicationSecurityGroups": [],
                        "sourceAddressPrefix": "*",
                        "sourcePortRange": "*",
                        "destinationAddressPrefix": "*",
                        "destinationPortRange": "22"
                    }
                }
            ]
        },
        "subnetName": {
            "value": "default"
        },
        "virtualNetworkName": {
            "value": "YOUR-VNET-NAME"
        },
        "addressPrefixes": {
            "value": [
                "10.0.0.0/16"
            ]
        },
        "subnets": {
            "value": [
                {
                    "name": "default",
                    "properties": {
                        "addressPrefix": "10.0.0.0/24"
                    }
                }
            ]
        },
        "publicIpAddressName": {
            "value": "PUBLIC-IP-NAME"
        },
        "publicIpAddressType": {
            "value": "Dynamic"
        },
        "publicIpAddressSku": {
            "value": "Basic"
        },
        "virtualMachineName": {
            "value": "VM-NAME"
        },
        "virtualMachineComputerName": {
            "value": "YOUR-VM-COMPUTER-NAME"
        },
        "osDiskType": {
            "value": "Premium_LRS"
        },
        "virtualMachineSize": {
            "value": "Standard_D2as_v4"
        },
        "adminUsername": {
            "value": "YOUR-ADMIN-USERNAME"
        },
        "adminPassword": {
            "value": "YOUR-PASSWORD"
        }
    }
}

5. Шаблон Azure Bicep — развертывание

Мы будем использовать приведенную ниже команду для развертывания нашего шаблона Bicep:

$date = Get-Date -Format "MM-dd-yyyy"
$deploymentName = "AzInsiderDeployment"+"$date"
New-AzResourceGroupDeployment -Name $deploymentName -ResourceGroupName azinsider_demo -TemplateFile .\main.bicep -TemplateParameterFile .\azuredeploy.parameters.json -c

На изображении ниже показан предварительный просмотр развертывания:

Затем мы выполним развертывание. На изображении ниже показан результат развертывания:

Теперь давайте проверим статус Дженкинса. Вы можете использовать общедоступный IP-адрес виртуальной машины и получить доступ к Jenkins через браузер, используя порт 443:

Полный код этого решения можно найти здесь:



👉 Присоединяйтесь к списку рассылки AzInsider здесь.

-Дэйв Р.