Skip to content

Add module release process #19

Merged
merged 51 commits into from
Apr 3, 2025
Merged
Show file tree
Hide file tree
Changes from 49 commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
7358d10
add startup taint
morga471 Mar 5, 2025
07d456f
add namespace and startup taint to template
morga471 Mar 5, 2025
ea60e93
templatlize
morga471 Mar 5, 2025
40ed7b6
fix vals
morga471 Mar 5, 2025
0d8a8f6
fewer things
morga471 Mar 5, 2025
501aacd
add a few missing values
morga471 Mar 5, 2025
19cf7e6
create ns
morga471 Mar 5, 2025
1a547b5
update values
morga471 Mar 5, 2025
d445b1c
add nodeSelector and tolerations
morga471 Mar 5, 2025
81a8b56
remove digest
morga471 Mar 5, 2025
449243a
node group
morga471 Mar 5, 2025
b0c7ec8
fmt
morga471 Mar 5, 2025
0d06502
syntax and startupTaints
morga471 Mar 5, 2025
2b46504
fix syntax
morga471 Mar 5, 2025
69e8502
update values
morga471 Mar 5, 2025
7c5fa11
remove ng selector
morga471 Mar 5, 2025
9c910c3
lower cpu requests
morga471 Mar 5, 2025
ec02f16
use digest again
morga471 Mar 5, 2025
116fdff
simplify repository
morga471 Mar 5, 2025
671a726
fix repository
morga471 Mar 5, 2025
8c8cbf1
escape the .
morga471 Mar 5, 2025
762af8a
fix subnets_name
morga471 Mar 5, 2025
bc4911c
subnet selector
morga471 Mar 5, 2025
91b59f7
use the outputs from karpenter module
morga471 Mar 5, 2025
38dab0b
create instance profile true
morga471 Mar 5, 2025
687523d
cleanup
morga471 Mar 5, 2025
e49cb0d
without cluster tag
morga471 Mar 5, 2025
64c71a1
pass in vpc
morga471 Mar 5, 2025
a7d4d44
enable debug and disable serviceMonitor
morga471 Mar 6, 2025
4ef14ef
fix merge issues
morga471 Mar 11, 2025
7e9c2b6
update resources and set eksControlPlane true
morga471 Mar 22, 2025
92bb9ca
try enable_pod_identity
morga471 Mar 24, 2025
7652208
update updated upstream
morga471 Mar 24, 2025
6ca5756
more options for namings
morga471 Mar 24, 2025
1d20564
shorter
morga471 Mar 24, 2025
33b6967
validate role name length
morga471 Mar 24, 2025
8a57be2
validate event rules name length
morga471 Mar 24, 2025
a10b32e
shorter
morga471 Mar 24, 2025
82c4bfb
shorter still
morga471 Mar 24, 2025
b31af4f
fix prefix
morga471 Mar 24, 2025
d03299a
name the queue
morga471 Mar 24, 2025
591720c
66 - 3 = 63, limit 64
morga471 Mar 24, 2025
c37722a
longest event name is InstanceStateChange
morga471 Mar 24, 2025
d07da3c
another
morga471 Mar 25, 2025
47cf922
maybe
morga471 Mar 25, 2025
a76b71e
name
morga471 Mar 25, 2025
6a49954
name_prefix
morga471 Mar 25, 2025
c6d8a70
or_not
morga471 Mar 25, 2025
bb56bad
add module release process
morga471 Apr 1, 2025
f203a80
update module source
morga471 Apr 1, 2025
37fe374
update release actions
morga471 Apr 3, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
73 changes: 73 additions & 0 deletions .github/workflows/terraform-release.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
name: Terraform CI/CD
on:
workflow_dispatch:
pull_request:
types: [closed]
branches:
- main
jobs:
terraform-ci-cd:
runs-on: 229685449397
permissions:
contents: write

steps:
- name: Checkout code
uses: CSVD/gh-actions-checkout@v4

- name: Setup Terraform
uses: CSVD/gh-actions-setup-terraform@v3
with:
terraform_version: "1.9.1"

- name: Setup GITHUB Credentials
id: github_credentials
uses: CSVD/gh-auth@main
with:
github_app_pem_file: ${{ secrets.GH_APP_PEM_FILE }}
github_app_installation_id: ${{ vars.GH_APP_INSTALLATION_ID }}
github_app_id: ${{ vars.GH_APP_ID }}


