Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(ubuntu):Add an amazon-ebs AMI builder #1447

Merged
merged 17 commits into from
Oct 17, 2024
31 changes: 30 additions & 1 deletion Jenkinsfile_k8s
Original file line number Diff line number Diff line change
Expand Up @@ -107,10 +107,36 @@ pipeline {
axis {
name 'compute_type'
// "azure-arm" stands for "Azure Resource Manager", unrelated to arm64 CPU
values 'azure-arm', 'docker'
values 'amazon-ebs', 'azure-arm', 'docker'
}
}
excludes {
// Only build Ubuntu images for arm64 CPU in AWS (notValues)
exclude {
axis {
name 'cpu_architecture'
values 'arm64'
}
axis {
name 'agent_type'
notValues 'ubuntu-22.04'
}
axis {
name 'compute_type'
values 'amazon-ebs'
}
}
// Exclude 'amazon-ebs' Windows builds while testing for Linux AMI
exclude {
axis {
name 'agent_type'
values 'windows-2019', 'windows-2022'
}
axis {
name 'compute_type'
values 'amazon-ebs'
}
}
// Only build Ubuntu images for arm64 CPU in Azure (notValues)
exclude {
axis {
Expand Down Expand Up @@ -149,6 +175,9 @@ pipeline {
}
}
environment {
// Defines the following environment variables: AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY
jayfranco999 marked this conversation as resolved.
Show resolved Hide resolved
AWS_ACCESS_KEY_ID = credentials('packer-aws-access-key-id')
AWS_SECRET_ACCESS_KEY = credentials('packer-aws-secret-access-key')
jayfranco999 marked this conversation as resolved.
Show resolved Hide resolved
// Defines the following environment variables: AZURE_CLIENT_ID, AZURE_CLIENT_SECRET, AZURE_TENANT_ID, AZURE_SUBSCRIPTION_ID
// Ref. https://plugins.jenkins.io/azure-credentials/#plugin-content-declarative-pipeline
AZURE = credentials('packer-azure-serviceprincipal-sponsorship')
Expand Down
5 changes: 5 additions & 0 deletions build-jenkins-agent-ubuntu.pkr.hcl
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,11 @@ build {
name = "ubuntu"
}

source "amazon-ebs.base" {
name = "ubuntu"
ssh_username = "ubuntu"
}

source "azure-arm.base" {
name = "ubuntu"
# List available offers and publishers with the command `az vm image list --output table`
Expand Down
41 changes: 41 additions & 0 deletions datasources.pkr.hcl
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# # Data sources are always treated BEFORE locals and sources.
data "amazon-ami" "ubuntu-22_04" {
access_key = var.aws_access_key_id
secret_key = var.aws_secret_access_key
dduportal marked this conversation as resolved.
Show resolved Hide resolved
filters = {
name = format("ubuntu/images/hvm-ssd/ubuntu-*-22.04-%s-server-*", var.architecture)
root-device-type = "ebs"
virtualization-type = "hvm"
}
most_recent = true
# owners = ["326712726440"]
owners = ["amazon"]
region = var.aws_region
}

data "amazon-ami" "windows-2019" {
access_key = var.aws_access_key_id
secret_key = var.aws_secret_access_key
filters = {
# https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/ec2launch-v2.html
name = "EC2LaunchV2-Windows_Server-2019-English-Core-Base-*"
root-device-type = "ebs"
virtualization-type = "hvm"
}
most_recent = true
owners = ["amazon"]
region = var.aws_region
}

data "amazon-ami" "windows-2022" {
access_key = var.aws_access_key_id
secret_key = var.aws_secret_access_key
filters = {
name = "Windows_Server-2022-English-Core-Base-*"
root-device-type = "ebs"
virtualization-type = "hvm"
}
most_recent = true
owners = ["amazon"]
region = var.aws_region
}
jayfranco999 marked this conversation as resolved.
Show resolved Hide resolved
12 changes: 12 additions & 0 deletions locals.pkr.hcl
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,18 @@ locals {
agent_os_version_safe = replace(var.agent_os_version, ".", "_")
image_name = format("jenkins-agent-%s-%s-%s", var.agent_os_type, var.agent_os_version, var.architecture)
unique_image_name = format("%s-%s", local.image_name, local.now_unix_timestamp)

# aws_spot_instance_types = { // for spot instances
# # 4 vCPU x86 / 16 GB / $0.1670 - https://aws.amazon.com/en/ec2/instance-types/t3/#Product_Details
# "amd64" = ["t3.xlarge", "t3a.xlarge", "t2.xlarge", "m6a.xlarge"]
# # 4 vCPU ARM64 (Gravitnb)/ 16 GB / $0.1344 - https://aws.amazon.com/en/ec2/instance-types/t4/#Product_Details
# "arm64" = ["t4g.xlarge", "m7g.xlarge"]
# }
jayfranco999 marked this conversation as resolved.
Show resolved Hide resolved
aws_instance_types = {
"amd64" = "t3.xlarge"
"arm64" = "t4g.xlarge"
}

# List available SKUs with the command `az vm image list-skus --offer 0001-com-ubuntu-server-jammy --location eastus --publisher canonical --output table`
az_instance_image_sku = {
"amd64" = "${local.agent_os_version_safe}-lts-gen2"
Expand Down
4 changes: 4 additions & 0 deletions main.pkr.hcl
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
packer {
required_version = ">= 1.7.2, < 2"
required_plugins {
amazon = {
version = "1.3.3"
jayfranco999 marked this conversation as resolved.
Show resolved Hide resolved
source = "github.com/hashicorp/amazon"
}
windows-update = {
version = "0.16.8"
source = "github.com/rgl/windows-update"
Expand Down
44 changes: 44 additions & 0 deletions sources.pkr.hcl
Original file line number Diff line number Diff line change
@@ -1,3 +1,47 @@
# This source defines all the common settings for any AWS AMI (whatever Operating System)
source "amazon-ebs" "base" {
# profile = "terraform-developer"

# AWS API connection
access_key = var.aws_access_key_id
secret_key = var.aws_secret_access_key

dduportal marked this conversation as resolved.
Show resolved Hide resolved
ami_name = "${local.image_name}-${var.architecture}-${local.now_unix_timestamp}"
# spot_instance_types = local.aws_spot_instance_types[var.architecture] // if spot instances is used
# spot_price = "auto"
instance_type = local.aws_instance_types[var.architecture]
# instance_type = "t2.xlarge"
jayfranco999 marked this conversation as resolved.
Show resolved Hide resolved


# Define custom rootfs for build to avoid later filesystem extension during agent startups
launch_block_device_mappings {
delete_on_termination = true
device_name = "/dev/sda1"
volume_size = local.windows_disk_size_gb
jayfranco999 marked this conversation as resolved.
Show resolved Hide resolved
volume_type = "gp2"
jayfranco999 marked this conversation as resolved.
Show resolved Hide resolved
}

# Where to build the VM
region = var.aws_region

# Where to export the AMI
ami_regions = [
var.aws_region
]

# Egg-and-chicken: what is the base image to start from (eg. what is my egg)?
source_ami = data.amazon-ami["${var.agent_os_type}-${local.agent_os_version_safe}"].id
# To improve audit and garbage collecting, we provide tags
tags = {
imageplatform = var.architecture
imagetype = local.image_name
timestamp = local.now_unix_timestamp
version = var.image_version
scm_ref = var.scm_ref
build_type = var.build_type
}
}

# This source defines all the common settings for any Azure image (whatever Operating System)
source "azure-arm" "base" {
managed_image_resource_group_name = local.azure_destination_resource_group
Expand Down
50 changes: 50 additions & 0 deletions updatecli/updatecli.d/packer-plugins/amazon.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
---
name: Bump packer amazon plugin version

scms:
default:
kind: github
spec:
user: "{{ .github.user }}"
email: "{{ .github.email }}"
owner: "{{ .github.owner }}"
repository: "{{ .github.repository }}"
token: "{{ requiredEnv .github.token }}"
username: "{{ .github.username }}"
branch: "{{ .github.branch }}"

sources:
lastReleaseVersion:
kind: githubrelease
name: Get the latest packer's amazon plugin version
spec:
owner: "hashicorp"
repository: "packer-plugin-amazon"
token: "{{ requiredEnv .github.token }}"
username: "{{ .github.username }}"
versionfilter:
kind: semver
transformers:
- trimprefix: v

targets:
updateVersion:
name: "Update the amazon plugin version in main.pkr.hcl"
sourceid: lastReleaseVersion
kind: file
spec:
file: main.pkr.hcl
matchpattern: 'amazon = \{((\r\n|\r|\n)(\s+))version = ".*"'
replacepattern: >-
amazon = {${1}version = "{{ source "lastReleaseVersion" }}"
scmid: default

actions:
default:
kind: github/pullrequest
title: Bump packer amazon plugin version to {{ source "lastReleaseVersion" }}
scmid: default
spec:
labels:
- dependencies
- packer-amazon-plugin
14 changes: 13 additions & 1 deletion variables.pkr.hcl
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,18 @@ variable "architecture" {
description = "CPU architecture ID of the build with the following possible values: [amd64 (default), arm64]"
default = "amd64"
}
variable "aws_region" {
type = string
default = "us-east-2"
}
variable "aws_access_key_id" {
type = string
default = env("AWS_ACCESS_KEY_ID")
}
variable "aws_secret_access_key" {
type = string
default = env("AWS_SECRET_ACCESS_KEY")
}
dduportal marked this conversation as resolved.
Show resolved Hide resolved
variable "azure_client_id" {
type = string
default = env("AZURE_CLIENT_ID")
Expand All @@ -35,7 +47,7 @@ variable "image_version" {
}
variable "image_type" {
type = string
description = "Which kind of Packer builder to use (e.g. cloud platform): [azure-arm (default), docker]"
description = "Which kind of Packer builder to use (e.g. cloud platform): [amazon-ebs, azure-arm (default), docker]"
default = "azure-arm"
}
variable "build_type" {
Expand Down