GitHub Action ubuntu-latest环境下Bash脚本执行报错求助
问题:Bash脚本在GitHub Action环境执行失败,本地运行正常
脚本内容
set -e get_named_query_output=$(aws athena get-named-query --named-query-id $NAMED_QUERY_ID) named_query_string=$(echo "$get_named_query_output" | jq -r '.NamedQuery.QueryString') named_query_workgroup=$(echo "$get_named_query_output" | jq -r '.NamedQuery.WorkGroup') named_query_database=$(echo "$get_named_query_output" | jq -r '.NamedQuery.Database') start_query_output=$(aws athena start-query-execution \ --query-string "$named_query_string" \ --work-group "$named_query_workgroup" \ --query-execution-context "Database=$named_query_database" \ --result-configuration "OutputLocation=$S3_OUTPUT_LOCATION") query_execution_id=$(echo "$start_query_output" | jq -r '.QueryExecutionId') check_interval_seconds=5 start_run_time=$(date +%s) poll_execution_status() { while true; do current_run_time=$(date +%s) if ((current_run_time - start_run_time > 30)); then echo "Timeout exceeded" exit 1 fi execution_status=$(aws athena get-query-execution \ --query-execution-id "$query_execution_id" \ --query 'QueryExecution.Status.State' \ --output text) if [ "$execution_status" == "SUCCEEDED" ]; then echo "Query execution succeeded" exit 0 elif [ "$execution_status" == "FAILED" ] || [ "$execution_status" == "CANCELLED" ]; then echo "Query execution failed or was cancelled" exit 1 else echo "Query is still running. Checking again in $check_interval_seconds seconds..." sleep $check_interval_seconds fi done } poll_execution_status
Terraform触发配置
resource "terraform_data" "create_athena_table_usage_script" { provisioner "local-exec" { command = "chmod +x ${path.module}/scripts/generate-athena-table-usage.sh; ${path.module}/scripts/generate-athena-table-usage.sh" environment = { NAMED_QUERY_ID = aws_athena_named_query.create_usage_table.id S3_OUTPUT_LOCATION = "s3://${module.s3_bucket_usage_data.s3_bucket_id}" } } }
出现的错误
错误1:[: SUCCEEDED: unexpected operator
module.usage_service["production"].terraform_data.create_athena_table_usage_script (local-exec): modules/usage-service/scripts/generate-athena-table-usage.sh: 34: [: SUCCEEDED: unexpected operator module.usage_service["production"].terraform_data.create_athena_table_usage_script (local-exec): modules/usage-service/scripts/generate-athena-table-usage.sh: 38: [: SUCCEEDED: unexpected operator module.usage_service["production"].terraform_data.create_athena_table_usage_script (local-exec): modules/usage-service/scripts/generate-athena-table-usage.sh: 38: [: SUCCEEDED: unexpected operator module.usage_service["production"].terraform_data.create_athena_table_usage_script (local-exec): Query is still running. Checking again in 5 seconds...
错误2:current_run_time: not found
module.usage_service["production"].terraform_data.create_athena_table_usage_script (local-exec): modules/usage-service/scripts/generate-athena-table-usage.sh: 23: current_run_time: not found module.usage_service["staging"].terraform_data.create_athena_table_usage_script (local-exec): modules/usage-service/scripts/generate-athena-table-usage.sh: 23: current_run_time: not found
问题原因与解决方案
两个错误的核心原因是GitHub Action的ubuntu-latest环境中,Terraform的local-exec默认使用sh(dash)而非bash执行脚本,而原脚本使用了bash专属语法。
针对性修复
解决
[: SUCCEEDED: unexpected operator错误sh不支持==作为字符串相等比较符,需替换为=- 将所有
[ "$execution_status" == "SUCCEEDED" ]类判断改为[ "$execution_status" = "SUCCEEDED" ]
解决
current_run_time: not found错误sh不支持((...))算术扩展语法,改用标准的[ $(($current_run_time - $start_run_time)) -gt 30 ]格式
更稳妥的兜底方案
- 在脚本第一行添加
#!/bin/bash,强制指定bash解释器 - 或者在Terraform的
local-exec命令中明确用bash执行脚本:bash ${path.module}/scripts/generate-athena-table-usage.sh
- 在脚本第一行添加
修改后的完整脚本
#!/bin/bash set -e get_named_query_output=$(aws athena get-named-query --named-query-id $NAMED_QUERY_ID) named_query_string=$(echo "$get_named_query_output" | jq -r '.NamedQuery.QueryString') named_query_workgroup=$(echo "$get_named_query_output" | jq -r '.NamedQuery.WorkGroup') named_query_database=$(echo "$get_named_query_output" | jq -r '.NamedQuery.Database') start_query_output=$(aws athena start-query-execution \ --query-string "$named_query_string" \ --work-group "$named_query_workgroup" \ --query-execution-context "Database=$named_query_database" \ --result-configuration "OutputLocation=$S3_OUTPUT_LOCATION") query_execution_id=$(echo "$start_query_output" | jq -r '.QueryExecutionId') check_interval_seconds=5 start_run_time=$(date +%s) poll_execution_status() { while true; do current_run_time=$(date +%s) if [ $(($current_run_time - $start_run_time)) -gt 30 ]; then echo "Timeout exceeded" exit 1 fi execution_status=$(aws athena get-query-execution \ --query-execution-id "$query_execution_id" \ --query 'QueryExecution.Status.State' \ --output text) if [ "$execution_status" = "SUCCEEDED" ]; then echo "Query execution succeeded" exit 0 elif [ "$execution_status" = "FAILED" ] || [ "$execution_status" = "CANCELLED" ]; then echo "Query execution failed or was cancelled" exit 1 else echo "Query is still running. Checking again in $check_interval_seconds seconds..." sleep $check_interval_seconds fi done } poll_execution_status
内容的提问来源于stack exchange,提问作者Tal Rofe
相关产品推荐
相关产品推荐