- name: Debug Authentication
run: |
# Print the GitHub server URL
echo "GitHub Server URL: ${{ github.server_url }}"
# Extract the host from the URL
HOST="${{ github.server_url }}"
HOST="${HOST#*//}"
HOST="${HOST%%/*}"
echo "GitHub Host: $HOST"
# Check if token exists
if [[ -n "${{ steps.github_credentials.outputs.github_token }}" ]]; then
echo "Token generated successfully"
# Test the token with a simple GitHub API call (without exposing the token)
STATUS=$(curl -s -o /dev/null -w "%{http_code}" -H "Authorization: Bearer ${{ steps.github_credentials.outputs.github_token }}" "${{ github.server_url }}/api/v3/user")
echo "API Test Status Code: $STATUS"
else
echo "No token was generated!"
fi
- name: Setup GitHub CLI
run: |
# Force manual authentication since setup-git might not work with GitHub Enterprise
echo "${{ steps.github_credentials.outputs.github_token }}" > /tmp/token.txt
gh auth login --with-token --hostname "github.e.it.census.gov" < /tmp/token.txt
rm /tmp/token.txt
# Test GitHub CLI auth status
gh auth status || echo "GitHub CLI authentication failed"
- name: AWS Auth
id: aws_auth
uses: CSVD/aws-auth@main
with:
ecs: true

- name: Run Terraform Module Release Action
uses: CSVD/terraform-module-release@main
with:
github-token: ${{ steps.github_credentials.outputs.github_token }}
working-directory: '.'
42 changes: 42 additions & 0 deletions .github/workflows/terraform-validate.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
name: Terraform Validate
on:
pull_request:
workflow_dispatch:

jobs:

terraform-validate:
runs-on: "229685449397"
permissions:
contents: write
steps:
- name: Checkout code
uses: CSVD/gh-actions-checkout@v4

- name: Setup Terraform
uses: CSVD/gh-actions-setup-terraform@v2
with:
terraform_version: '1.7.3'

- name: Validate Terraform Configuration
id: validate
uses: CSVD/terraform-validate@main

- name: Check Validation/Test Results
if: always()
run: |
# Set default values if outputs are empty
IS_VALID="${{ steps.validate.outputs.is_valid }}"
TESTS_PASSED="${{ steps.validate.outputs.tests_passed }}"
# If outputs are empty, set them to false
[ -z "$IS_VALID" ] && IS_VALID="false"
[ -z "$TESTS_PASSED" ] && TESTS_PASSED="false"
if [[ "$IS_VALID" != "true" || "$TESTS_PASSED" != "true" ]]; then
echo "Validation or test errors found:"
echo "${{ steps.validate.outputs.stderr }}"
exit 1
else
echo "All validations and tests passed successfully!"
fi
101 changes: 0 additions & 101 deletions .github/workflows/terragrunt-cicd.yml

This file was deleted.

