Skip to content

Commit fd48501

Browse files
committed
feat: Natively support runner job started/completed hooks (#4260)
Pre and post job hooks were added to github actions to help administrators run custom scripts at the beginning and end of every job. As of today the module doesn't support these options out of the box. Add variables to accept these optional scripts and register the hook in user-data. Also enrich linux-arm64 example in multi-runner with pre/post hooks Related to: https://github.com/philips-labs/terraform-aws-github-runner/issues/3854
1 parent ec51082 commit fd48501

File tree

9 files changed

+81
-8
lines changed

9 files changed

+81
-8
lines changed

examples/multi-runner/templates/runner-configs/linux-arm64.yaml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,12 @@ runner_config:
1818
runners_maximum_count: 1
1919
delay_webhook_event: 0
2020
scale_down_schedule_expression: cron(* * * * ? *)
21+
runner_hook_job_started: |
22+
echo "Running pre job hook as \$(whoami)"
23+
24+
# Clean github workspace from previous runs
25+
if [[ -n "\$GITHUB_WORKSPACE" ]]; do
26+
rm -rf "\$GITHUB_WORKSPACE"
27+
done
28+
runner_hook_job_completed: |
29+
echo "Running post job hook as \$(whoami)"

examples/multi-runner/templates/user-data.sh

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,4 +81,18 @@ ${post_install}
8181

8282
cd /opt/actions-runner
8383

84+
%{ if hook_job_started != "" }
85+
cat > /opt/actions-runner/hook_job_started.sh << EOF
86+
${hook_job_started}
87+
EOF
88+
echo ACTIONS_RUNNER_HOOK_JOB_STARTED=/opt/actions-runner/hook_job_started.sh | tee -a /opt/actions-runner/.env
89+
%{ endif }
90+
91+
%{ if hook_job_completed != "" }
92+
cat > /opt/actions-runner/hook_job_completed.sh << EOF
93+
${hook_job_completed}
94+
EOF
95+
echo ACTIONS_RUNNER_HOOK_JOB_COMPLETED=/opt/actions-runner/hook_job_completed.sh | tee -a /opt/actions-runner/.env
96+
%{ endif }
97+
8498
${start_runner}

main.tf

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,8 @@ module "runners" {
249249
userdata_content = var.userdata_content
250250
userdata_pre_install = var.userdata_pre_install
251251
userdata_post_install = var.userdata_post_install
252+
runner_hook_job_started = var.runner_hook_job_started
253+
runner_hook_job_completed = var.runner_hook_job_completed
252254
key_name = var.key_name
253255
runner_ec2_tags = var.runner_ec2_tags
254256

modules/multi-runner/runners.tf

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -86,13 +86,15 @@ module "runners" {
8686
role_path = var.role_path
8787
role_permissions_boundary = var.role_permissions_boundary
8888

89-
enable_userdata = each.value.runner_config.enable_userdata
90-
userdata_template = each.value.runner_config.userdata_template
91-
userdata_content = each.value.runner_config.userdata_content
92-
userdata_pre_install = each.value.runner_config.userdata_pre_install
93-
userdata_post_install = each.value.runner_config.userdata_post_install
94-
key_name = var.key_name
95-
runner_ec2_tags = each.value.runner_config.runner_ec2_tags
89+
enable_userdata = each.value.runner_config.enable_userdata
90+
userdata_template = each.value.runner_config.userdata_template
91+
userdata_content = each.value.runner_config.userdata_content
92+
userdata_pre_install = each.value.runner_config.userdata_pre_install
93+
userdata_post_install = each.value.runner_config.userdata_post_install
94+
runner_hook_job_started = each.value.runner_config.runner_hook_job_started
95+
runner_hook_job_completed = each.value.runner_config.runner_hook_job_completed
96+
key_name = var.key_name
97+
runner_ec2_tags = each.value.runner_config.runner_ec2_tags
9698

9799
create_service_linked_role_spot = each.value.runner_config.create_service_linked_role_spot
98100

modules/multi-runner/variables.tf

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ variable "multi_runner_config" {
7878
cloudwatch_config = optional(string, null)
7979
userdata_pre_install = optional(string, "")
8080
userdata_post_install = optional(string, "")
81+
runner_hook_job_started = optional(string, "")
82+
runner_hook_job_completed = optional(string, "")
8183
runner_ec2_tags = optional(map(string), {})
8284
runner_iam_role_managed_policy_arns = optional(list(string), [])
8385
vpc_id = optional(string, null)
@@ -180,6 +182,8 @@ variable "multi_runner_config" {
180182
cloudwatch_config: "(optional) Replaces the module default cloudwatch log config. See https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-Agent-Configuration-File-Details.html for details."
181183
userdata_pre_install: "Script to be ran before the GitHub Actions runner is installed on the EC2 instances"
182184
userdata_post_install: "Script to be ran after the GitHub Actions runner is installed on the EC2 instances"
185+
runner_hook_job_started: "Script to be ran in the runner environment at the beginning of every job"
186+
runner_hook_job_completed: "Script to be ran in the runner environment at the end of every job"
183187
runner_ec2_tags: "Map of tags that will be added to the launch template instance tag specifications."
184188
runner_iam_role_managed_policy_arns: "Attach AWS or customer-managed IAM policies (by ARN) to the runner IAM role"
185189
vpc_id: "The VPC for security groups of the action runners. If not set uses the value of `var.vpc_id`."

modules/runners/main.tf

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,9 @@ locals {
5454
S3_LOCATION_RUNNER_DISTRIBUTION = local.s3_location_runner_distribution
5555
RUNNER_ARCHITECTURE = var.runner_architecture
5656
})
57-
post_install = var.userdata_post_install
57+
post_install = var.userdata_post_install
58+
hook_job_started = var.runner_hook_job_started
59+
hook_job_completed = var.runner_hook_job_completed
5860
start_runner = templatefile(local.userdata_start_runner[var.runner_os], {
5961
metadata_tags = var.metadata_options != null ? var.metadata_options.instance_metadata_tags : "enabled"
6062
})

modules/runners/templates/user-data.sh

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,4 +62,20 @@ ${install_runner}
6262

6363
${post_install}
6464

65+
# Register runner job hooks
66+
# Ref: https://github.com/actions/runner/blob/main/docs/adrs/1751-runner-job-hooks.md
67+
%{ if hook_job_started != "" }
68+
cat > /opt/actions-runner/hook_job_started.sh << EOF
69+
${hook_job_started}
70+
EOF
71+
echo ACTIONS_RUNNER_HOOK_JOB_STARTED=/opt/actions-runner/hook_job_started.sh | tee -a /opt/actions-runner/.env
72+
%{ endif }
73+
74+
%{ if hook_job_completed != "" }
75+
cat > /opt/actions-runner/hook_job_completed.sh << EOF
76+
${hook_job_completed}
77+
EOF
78+
echo ACTIONS_RUNNER_HOOK_JOB_COMPLETED=/opt/actions-runner/hook_job_completed.sh | tee -a /opt/actions-runner/.env
79+
%{ endif }
80+
6581
${start_runner}

modules/runners/variables.tf

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,18 @@ variable "userdata_post_install" {
172172
default = ""
173173
}
174174

175+
variable "runner_hook_job_started" {
176+
description = "Script to be ran in the runner environment at the beginning of every job"
177+
type = string
178+
default = ""
179+
}
180+
181+
variable "runner_hook_job_completed" {
182+
description = "Script to be ran in the runner environment at the end of every job"
183+
type = string
184+
default = ""
185+
}
186+
175187
variable "sqs_build_queue" {
176188
description = "SQS queue to consume accepted build events."
177189
type = object({

variables.tf

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,18 @@ variable "userdata_post_install" {
280280
description = "Script to be ran after the GitHub Actions runner is installed on the EC2 instances"
281281
}
282282

283+
variable "runner_hook_job_started" {
284+
type = string
285+
default = ""
286+
description = "Script to be ran in the runner environment at the beginning of every job"
287+
}
288+
289+
variable "runner_hook_job_completed" {
290+
type = string
291+
default = ""
292+
description = "Script to be ran in the runner environment at the end of every job"
293+
}
294+
283295
variable "idle_config" {
284296
description = "List of time periods, defined as a cron expression, to keep a minimum amount of runners active instead of scaling down to 0. By defining this list you can ensure that in time periods that match the cron expression within 5 seconds a runner is kept idle."
285297
type = list(object({

0 commit comments

Comments
 (0)