ubuntu-22.04.pkr.hcl
421 lines
packer {
packer {
required_plugins {
required_plugins {
azure = {
azure = {
source = "github.com/hashicorp/azure"
source = "github.com/hashicorp/docker"
version = "1.4.5"
version = ">= 1.0.9"
}
}
}
}
}
}
locals {
variable "base_image_tag" {
managed_image_name = var.managed_image_name != "" ? var.managed_image_name : "packer-${var.image_os}-${var.image_version}"
}
variable "allowed_inbound_ip_addresses" {
type = list(string)
default = []
}
variable "azure_tags" {
type = map(string)
default = {}
}
variable "build_resource_group_name" {
type = string
default = "${env("BUILD_RESOURCE_GROUP_NAME")}"
}
variable "client_cert_path" {
type = string
default = "${env("ARM_CLIENT_CERT_PATH")}"
}
variable "client_id" {
type = string
type = string
default = "${env("ARM_CLIENT_ID")}"
default = "latest"
}
variable "client_secret" {
type = string
default = "${env("ARM_CLIENT_SECRET")}"
sensitive = true
}
}
variable "dockerhub_login" {
variable "artifact_image_repository" {
type = string
type = string
default = "${env("DOCKERHUB_LOGIN")}"
default = "ghcr.io/sun-asterisk-research/actions-runner"
}
}
variable "dockerhub_password" {
variable "artifact_image_tag" {
type = string
type = string
default = "${env("DOCKERHUB_PASSWORD")}"
default = "ubuntu-latest"
}
}
variable "helper_script_folder" {
variable "helper_script_folder" {
type = string
type = string
default = "/imagegeneration/helpers"
default = "/imagegeneration/helpers"
}
}
variable "image_folder" {
variable "image_folder" {
type = string
type = string
default = "/imagegeneration"
default = "/imagegeneration"
}
}
variable "image_os" {
variable "image_os" {
type = string
type = string
default = "ubuntu22"
default = "ubuntu22"
}
}
variable "image_version" {
variable "image_version" {
type = string
type = string
default = "dev"
default = "dev"
}
}
variable "imagedata_file" {
variable "imagedata_file" {
type = string
type = string
default = "/imagegeneration/imagedata.json"
default = "/imagegeneration/imagedata.json"
}
}
variable "installer_script_folder" {
variable "installer_script_folder" {
type = string
type = string
default = "/imagegeneration/installers"
default = "/imagegeneration/installers"
}
}
variable "install_password" {
variable "install_password" {
type = string
type = string
default = ""
default = ""
sensitive = true
sensitive = true
}
}
variable "location" {
type = string
default = "${env("ARM_RESOURCE_LOCATION")}"
}
variable "managed_image_name" {
type = string
default = ""
}
variable "managed_image_resource_group_name" {
type = string
default = "${env("ARM_RESOURCE_GROUP")}"
}
variable "private_virtual_network_with_public_ip" {
type = bool
default = false
}
variable "subscription_id" {
type = string
default = "${env("ARM_SUBSCRIPTION_ID")}"
}
variable "temp_resource_group_name" {
type = string
default = "${env("TEMP_RESOURCE_GROUP_NAME")}"
}
variable "tenant_id" {
type = string
default = "${env("ARM_TENANT_ID")}"
}
variable "virtual_network_name" {
type = string
default = "${env("VNET_NAME")}"
}
variable "virtual_network_resource_group_name" {
type = string
default = "${env("VNET_RESOURCE_GROUP")}"
}
variable "virtual_network_subnet_name" {
type = string
default = "${env("VNET_SUBNET")}"
}
variable "vm_size" {
type = string
default = "Standard_D4s_v4"
}
source "azure-arm" "build_image" {
allowed_inbound_ip_addresses = "${var.allowed_inbound_ip_addresses}"
build_resource_group_name = "${var.build_resource_group_name}"
client_cert_path = "${var.client_cert_path}"
client_id = "${var.client_id}"
client_secret = "${var.client_secret}"
image_offer = "0001-com-ubuntu-server-jammy"
image_publisher = "canonical"
image_sku = "22_04-lts"
location = "${var.location}"
managed_image_name = "${local.managed_image_name}"
managed_image_resource_group_name = "${var.managed_image_resource_group_name}"
os_disk_size_gb = "75"
os_type = "Linux"
private_virtual_network_with_public_ip = "${var.private_virtual_network_with_public_ip}"
subscription_id = "${var.subscription_id}"
temp_resource_group_name = "${var.temp_resource_group_name}"
tenant_id = "${var.tenant_id}"
virtual_network_name = "${var.virtual_network_name}"
virtual_network_resource_group_name = "${var.virtual_network_resource_group_name}"
virtual_network_subnet_name = "${var.virtual_network_subnet_name}"
vm_size = "${var.vm_size}"
dynamic "azure_tag" {
source "docker" "ubuntu" {
for_each = var.azure_tags
image = "ghcr.io/actions/actions-runner:${var.base_image_tag}"
content {
commit = true
name = azure_tag.key
fix_upload_owner = true
value = azure_tag.value
run_command = ["-d", "-i", "-t", "--", "{{.Image}}"]
}
changes = [
}
"ENV PATH /home/runner/.cargo/bin:$PATH",
"CMD []",
"ENTRYPOINT []",
]
}
}
build {
build {
sources = ["source.azure-arm.build_image"]
name = "ubuntu-22.04-actions"
sources = ["source.docker.ubuntu"]
provisioner "shell" {
post-processor "docker-tag" {
execute_command = "sudo sh -c '{{ .Vars }} {{ .Path }}'"
repository = "${var.artifact_image_repository}"
inline = ["mkdir ${var.image_folder}", "chmod 777 ${var.image_folder}"]
tags = ["${var.artifact_image_tag}", "latest"]
}
}
provisioner "file" {
provisioner "shell" {
destination = "${var.helper_script_folder}"
execute_command = "sudo chmod -R 777 {{ .Path }}; {{ .Vars }} {{ .Path }}"
source = "${path.root}/../scripts/helpers"
inline = ["sudo mkdir ${var.image_folder}", "sudo chmod 777 ${var.image_folder}", "sudo chmod -R 777 /tmp"]
}
}
provisioner "shell" {
provisioner "shell" {
execute_command = "sudo sh -c '{{ .Vars }} {{ .Path }}'"
execute_command = "sudo sh -c '{{ .Vars }} {{ .Path }}'"
script = "${path.root}/../scripts/build/configure-apt-mock.sh"
script = "${path.root}/../scripts/build/configure-apt-mock.sh"
}
}
provisioner "shell" {
provisioner "shell" {
environment_vars = ["HELPER_SCRIPTS=${var.helper_script_folder}","DEBIAN_FRONTEND=noninteractive"]
environment_vars = ["DEBIAN_FRONTEND=noninteractive"]
execute_command = "sudo sh -c '{{ .Vars }} {{ .Path }}'"
execute_command = "sudo sh -c '{{ .Vars }} {{ .Path }}'"
scripts = [
scripts = [
"${path.root}/../scripts/build/install-ms-repos.sh",
"${path.root}/../scripts/build/install-ms-repos.sh",
"${path.root}/../scripts/build/configure-apt-sources.sh",
"${path.root}/../scripts/build/configure-apt-sources.sh",
"${path.root}/../scripts/build/configure-apt.sh"
"${path.root}/../scripts/build/configure-apt.sh"
]
]
}
}
provisioner "shell" {
provisioner "shell" {
execute_command = "sudo sh -c '{{ .Vars }} {{ .Path }}'"
execute_command = "sudo sh -c '{{ .Vars }} {{ .Path }}'"
script = "${path.root}/../scripts/build/configure-limits.sh"
script = "${path.root}/../scripts/build/configure-limits.sh"
}
}
provisioner "file" {
provisioner "file" {
destination = "${var.helper_script_folder}"
source = "${path.root}/../scripts/helpers"
Text moved from lines 223-225
}
provisioner "file" {
destination = "${var.installer_script_folder}"
destination = "${var.installer_script_folder}"
source = "${path.root}/../scripts/build"
source = "${path.root}/../scripts/build"
}
}
provisioner "file" {
provisioner "file" {
destination = "${var.image_folder}"
sources = [
"${path.root}/../assets/post-gen",
"${path.root}/../scripts/tests",
"${path.root}/../scripts/docs-gen"
]
Text moved to lines 111-113
}
provisioner "file" {
destination = "${var.image_folder}/docs-gen/"
source = "${path.root}/../../../helpers/software-report-base"
}
provisioner "file" {
destination = "${var.installer_script_folder}/toolset.json"
destination = "${var.installer_script_folder}/toolset.json"
source = "${path.root}/../toolsets/toolset-2204.json"
source = "${path.root}/../toolsets/toolset-2204.json"
}
}
provisioner "shell" {
provisioner "shell" {
execute_command = "sudo sh -c '{{ .Vars }} {{ .Path }}'"
execute_command = "sudo sh -c '{{ .Vars }} {{ .Path }}'"
inline = [
"mv ${var.image_folder}/docs-gen ${var.image_folder}/SoftwareReport",
"mv ${var.image_folder}/post-gen ${var.image_folder}/post-generation"
]
}
provisioner "shell" {
environment_vars = ["IMAGE_VERSION=${var.image_version}", "IMAGEDATA_FILE=${var.imagedata_file}"]
environment_vars = ["IMAGE_VERSION=${var.image_version}", "IMAGEDATA_FILE=${var.imagedata_file}"]
execute_command = "sudo sh -c '{{ .Vars }} {{ .Path }}'"
scripts = ["${path.root}/../scripts/build/configure-image-data.sh"]
scripts = ["${path.root}/../scripts/build/configure-image-data.sh"]
}
}
provisioner "shell" {
provisioner "shell" {
execute_command = "sudo sh -c '{{ .Vars }} {{ .Path }}'"
environment_vars = ["IMAGE_VERSION=${var.image_version}", "IMAGE_OS=${var.image_os}", "HELPER_SCRIPTS=${var.helper_script_folder}"]
environment_vars = ["IMAGE_VERSION=${var.image_version}", "IMAGE_OS=${var.image_os}", "HELPER_SCRIPTS=${var.helper_script_folder}"]
execute_command = "sudo sh -c '{{ .Vars }} {{ .Path }}'"
scripts = ["${path.root}/../scripts/build/configure-environment.sh"]
scripts = ["${path.root}/../scripts/build/configure-environment.sh"]
}
}
provisioner "shell" {
provisioner "shell" {
environment_vars = ["DEBIAN_FRONTEND=noninteractive", "HELPER_SCRIPTS=${var.helper_script_folder}", "INSTALLER_SCRIPT_FOLDER=${var.installer_script_folder}"]
environment_vars = ["DEBIAN_FRONTEND=noninteractive", "HELPER_SCRIPTS=${var.helper_script_folder}", "INSTALLER_SCRIPT_FOLDER=${var.installer_script_folder}"]
execute_command = "sudo sh -c '{{ .Vars }} {{ .Path }}'"
scripts = ["${path.root}/../scripts/build/install-apt-vital.sh"]
scripts = ["${path.root}/../scripts/build/install-apt-vital.sh"]
}
}
provisioner "shell" {
provisioner "shell" {
environment_vars = ["HELPER_SCRIPTS=${var.helper_script_folder}", "INSTALLER_SCRIPT_FOLDER=${var.installer_script_folder}"]
environment_vars = ["HELPER_SCRIPTS=${var.helper_script_folder}", "INSTALLER_SCRIPT_FOLDER=${var.installer_script_folder}"]
execute_command = "sudo sh -c '{{ .Vars }} {{ .Path }}'"
execute_command = "sudo sh -c '{{ .Vars }} {{ .Path }}'"
scripts = ["${path.root}/../scripts/build/install-powershell.sh"]
scripts = ["${path.root}/../scripts/build/install-powershell.sh"]
}
}
provisioner "shell" {
provisioner "shell" {
environment_vars = ["HELPER_SCRIPTS=${var.helper_script_folder}", "INSTALLER_SCRIPT_FOLDER=${var.installer_script_folder}"]
execute_command = "sudo sh -c '{{ .Vars }} pwsh -f {{ .Path }}'"
scripts = ["${path.root}/../scripts/build/Install-PowerShellModules.ps1", "${path.root}/../scripts/build/Install-PowerShellAzModules.ps1"]
}
provisioner "shell" {
environment_vars = ["HELPER_SCRIPTS=${var.helper_script_folder}", "INSTALLER_SCRIPT_FOLDER=${var.installer_script_folder}", "DEBIAN_FRONTEND=noninteractive"]
environment_vars = ["HELPER_SCRIPTS=${var.helper_script_folder}", "INSTALLER_SCRIPT_FOLDER=${var.installer_script_folder}", "DEBIAN_FRONTEND=noninteractive"]
execute_command = "sudo sh -c '{{ .Vars }} {{ .Path }}'"
execute_command = "sudo sh -c '{{ .Vars }} {{ .Path }} -o Dpkg::Options::='--force-confdef' -o Dpkg::Options::='--force-confold''"
scripts = [
scripts = [
"${path.root}/../scripts/build/configure-dpkg.sh",
"${path.root}/../scripts/build/install-actions-cache.sh",
"${path.root}/../scripts/build/install-actions-cache.sh",
"${path.root}/../scripts/build/install-runner-package.sh",
"${path.root}/../scripts/build/install-runner-package.sh",
"${path.root}/../scripts/build/install-apt-common.sh",
"${path.root}/../scripts/build/install-apt-common.sh",
"${path.root}/../scripts/build/install-azcopy.sh",
"${path.root}/../scripts/build/install-azure-cli.sh",
"${path.root}/../scripts/build/install-azure-devops-cli.sh",
"${path.root}/../scripts/build/install-bicep.sh",
"${path.root}/../scripts/build/install-bicep.sh",
"${path.root}/../scripts/build/install-aliyun-cli.sh",
"${path.root}/../scripts/build/install-apache.sh",
"${path.root}/../scripts/build/install-apache.sh",
"${path.root}/../scripts/build/install-aws-tools.sh",
"${path.root}/../scripts/build/install-aws-tools.sh",
"${path.root}/../scripts/build/install-clang.sh",
"${path.root}/../scripts/build/install-clang.sh",
"${path.root}/../scripts/build/install-swift.sh",
"${path.root}/../scripts/build/install-cmake.sh",
"${path.root}/../scripts/build/install-cmake.sh",
"${path.root}/../scripts/build/install-codeql-bundle.sh",
"${path.root}/../scripts/build/install-container-tools.sh",
"${path.root}/../scripts/build/install-container-tools.sh",
"${path.root}/../scripts/build/install-dotnetcore-sdk.sh",
"${path.root}/../scripts/build/install-firefox.sh",
"${path.root}/../scripts/build/install-microsoft-edge.sh",
"${path.root}/../scripts/build/install-gcc-compilers.sh",
"${path.root}/../scripts/build/install-gfortran.sh",
"${path.root}/../scripts/build/install-git.sh",
"${path.root}/../scripts/build/install-git.sh",
"${path.root}/../scripts/build/install-git-lfs.sh",
"${path.root}/../scripts/build/install-github-cli.sh",
"${path.root}/../scripts/build/install-github-cli.sh",
"${path.root}/../scripts/build/install-google-chrome.sh",
"${path.root}/../scripts/build/install-google-cloud-cli.sh",
"${path.root}/../scripts/build/install-haskell.sh",
"${path.root}/../scripts/build/install-heroku.sh",
"${path.root}/../scripts/build/install-heroku.sh",
"${path.root}/../scripts/build/install-java-tools.sh",
"${path.root}/../scripts/build/install-java-tools.sh",
"${path.root}/../scripts/build/install-kubernetes-tools.sh",
"${path.root}/../scripts/build/install-kubernetes-tools.sh",
"${path.root}/../scripts/build/install-oc-cli.sh",
"${path.root}/../scripts/build/install-leiningen.sh",
"${path.root}/../scripts/build/install-miniconda.sh",
"${path.root}/../scripts/build/install-mono.sh",
"${path.root}/../scripts/build/install-kotlin.sh",
"${path.root}/../scripts/build/install-mysql.sh",
"${path.root}/../scripts/build/install-mssql-tools.sh",
"${path.root}/../scripts/build/install-sqlpackage.sh",
"${path.root}/../scripts/build/install-nginx.sh",
"${path.root}/../scripts/build/install-nvm.sh",
"${path.root}/../scripts/build/install-nvm.sh",
"${path.root}/../scripts/build/install-nodejs.sh",
"${path.root}/../scripts/build/install-nodejs.sh",
"${path.root}/../scripts/build/install-bazel.sh",
"${path.root}/../scripts/build/install-oras-cli.sh",
"${path.root}/../scripts/build/install-php.sh",
"${path.root}/../scripts/build/install-php.sh",
"${path.root}/../scripts/build/install-postgresql.sh",
"${path.root}/../scripts/build/install-pulumi.sh",
"${path.root}/../scripts/build/install-ruby.sh",
"${path.root}/../scripts/build/install-ruby.sh",
"${path.root}/../scripts/build/install-rlang.sh",
"${path.root}/../scripts/build/install-rlang.sh",
"${path.root}/../scripts/build/install-rust.sh",
"${path.root}/../scripts/build/install-rust.sh",
"${path.root}/../scripts/build/install-julia.sh",
"${path.root}/../scripts/build/install-sbt.sh",
"${path.root}/../scripts/build/install-selenium.sh",
"${path.root}/../scripts/build/install-terraform.sh",
"${path.root}/../scripts/build/install-terraform.sh",
"${path.root}/../scripts/build/install-packer.sh",
"${path.root}/../scripts/build/install-vcpkg.sh",
"${path.root}/../scripts/build/configure-dpkg.sh",
"${path.root}/../scripts/build/install-yq.sh",
"${path.root}/../scripts/build/install-android-sdk.sh",
"${path.root}/../scripts/build/install-pypy.sh",
"${path.root}/../scripts/build/install-python.sh",
"${path.root}/../scripts/build/install-python.sh",
"${path.root}/../scripts/build/install-zstd.sh"
]
]
}
}
provisioner "shell" {
provisioner "shell" {
environment_vars = ["HELPER_SCRIPTS=${var.helper_script_folder}", "INSTALLER_SCRIPT_FOLDER=${var.installer_script_folder}", "DOCKERHUB_LOGIN=${var.dockerhub_login}", "DOCKERHUB_PASSWORD=${var.dockerhub_password}"]
execute_command = "sudo sh -c '{{ .Vars }} {{ .Path }}'"
scripts = ["${path.root}/../scripts/build/install-docker.sh"]
}
provisioner "shell" {
environment_vars = ["HELPER_SCRIPTS=${var.helper_script_folder}", "INSTALLER_SCRIPT_FOLDER=${var.installer_script_folder}"]
environment_vars = ["HELPER_SCRIPTS=${var.helper_script_folder}", "INSTALLER_SCRIPT_FOLDER=${var.installer_script_folder}"]
execute_command = "sudo sh -c '{{ .Vars }} pwsh -f {{ .Path }}'"
execute_command = "sudo sh -c '{{ .Vars }} {{ .Path }}'"
scripts = ["${path.root}/../scripts/build/Install-Toolset.ps1", "${path.root}/../scripts/build/Configure-Toolset.ps1"]
scripts = ["${path.root}/../scripts/build/install-docker-compose.sh"]
}
}
provisioner "shell" {
provisioner "shell" {
environment_vars = ["HELPER_SCRIPTS=${var.helper_script_folder}", "INSTALLER_SCRIPT_FOLDER=${var.installer_script_folder}"]
environment_vars = ["HELPER_SCRIPTS=${var.helper_script_folder}", "INSTALLER_SCRIPT_FOLDER=${var.installer_script_folder}"]
execute_command = "sudo sh -c '{{ .Vars }} {{ .Path }}'"
execute_command = "sudo sh -c '{{ .Vars }} {{ .Path }}'"
scripts = ["${path.root}/../scripts/build/install-pipx-packages.sh"]
scripts = ["${path.root}/../scripts/build/install-pipx-packages.sh"]
}
}
provisioner "shell" {
provisioner "shell" {
environment_vars = ["HELPER_SCRIPTS=${var.helper_script_folder}", "DEBIAN_FRONTEND=noninteractive", "INSTALLER_SCRIPT_FOLDER=${var.installer_script_folder}"]
execute_command = "/bin/sh -c '{{ .Vars }} {{ .Path }}'"
scripts = ["${path.root}/../scripts/build/install-homebrew.sh"]
}
provisioner "shell" {
environment_vars = ["HELPER_SCRIPTS=${var.helper_script_folder}"]
execute_command = "sudo sh -c '{{ .Vars }} {{ .Path }}'"
scripts = ["${path.root}/../scripts/build/configure-snap.sh"]
}
provisioner "shell" {
execute_command = "sudo sh -c '{{ .Vars }} {{ .Path }}'"
expect_disconnect = true
inline = ["echo 'Reboot VM'", "sudo reboot"]
}
provisioner "shell" {
execute_command = "sudo sh -c '{{ .Vars }} {{ .Path }}'"
execute_command = "sudo sh -c '{{ .Vars }} {{ .Path }}'"
pause_before = "1m0s"
pause_before = "1m0s"
scripts = ["${path.root}/../scripts/build/cleanup.sh"]
scripts = ["${path.root}/../scripts/build/cleanup.sh"]
start_retry_timeout = "10m"
start_retry_timeout = "10m"
}
}
provisioner "shell" {
provisioner "shell" {
environment_vars = ["IMAGE_VERSION=${var.image_version}", "INSTALLER_SCRIPT_FOLDER=${var.installer_script_folder}"]
environment_vars = ["HELPER_SCRIPT_FOLDER=${var.helper_script_folder}", "INSTALLER_SCRIPT_FOLDER=${var.installer_script_folder}", "IMAGE_FOLDER=${var.image_folder}"]
inline = ["pwsh -File ${var.image_folder}/SoftwareReport/Generate-SoftwareReport.ps1 -OutputDirectory ${var.image_folder}", "pwsh -File ${var.image_folder}/tests/RunAll-Tests.ps1 -OutputDirectory ${var.image_folder}"]
execute_command = "sudo sh -c '{{ .Vars }} {{ .Path }}'"
}
scripts = ["${path.root}/../scripts/build/configure-system.sh"]
}
provisioner "file" {
destination = "${path.root}/../Ubuntu2204-Readme.md"
direction = "download"
source = "${var.image_folder}/software-report.md"
}
provisioner "file" {
destination = "${path.root}/../software-report.json"
direction = "download"
source = "${var.image_folder}/software-report.json"
}
provisioner "shell" {
environment_vars = ["HELPER_SCRIPT_FOLDER=${var.helper_script_folder}", "INSTALLER_SCRIPT_FOLDER=${var.installer_script_folder}", "IMAGE_FOLDER=${var.image_folder}"]
execute_command = "sudo sh -c '{{ .Vars }} {{ .Path }}'"
scripts = ["${path.root}/../scripts/build/configure-system.sh"]
}
provisioner "file" {
destination = "/tmp/"
source = "${path.root}/../assets/ubuntu2204.conf"
}
provisioner "shell" {
execute_command = "sudo sh -c '{{ .Vars }} {{ .Path }}'"
inline = ["mkdir -p /etc/vsts", "cp /tmp/ubuntu2204.conf /etc/vsts/machine_instance.conf"]
}
provisioner "shell" {
execute_command = "sudo sh -c '{{ .Vars }} {{ .Path }}'"
inline = ["sleep 30", "/usr/sbin/waagent -force -deprovision+user && export HISTSIZE=0 && sync"]
}
}
}