GitHub Actions ve Azure ile özel sanal makine görüntüleri oluşturma
Sanal makine görüntüsü oluşturmak için bir iş akışı oluşturarak GitHub Actions'ı kullanmaya başlayın.
GitHub Actions ile iş akışlarınızdaki yapıtlarla özel sanal makine görüntüleri oluşturarak CI/CD işleminizi hızlandırabilirsiniz. Hem görüntü oluşturabilir hem de bunları bir Paylaşılan Görüntü Galerisi dağıtabilirsiniz.
Ardından bu görüntüleri kullanarak sanal makineler ve sanal makine ölçek kümeleri oluşturabilirsiniz.
Sanal makine görüntüsü oluşturma eylemi, Azure Image Builder hizmetini kullanır.
- Etkin aboneliği olan bir Azure hesabı. Ücretsiz hesap oluşturun.
- Etkin bir depoya sahip bir GitHub hesabı. Hesabınız yoksa ücretsiz olarak kaydolun.
- Bu örnekte Java Spring PetClinic Örnek Uygulaması kullanılmaktadır.
- Görüntü içeren bir Azure İşlem Galerisi.
- Azure İşlem Galerisi oluşturun.
- Görüntü oluşturma.
İş akışı, deponuzdaki yoldaki /.github/workflows/
bir YAML (.yml) dosyası tarafından tanımlanır. Bu tanım, iş akışını oluşturan çeşitli adımları ve parametreleri içerir.
Dosyanın üç bölümü vardır:
Bölüm | Görevler |
---|---|
Kimlik Doğrulaması | 1. Kullanıcı tarafından yönetilen bir kimlik ekleyin. 2. Hizmet sorumlusu veya Açık Kimlik Bağlan ayarlayın. 3. GitHub gizli dizisi oluşturun. |
Yapı | 1. Ortamı ayarlayın. 2. Uygulamayı oluşturun. |
Görsel | 1. VM Görüntüsü oluşturun. 2. Bir sanal makine oluşturun. |
Görüntüleri dağıtmak için Azure Görüntü Oluşturucusu(AIB) için kullanıcı tarafından yönetilen bir kimliğe ihtiyacınız olacaktır. Azure kullanıcı tarafından atanan yönetilen kimliğiniz, görüntü derlemesi sırasında görüntüleri okumak ve bir Paylaşılan Görüntü Galerisi yazmak için kullanılır.
Azure CLI veya Azure portalı ile kullanıcı tarafından yönetilen bir kimlik oluşturun. Yönetilen kimliğinizin adını yazın.
Bu JSON kodunu özelleştirin. ve
{rgName}
yer{subscriptionID}
tutucularını abonelik kimliğiniz ve kaynak grubu adınızla değiştirin.{ "properties": { "roleName": "Image Creation Role", "IsCustom": true, "description": "Azure Image Builder access to create resources for the image build", "assignableScopes": [ "/subscriptions/{subscriptionID}/resourceGroups/{rgName}" ], "permissions": [ { "actions": [ "Microsoft.Compute/galleries/read", "Microsoft.Compute/galleries/images/read", "Microsoft.Compute/galleries/images/versions/read", "Microsoft.Compute/galleries/images/versions/write", "Microsoft.Compute/images/write", "Microsoft.Compute/images/read", "Microsoft.Compute/images/delete" ], "notActions": [], "dataActions": [], "notDataActions": [] } ] } }
JSON ile yeni bir özel rol oluşturmak için bu JSON kodunu kullanın.
Azure portalında Azure İşlem Galerinizi açın ve Erişim denetimi (IAM) bölümüne gidin.
Rol ataması ekle'yi seçin ve Görüntü Oluşturma Rolünü kullanıcı tarafından yönetilen kimliğinize atayın.
Azure CLI'da az ad sp create-for-rbac komutuyla bir hizmet sorumlusu oluşturun. Azure portalında veya Deneyin düğmesini seçerek bu komutu Azure Cloud Shell ile çalıştırın.
az ad sp create-for-rbac --name "myML" --role contributor \
--scopes /subscriptions/<subscription-id>/resourceGroups/<group-name> \
--json-auth
parametresi --json-auth
Azure CLI sürümlerinde >= 2.51.0 kullanılabilir. Bu --sdk-auth
kullanımdan önceki sürümler kullanımdan kaldırma uyarısıyla kullanılır.
Yukarıdaki örnekte yer tutucuları abonelik kimliğiniz, kaynak grubu adınız ve uygulama adınızla değiştirin. Çıktı, Aşağıdakine benzer şekilde App Service uygulamanıza erişim sağlayan rol ataması kimlik bilgilerine sahip bir JSON nesnesidir. Bu JSON nesnesini daha sonra için kopyalayın.
{
"clientId": "<GUID>",
"clientSecret": "<GUID>",
"subscriptionId": "<GUID>",
"tenantId": "<GUID>",
(...)
}
Gezinti menüsünde Ayarlar gidin.
Güvenlik > Gizli Dizileri ve değişkenler Eylemler'i> seçin.
Yeni depo gizli dizisi'ni seçin.
Azure CLI komutundaki JSON çıkışının tamamını gizli dizinin değer alanına yapıştırın. Gizli diziye adını
AZURE_CREDENTIALS
verin.Add secret (Gizli dizi ekle) öğesini seçin.
Azure'da kimlik doğrulaması yapmak için GitHub gizli dizinizi Azure Oturum Açma eylemiyle kullanın.
Bu iş akışında, içinde depolanan secrets.AZURE_CREDENTIALS
hizmet sorumlusu ayrıntılarıyla Azure oturum açma eylemini kullanarak kimlik doğrulaması yaparsınız. Ardından bir Azure CLI eylemi çalıştırırsınız. Bir iş akışı dosyasında GitHub gizli dizilerine başvurma hakkında daha fazla bilgi için bkz . GitHub Docs'ta bir iş akışında şifrelenmiş gizli dizileri kullanma.
on: [push]
name: Create Custom VM Image
jobs:
build-image:
runs-on: ubuntu-latest
steps:
- name: Log in with Azure
uses: azure/login@v1
with:
creds: '${{ secrets.AZURE_CREDENTIALS }}'
Java Kurulum SDK'sı eylemiyle Java ortamını ayarlayın. Bu örnekte ortamı ayarlayıp Maven ile derleyip bir yapıt çıkaracaksınız.
GitHub yapıtları , iş akışındaki dosyaları işler arasında paylaşmanın bir yoludur. JAR dosyasını tutmak için bir yapıt oluşturacak ve ardından sanal makine görüntüsüne ekleyeceksiniz.
on: [push]
name: Create Custom VM Image
jobs:
build-image:
runs-on: ubuntu-latest
strategy:
matrix:
java: [ '17' ]
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Login via Az module
uses: azure/login@v1
with:
creds: ${{secrets.AZURE_CREDENTIALS}}
- name: Set up JDK ${{matrix.java}}
uses: actions/setup-java@v2
with:
java-version: ${{matrix.java}}
distribution: 'adopt'
cache: maven
- name: Build with Maven Wrapper
run: ./mvnw -B package
- name: Build Java
run: mvn --batch-mode --update-snapshots verify
- run: mkdir staging && cp target/*.jar staging
- uses: actions/upload-artifact@v2
with:
name: Package
path: staging
Özel bir sanal makine görüntüsü oluşturmak için Azure Sanal Makine Görüntüsü Oluştur eylemini kullanın.
ve yer tutucularını {subscriptionID}
{rgName}
{Identity}
abonelik kimliğiniz, kaynak grubu adınız ve yönetilen kimlik adınızla değiştirin. ve {imageName}
değerlerini {galleryName}
görüntü galerisi adınızla ve görüntü adınız ile değiştirin.
Not
Uygulama Pişirilmiş Görüntü Oluştur eylemi bir izin hatasıyla başarısız olursa, kullanıcı tarafından yönetilen kimliğinize Görüntü Oluşturma Rolü atadığınızdan emin olun.
- name: Create App Baked Image
id: imageBuilder
uses: azure/build-vm-image@v0
with:
location: 'eastus2'
resource-group-name: '{rgName}'
managed-identity: '{Identity}' # Managed identity
source-os-type: 'windows'
source-image-type: 'platformImage'
source-image: MicrosoftWindowsServer:WindowsServer:2019-Datacenter:latest #unique identifier of source image
dist-type: 'SharedImageGallery'
dist-resource-id: '/subscriptions/{subscriptionID}/resourceGroups/{rgName}/providers/Microsoft.Compute/galleries/{galleryName}/images/{imageName}/versions/0.1.${{ GITHUB.RUN_ID }}' #Replace with the resource id of your shared image gallery's image definition
dist-location: 'eastus2'
Girdi | Zorunlu | Veri Akışı Açıklaması |
---|---|---|
resource-group-name |
Yes | Derleme işlemi sırasında yapıtları depolamak ve kaydetmek için kullanılan kaynak grubu. |
image-builder-template-name |
Hayır | Kullanılan görüntü oluşturucu şablon kaynağının adı. |
location |
Yes | Azure Image Builder'ın çalıştırılacağı konum. Desteklenen konumlara bakın. |
build-timeout-in-minutes |
Hayır | Derlemenin iptal edilme zamanı. Varsayılan değer 240'tır. |
vm-size |
İsteğe bağlı | Varsayılan olarak Standard_D1_v2 kullanılır. Bkz. sanal makine boyutları. |
managed-identity |
Yes | Daha önce oluşturduğunuz kullanıcı tarafından yönetilen kimlik. Kimliğiniz farklı bir kaynak grubundaysa tam tanımlayıcıyı kullanın. Adı aynı kaynak grubundaysa kullanın. |
source-os |
Yes | Temel görüntünün işletim sistemi türü (Linux veya Windows) |
source-image-type |
Yes | Özel görüntü oluşturmak için kullanılacak temel görüntü türü. |
source-image |
Yes | Temel görüntünün kaynak tanımlayıcısı. Kaynak görüntü, konumun giriş değerinde ayarlanan aynı Azure bölgesinde bulunmalıdır. |
customizer-source |
Hayır | Özelleştirme için temel görüntüye eklenmesi gereken tüm yapıtları tutabileceğiniz dizin. Varsayılan olarak, değer şu şekildedir: ${{ GITHUB.WORKSPACE }}/workflow-artifacts. |
customizer-destination |
Hayır | Bu, özelleştirilmiş görüntüde yapıtların kopyalandığı dizindir. |
customizer-windows-update |
Hayır | Yalnızca Windows için. Boole değeri. ise true , görüntü oluşturucu özelleştirmelerin sonunda Windows update'i çalıştırır. |
dist-location |
Hayır | SharedImageGallery için bu değeridir dist-type . |
dist-image-tags |
Hayır | Bunlar, oluşturulan özel görüntüye eklenen kullanıcı tanımlı etiketlerdir (örnek: version:beta ). |
Son adım olarak, görüntünüzden bir sanal makine oluşturun.
için
{rgName}
yer tutucularını kaynak grubu adınızla değiştirin.Sanal makine parolası () ile bir GitHub gizli dizisi
VM_PWD
ekleyin. Parolayı bir daha göremeyeceğiniz için not edin. Kullanıcı adı:myuser
.
- name: CREATE VM
uses: azure/CLI@v1
with:
azcliversion: 2.0.72
inlineScript: |
az vm create --resource-group ghactions-vMimage --name "app-vm-${{ GITHUB.RUN_NUMBER }}" --admin-username myuser --admin-password "${{ secrets.VM_PWD }}" --location eastus2 \
--image "${{ steps.imageBuilder.outputs.custom-image-uri }}"
on: [push]
name: Create Custom VM Image
jobs:
build-image:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Login via Az module
uses: azure/login@v1
with:
creds: ${{secrets.AZURE_CREDENTIALS}}
- name: Setup Java 1.8.x
uses: actions/setup-java@v1
with:
java-version: '1.8.x'
- name: Build Java
run: mvn --batch-mode --update-snapshots verify
- run: mkdir staging && cp target/*.jar staging
- uses: actions/upload-artifact@v2
with:
name: Package
path: staging
- name: Create App Baked Image
id: imageBuilder
uses: azure/build-vm-image@v0
with:
location: 'eastus2'
resource-group-name: '{rgName}'
managed-identity: '{Identity}' # Managed identity
source-os-type: 'windows'
source-image-type: 'platformImage'
source-image: MicrosoftWindowsServer:WindowsServer:2019-Datacenter:latest #unique identifier of source image
dist-type: 'SharedImageGallery'
dist-resource-id: '/subscriptions/{subscriptionID}/resourceGroups/{rgName}/providers/Microsoft.Compute/galleries/{galleryName}/images/{imageName}/versions/0.1.${{ GITHUB.RUN_ID }}' #Replace with the resource id of your shared image gallery's image definition
dist-location: 'eastus2'
- name: CREATE VM
uses: azure/CLI@v1
with:
azcliversion: 2.0.72
inlineScript: |
az vm create --resource-group ghactions-vMimage --name "app-vm-${{ GITHUB.RUN_NUMBER }}" --admin-username myuser --admin-password "${{ secrets.VM_PWD }}" --location eastus2 \
--image "${{ steps.imageBuilder.outputs.custom-image-uri }}"
- Azure'a dağıtmayı öğrenin.