2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ The module deploys Karpenter needed AWS resources, namely in IAM. It copies the
| Name | Source | Version |
|------|--------|---------|
| <a name="module_images"></a> [images](#module\_images) | git@github.e.it.census.gov:terraform-modules/aws-ecr-copy-images.git/ | tf-upgrade |
| <a name="module_karpenter_resources"></a> [karpenter\_resources](#module\_karpenter\_resources) | git@github.e.it.census.gov:SCT-Engineering/terraform-aws-eks.git//modules/karpenter | v20.33.1 |
| <a name="module_karpenter_resources"></a> [karpenter\_resources](#module\_karpenter\_resources) | git@github.e.it.census.gov:SCT-Engineering/terraform-aws-eks.git//modules/karpenter | v20.34.0 |

## Resources

Expand Down
26 changes: 20 additions & 6 deletions karpenter/values.yaml.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ settings:
clusterEndpoint: ${cluster_endpoint}
interruptionQueue: ${queue_name}
isolatedVPC: true
eksControlPlane: true
featureGates:
nodeRepair: true
reservedCapacity: true
Expand All @@ -19,17 +20,17 @@ serviceMonitor:
logLevel: debug

controller:
image:
repository: ${repository}
tag: ${tag}
digest: ${digest}
resources:
requests:
cpu: 1m
memory: 1Mi
cpu: 100m
memory: 1Gi
limits:
cpu: 500m
memory: 1Gi
image:
repository: ${repository}
tag: ${tag}
digest: ${digest}
env:
- name: AWS_REGION
value: ${region}
Expand All @@ -40,6 +41,19 @@ controller:
operator: "Exists"
effect: "NoSchedule"

nodeSelector:
kubernetes.io/os: linux

tolerations:
- key: CriticalAddonsOnly
operator: Exists
- key: node-role.kubernetes.io/master
operator: Exists
effect: NoSchedule
- key: node-role.kubernetes.io/control-plane
operator: Exists
effect: NoSchedule

affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
Expand Down
32 changes: 26 additions & 6 deletions main.tf
Original file line number Diff line number Diff line change
@@ -1,21 +1,41 @@
locals {
amd_ami_family = "Bottlerocket"
amd_ami_alias = "bottlerocket@latest"

# Calculate the role name with prefix
role_name_raw = format("%v%v-%v", local.prefixes["eks-role"], var.cluster_name, "karpenter-")

# Ensure role name stays within AWS limits (38 chars) when used as name_prefix
max_role_name_length = 37
node_iam_role_name = length(local.role_name_raw) > local.max_role_name_length ? substr(local.role_name_raw, 0, local.max_role_name_length) : local.role_name_raw

# EventBridge rule name validation
# Leave enough space for suffixes like "SpotInterrupt" and unique IDs generated by AWS
# EventBridge has a max length of 64 chars
rule_name_raw = format("%v%v", local.prefixes["event-rule"], var.cluster_name)
max_rule_name_length = 8
rule_name_prefix = length(local.rule_name_raw) > local.max_rule_name_length ? substr(local.rule_name_raw, 0, local.max_rule_name_length) : local.rule_name_raw
queue_name = format("%v%v", local.prefixes["eks-queue"], var.cluster_name)
}

# Replicating from here: https://github.e.it.census.gov/SCT-Engineering/terraform-aws-eks/tree/master/modules/karpenter
# Karpenter IRSA roles and policies
module "karpenter_resources" {
source = "git@github.e.it.census.gov:SCT-Engineering/terraform-aws-eks.git//modules/karpenter?ref=v20.33.1"
source = "git@github.e.it.census.gov:SCT-Engineering/terraform-aws-eks.git//modules/karpenter?ref=v20.34.0"

cluster_name = var.cluster_name
enable_irsa = true
irsa_oidc_provider_arn = var.oidc_provider_arn
irsa_namespace_service_accounts = ["${var.namespace}:karpenter"]
create_access_entry = true
create_instance_profile = true
create_node_iam_role = true
create_pod_identity_association = true
enable_irsa = true
enable_pod_identity = true
enable_v1_permissions = true
create_instance_profile = true

irsa_namespace_service_accounts = ["${var.namespace}:karpenter"]
irsa_oidc_provider_arn = var.oidc_provider_arn
node_iam_role_name = local.node_iam_role_name
queue_name = local.queue_name
rule_name_prefix = local.rule_name_prefix
# Attach additional IAM policies to the Karpenter node IAM role
node_iam_role_additional_policies = {
AmazonSSMManagedInstanceCore = format("arn:%v:iam::%v:%v", data.aws_arn.current.partition, "aws", "policy/AmazonSSMManagedInstanceCore")
Expand Down
37 changes: 37 additions & 0 deletions prefixes.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
locals {
prefixes = {
"efs" = "v-efs-"
"s3" = "v-s3-"
"ebs" = "v-ebs-"
"kms" = "k-kms-"
"role" = "r-"
"policy" = "p-"
"group" = "g-"
"security-group" = "" # "sg-"
# VPC
"vpc" = ""
"dhcp-options" = ""
"vpc-peer" = "vpcp-"
"route-table" = "route-"
"subnet" = ""
"vpc-endpoint" = "vpce-"
"elastic-ip" = "eip-"
"nat-gateway" = "nat-"
"internet-gateway" = "igw-"
"network-acl" = "nacl-"
"customer-gateway" = "cgw-"
"vpn-gateway" = "vpcg-"
"vpn-connection" = "vpn_"
"log-group" = "lg-"
"log-stream" = "lgs-"
# EKS
"eks" = "eks-"
"eks-s3" = "v-s3-eks-"
"eks-user" = "s-eks-"
"eks-role" = "r-eks-"
"eks-policy" = "p-eks-"
"eks-security-group" = "eks-sg-" # "sg-eks-"
"event-rule" = "eks-ev-"
"eks-queue" = "eks-q-"
}
}
Loading