0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Jenkins Shared Librariesを使ってAzure VM上でスクリプトを実行

Posted at

JenkinsからJenkins Shared Libraiesyを使って、AzureのVM上でスクリプトを実行する方法をまとめてみました。

#TerraformでAzure VMのセットアップ

resource "azurerm_linux_virtual_machine" "myvm" {
  name                    = "myproject-vm"
  resource_group_name     = data.azurerm_resource_group.myproject.name
  location                = data.azurerm_resource_group.myproject.location
  network_interface_ids   = [azurerm_network_interface.nic.id]
  size                    = "Standard_D2as_v5"
  admin_username          = "myvmadmin"
  patch_mode              = "AutomaticByPlatform"

  disable_password_authentication = true

  admin_ssh_key  {
    username    = "myvmadmin"
    public_key  = file("data/my_key.pub")
  }

  source_image_reference {
    publisher = "Canonical"
    offer     = "0001-com-ubuntu-server-focal"
    sku       = "20_04-lts"
    version   = "latest"
  }

  os_disk {
    name                  = "myproject-osdisk"
    caching               = "ReadWrite"
    storage_account_type  = "Standard_LRS"
    disk_size_gb          = 60
  }
}

resource "azurerm_network_interface" "nic" {
  name                      = "myproject-nic"
  resource_group_name       = data.azurerm_resource_group.myproject.name
  location                  = data.azurerm_resource_group.myproject.location

  ip_configuration {
    name                          = "myproject-nicconf"
    subnet_id                     = data.azurerm_subnet.myproject.id
    private_ip_address_allocation = "Dynamic"
    private_ip_address_version    = "IPv4"
  }
}

output "ipaddress" {
  value = azurerm_network_interface.nic.private_ip_address
}

azurerm_linux_virtual_machineでVMをセットアップしますが、その時に後ほどJenkinsよりSSHでアクセスできるためにSSH認証の公開鍵を一緒にインストールしておきます。それが、この個所です。

  admin_ssh_key  {
    username    = var.vm_admin_user
    public_key  = file("data/my_key.pub")
  }

Jenkins側には秘密鍵を設定して、それを使ってアクセスします。
また、output "ipaddress"を入れておくと、Terraformを使って簡単にセットアップしたVMのIPアドレスが取得できます。

#Jenkins Shared Librariesの設定

unclassified:
  globalLibraries:
    libraries:
    - defaultVersion: "master"
      name: "mycompany-shared-libraries"
      retriever:
        modernSCM:
          scm:
            git:
              credentialsId: "github-user"
              id: "******-*****-*****-****-*****"
              remote: "https://github.com/mycompany/jenkins.libraries.git"

Jenkins Configuration as Codeを使ってJenkinsを設定する場合は、以上のようなコードでShared Librariesを設定します。
JCasCの詳細は以下のサイトにあります。

#Jenkins Shared Librariesリポジトリ
Githubにリポジトリ、(例 https://github.com/mycompany/jenkins.libraries.git)を作成します。

(root)
+- vars
|   +- test.groovy
+- resources               # スクリプト
|   +- myscript.sh

パイプライン実行中にShared Librariesリポジトリからmyscript.shを使用するので以上のようなリポジトリを作成します。

Jenkins Shared Librariesの詳細は以下のサイトにあります。

#JenkinsパイプラインからShared Librariesを読み込む

@Library('mycompany-shared-libraries')_  //Shared Librariesを読み込む

pipeline {
    environment {
		PRIVATEKEY = credentials('vm-ssh-key')   //VMアクセス用の秘密鍵
    }
    stages {
		stage ('Setup Script') {
			steps {
				def scriptContent  = libraryResource 'myscript.sh'
				writeFile file: 'myscript.sh', text: scriptContent

先ず@Library('mycompany-shared-libraries')_でShared Librariesを読み込みます。
実行したパイプラインのログを見ると実際、gitからFetchしているのが分かります。

Fetching changes from the remote Git repository
 > git config remote.origin.url https://github.com/mycompany/jenkins.libraries.git # timeout=10
Fetching without tags
Fetching upstream changes from https://github.com/mycompany/jenkins.libraries.git

次に、libraryResource 'myscript.sh'を使ってスクリプトを読み込みます。今回はJenkinsのエージェント上で実行するのではなく、先ほど作ったVM上で実行するためにファイルとしてスクリプトを作ります。

#JenkinsパイプラインからAzure VM上でスクリプトを実行

.
.
    environment {
		PRIVATEKEY = credentials('vm-ssh-key')   //VMアクセス用の秘密鍵
    }
    stages {
.
.
		stage ('Run script') {
			steps {
			  	script {
	                env.IPADDRESS = sh(script:"terraform output -raw ipaddress", returnStdout: true).trim()

					def remote = [:]
					remote.name = 'myproject-vm'
					remote.host = "${IPADDRESS}"
					remote.user = 'myvmadmin'
					remote.identity = "${PRIVATEKEY}"
					remote.allowAnyHosts = true
					remote.pty = true

					sshPut remote: remote, from: 'myscript.sh', into: '.'
					sshCommand remote: remote, sudo: true, command: "chmod 755 myscript.sh"
					sshCommand remote: remote, sudo: true, command: "/home/myvmadmin/myscript.sh"

先ほどのパイプラインに新たなStageを追加して、スクリプトをVM上で実行します。
Jenkinsのエージェント上にTerraformをインストールしておくとVMを作成してterraform output -raw ipaddressでVMのIPアドレスIPADDRESSを実行時に取得できます。もちろんVM自体もパイプライン実行時にterraform apply -auto-approve <terraform dir>を実行して作成することも可能です。

SSHのStepsを利用して、VMにアクセスします。Jenkinsのクレデンシャルにあらかじめ秘密鍵credentials('vm-ssh-key')を設定しておいて、remote.identity = "${PRIVATEKEY}"のようにしてアクセスを設定します。remote.host = "${IPADDRESS}"で対象のVMのIPを設定します。
sshPutでスクリプトをVM上にコピーし、sshCommand remote: remote, sudo: true, command: "/home/myvmadmin/myscript.sh"で実行できます。

myvmadminはTerraformで公開鍵を設定したユーザー名です。sudo: trueを使うとルートアカウントでスクリプトを実行できます。

最後にもう一つStageを追加してterraform destroy -auto-approveと実行すると、パイプライン上でVMの作成、スクリプトの実行、VMの削除まですべて自動でできるようになります。これで、VMを必要な時だけセットアップして、必要が無くなると削除できるのでコスト削減もできます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?