Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 004f18a176 | |||
| 84d0ebff48 | |||
| 29957c6239 | |||
| e728a8d819 | |||
| 69d04b9ea7 |
Binary file not shown.
Binary file not shown.
@@ -4,7 +4,7 @@ go 1.23
|
||||
|
||||
require (
|
||||
github.com/aws/aws-lambda-go v1.47.0
|
||||
github.com/aws/aws-sdk-go-v2 v1.32.5
|
||||
github.com/aws/aws-sdk-go-v2 v1.32.6
|
||||
github.com/aws/aws-sdk-go-v2/config v1.28.0
|
||||
github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.15.12
|
||||
github.com/aws/aws-sdk-go-v2/service/dynamodb v1.38.0
|
||||
@@ -12,3 +12,21 @@ require (
|
||||
github.com/aws/aws-sdk-go-v2/service/lambda v1.69.0
|
||||
gopkg.in/yaml.v3 v3.0.1
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.7 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/credentials v1.17.41 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.17 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.25 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.25 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.24.2 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.10.6 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.6 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/sso v1.24.2 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.2 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/sts v1.32.2 // indirect
|
||||
github.com/aws/smithy-go v1.22.1 // indirect
|
||||
github.com/jmespath/go-jmespath v0.4.0 // indirect
|
||||
)
|
||||
|
||||
@@ -0,0 +1,60 @@
|
||||
github.com/aws/aws-lambda-go v1.47.0 h1:0H8s0vumYx/YKs4sE7YM0ktwL2eWse+kfopsRI1sXVI=
|
||||
github.com/aws/aws-lambda-go v1.47.0/go.mod h1:dpMpZgvWx5vuQJfBt0zqBha60q7Dd7RfgJv23DymV8A=
|
||||
github.com/aws/aws-sdk-go-v2 v1.32.6 h1:7BokKRgRPuGmKkFMhEg/jSul+tB9VvXhcViILtfG8b4=
|
||||
github.com/aws/aws-sdk-go-v2 v1.32.6/go.mod h1:P5WJBrYqqbWVaOxgH0X/FYYD47/nooaPOZPlQdmiN2U=
|
||||
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.7 h1:lL7IfaFzngfx0ZwUGOZdsFFnQ5uLvR0hWqqhyE7Q9M8=
|
||||
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.7/go.mod h1:QraP0UcVlQJsmHfioCrveWOC1nbiWUl3ej08h4mXWoc=
|
||||
github.com/aws/aws-sdk-go-v2/config v1.28.0 h1:FosVYWcqEtWNxHn8gB/Vs6jOlNwSoyOCA/g/sxyySOQ=
|
||||
github.com/aws/aws-sdk-go-v2/config v1.28.0/go.mod h1:pYhbtvg1siOOg8h5an77rXle9tVG8T+BWLWAo7cOukc=
|
||||
github.com/aws/aws-sdk-go-v2/credentials v1.17.41 h1:7gXo+Axmp+R4Z+AK8YFQO0ZV3L0gizGINCOWxSLY9W8=
|
||||
github.com/aws/aws-sdk-go-v2/credentials v1.17.41/go.mod h1:u4Eb8d3394YLubphT4jLEwN1rLNq2wFOlT6OuxFwPzU=
|
||||
github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.15.12 h1:zYf8E8zaqolHA5nQ+VmX2r3wc4K6xw5i6xKvvMjZBL0=
|
||||
github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.15.12/go.mod h1:vYGIVLASk19Gb0FGwAcwES+qQF/aekD7m2G/X6mBOdQ=
|
||||
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.17 h1:TMH3f/SCAWdNtXXVPPu5D6wrr4G5hI1rAxbcocKfC7Q=
|
||||
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.17/go.mod h1:1ZRXLdTpzdJb9fwTMXiLipENRxkGMTn1sfKexGllQCw=
|
||||
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.25 h1:s/fF4+yDQDoElYhfIVvSNyeCydfbuTKzhxSXDXCPasU=
|
||||
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.25/go.mod h1:IgPfDv5jqFIzQSNbUEMoitNooSMXjRSDkhXv8jiROvU=
|
||||
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.25 h1:ZntTCl5EsYnhN/IygQEUugpdwbhdkom9uHcbCftiGgA=
|
||||
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.25/go.mod h1:DBdPrgeocww+CSl1C8cEV8PN1mHMBhuCDLpXezyvWkE=
|
||||
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ=
|
||||
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc=
|
||||
github.com/aws/aws-sdk-go-v2/service/dynamodb v1.38.0 h1:isKhHsjpQR3CypQJ4G1g8QWx7zNpiC/xKw1zjgJYVno=
|
||||
github.com/aws/aws-sdk-go-v2/service/dynamodb v1.38.0/go.mod h1:xDvUyIkwBwNtVZJdHEwAuhFly3mezwdEWkbJ5oNYwIw=
|
||||
github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.24.2 h1:E7Tuo0ipWpBl0f3uThz8cZsuyD5H8jLCnbtbKR4YL2s=
|
||||
github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.24.2/go.mod h1:txOfweuNPBLhHodsV+C2lvPPRTommVTWbts9SZV6Myc=
|
||||
github.com/aws/aws-sdk-go-v2/service/ec2 v1.198.0 h1:ivPJXmGlzAjgy0jLO9naExUWE8IM8lLRcRKLPBEx6Q0=
|
||||
github.com/aws/aws-sdk-go-v2/service/ec2 v1.198.0/go.mod h1:00zqVNJFK6UASrTnuvjJHJuaqUdkVz5tW8Ip+VhzuNg=
|
||||
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 h1:iXtILhvDxB6kPvEXgsDhGaZCSC6LQET5ZHSdJozeI0Y=
|
||||
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1/go.mod h1:9nu0fVANtYiAePIBh2/pFUSwtJ402hLnp854CNoDOeE=
|
||||
github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.10.6 h1:nbmKXZzXPJn41CcD4HsHsGWqvKjLKz9kWu6XxvLmf1s=
|
||||
github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.10.6/go.mod h1:SJhcisfKfAawsdNQoZMBEjg+vyN2lH6rO6fP+T94z5Y=
|
||||
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.6 h1:50+XsN70RS7dwJ2CkVNXzj7U2L1HKP8nqTd3XWEXBN4=
|
||||
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.6/go.mod h1:WqgLmwY7so32kG01zD8CPTJWVWM+TzJoOVHwTg4aPug=
|
||||
github.com/aws/aws-sdk-go-v2/service/lambda v1.69.0 h1:BXt75frE/FYtAmEDBJRBa2HexOw+oAZWZl6QknZEFgg=
|
||||
github.com/aws/aws-sdk-go-v2/service/lambda v1.69.0/go.mod h1:guz2K3x4FKSdDaoeB+TPVgJNU9oj2gftbp5cR8ela1A=
|
||||
github.com/aws/aws-sdk-go-v2/service/sso v1.24.2 h1:bSYXVyUzoTHoKalBmwaZxs97HU9DWWI3ehHSAMa7xOk=
|
||||
github.com/aws/aws-sdk-go-v2/service/sso v1.24.2/go.mod h1:skMqY7JElusiOUjMJMOv1jJsP7YUg7DrhgqZZWuzu1U=
|
||||
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.2 h1:AhmO1fHINP9vFYUE0LHzCWg/LfUWUF+zFPEcY9QXb7o=
|
||||
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.2/go.mod h1:o8aQygT2+MVP0NaV6kbdE1YnnIM8RRVQzoeUH45GOdI=
|
||||
github.com/aws/aws-sdk-go-v2/service/sts v1.32.2 h1:CiS7i0+FUe+/YY1GvIBLLrR/XNGZ4CtM1Ll0XavNuVo=
|
||||
github.com/aws/aws-sdk-go-v2/service/sts v1.32.2/go.mod h1:HtaiBI8CjYoNVde8arShXb94UbQQi9L4EMr6D+xGBwo=
|
||||
github.com/aws/smithy-go v1.22.1 h1:/HPHZQ0g7f4eUeK6HKglFz8uwVfZKgoI25rb/J+dnro=
|
||||
github.com/aws/smithy-go v1.22.1/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=
|
||||
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
|
||||
github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8=
|
||||
github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/testify v1.7.2 h1:4jaiDzPyXQvSd7D0EjG45355tLlV3VOECpq10pLC+8s=
|
||||
github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
|
||||
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
@@ -100,38 +100,38 @@ type spotConfig struct {
|
||||
}
|
||||
|
||||
var labelToSpot = map[string]spotConfig{
|
||||
"go": {InstanceType: "t3.small", MaxPrice: "0.008"},
|
||||
"node": {InstanceType: "t3.small", MaxPrice: "0.008"},
|
||||
"docker": {InstanceType: "t3.medium", MaxPrice: "0.016"},
|
||||
"deploy": {InstanceType: "t3.micro", MaxPrice: "0.004"},
|
||||
"godot": {InstanceType: "t3.medium", MaxPrice: "0.016"},
|
||||
"go": {InstanceType: "t3.small", MaxPrice: "0.02"},
|
||||
"node": {InstanceType: "t3.medium", MaxPrice: "0.04"},
|
||||
"docker": {InstanceType: "t3.medium", MaxPrice: "0.04"},
|
||||
"deploy": {InstanceType: "t3.micro", MaxPrice: "0.01"},
|
||||
"godot": {InstanceType: "t3.medium", MaxPrice: "0.04"},
|
||||
}
|
||||
|
||||
// --- Config from env ---
|
||||
|
||||
type cfg struct {
|
||||
GiteaURL string
|
||||
GiteaToken string
|
||||
ExecFnName string
|
||||
AMI string // pre-baked AMI with Go, Node, Docker, AWS CLI, act_runner
|
||||
Subnet string
|
||||
SecurityGroup string
|
||||
DDBTable string
|
||||
GiteaURL string
|
||||
GiteaToken string // API token (for fetching workflows, setting commit status)
|
||||
RunnerToken string // Runner registration token (for act_runner register)
|
||||
ExecFnName string
|
||||
AMI string // pre-baked AMI with Go, Node, Docker, AWS CLI, act_runner
|
||||
Subnet string
|
||||
SecurityGroup string
|
||||
DDBTable string
|
||||
InstanceProfile string
|
||||
Region string
|
||||
}
|
||||
|
||||
func loadCfg() cfg {
|
||||
return cfg{
|
||||
GiteaURL: os.Getenv("GITEA_URL"),
|
||||
GiteaToken: os.Getenv("GITEA_TOKEN"),
|
||||
RunnerToken: os.Getenv("RUNNER_TOKEN"),
|
||||
ExecFnName: os.Getenv("EXECUTOR_FUNCTION_NAME"),
|
||||
AMI: os.Getenv("RUNNER_AMI"),
|
||||
Subnet: os.Getenv("SUBNET"),
|
||||
SecurityGroup: os.Getenv("SECURITY_GROUP"),
|
||||
DDBTable: os.Getenv("DDB_TABLE"),
|
||||
InstanceProfile: os.Getenv("INSTANCE_PROFILE"), // IAM instance profile ARN
|
||||
Region: os.Getenv("AWS_REGION"),
|
||||
InstanceProfile: os.Getenv("INSTANCE_PROFILE"),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -144,8 +144,11 @@ set -euo pipefail
|
||||
exec > /var/log/tinqs-ci.log 2>&1
|
||||
|
||||
echo "=== Tinqs CI Runner: %s ==="
|
||||
INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
|
||||
REGION=%s
|
||||
|
||||
# Get instance metadata (IMDSv2)
|
||||
TOKEN=$(curl -s -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 60")
|
||||
INSTANCE_ID=$(curl -s -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/instance-id)
|
||||
REGION=$(curl -s -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/placement/region)
|
||||
|
||||
# Self-termination trap — kill instance on exit (success or failure)
|
||||
cleanup() {
|
||||
@@ -154,8 +157,16 @@ cleanup() {
|
||||
}
|
||||
trap cleanup EXIT
|
||||
|
||||
# act_runner is pre-installed in the AMI at /usr/local/bin/act_runner
|
||||
cd /tmp
|
||||
# Source Go/Node paths from AMI
|
||||
export PATH=$PATH:/usr/local/go/bin:/usr/local/bin
|
||||
export HOME=/root
|
||||
|
||||
# Ensure AWS SDK can find instance profile credentials via IMDS
|
||||
# act_runner may change HOME — force credential chain to use IMDS
|
||||
export AWS_EC2_METADATA_DISABLED=false
|
||||
|
||||
# Create proper working directory for act_runner
|
||||
mkdir -p /opt/runner && cd /opt/runner
|
||||
|
||||
# Register as ephemeral runner (picks one job, then exits)
|
||||
act_runner register --no-interactive \
|
||||
@@ -164,11 +175,28 @@ act_runner register --no-interactive \
|
||||
--name %s \
|
||||
--labels "%s:host"
|
||||
|
||||
# Configure runner to use /opt/runner as workdir
|
||||
cat > .runner.yaml << 'RUNCFG'
|
||||
log:
|
||||
level: info
|
||||
runner:
|
||||
capacity: 1
|
||||
timeout: 30m
|
||||
envs:
|
||||
HOME: /root
|
||||
AWS_DEFAULT_REGION: eu-west-1
|
||||
PATH: /usr/local/go/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
|
||||
host:
|
||||
workdir_parent: /opt/runner/work
|
||||
RUNCFG
|
||||
|
||||
mkdir -p /opt/runner/work
|
||||
|
||||
# Run — blocks until the job completes, then exits (ephemeral mode)
|
||||
act_runner daemon
|
||||
act_runner daemon --config .runner.yaml
|
||||
|
||||
echo "=== Runner exited, cleanup will terminate instance ==="
|
||||
`, runnerName, c.Region, c.GiteaURL, c.GiteaToken, runnerName, label)
|
||||
`, runnerName, c.GiteaURL, c.RunnerToken, runnerName, label)
|
||||
|
||||
return base64.StdEncoding.EncodeToString([]byte(script))
|
||||
}
|
||||
@@ -281,6 +309,12 @@ func startSpotRunner(ctx context.Context, c cfg, label, runID string) (string, e
|
||||
|
||||
client := ec2.NewFromConfig(awsCfg)
|
||||
|
||||
// Docker builds need more disk (monorepo + layers)
|
||||
diskSize := int32(20)
|
||||
if label == "docker" {
|
||||
diskSize = 40
|
||||
}
|
||||
|
||||
out, err := client.RunInstances(ctx, &ec2.RunInstancesInput{
|
||||
ImageId: aws.String(c.AMI),
|
||||
InstanceType: ec2types.InstanceType(spot.InstanceType),
|
||||
@@ -288,6 +322,16 @@ func startSpotRunner(ctx context.Context, c cfg, label, runID string) (string, e
|
||||
MaxCount: aws.Int32(1),
|
||||
UserData: aws.String(userData),
|
||||
|
||||
// Root volume — bigger for Docker builds
|
||||
BlockDeviceMappings: []ec2types.BlockDeviceMapping{{
|
||||
DeviceName: aws.String("/dev/xvda"),
|
||||
Ebs: &ec2types.EbsBlockDevice{
|
||||
VolumeSize: aws.Int32(diskSize),
|
||||
VolumeType: ec2types.VolumeTypeGp3,
|
||||
DeleteOnTermination: aws.Bool(true),
|
||||
},
|
||||
}},
|
||||
|
||||
// Spot request
|
||||
InstanceMarketOptions: &ec2types.InstanceMarketOptionsRequest{
|
||||
MarketType: ec2types.MarketTypeSpot,
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,12 @@
|
||||
github.com/aws/aws-lambda-go v1.47.0 h1:0H8s0vumYx/YKs4sE7YM0ktwL2eWse+kfopsRI1sXVI=
|
||||
github.com/aws/aws-lambda-go v1.47.0/go.mod h1:dpMpZgvWx5vuQJfBt0zqBha60q7Dd7RfgJv23DymV8A=
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/stretchr/testify v1.7.2 h1:4jaiDzPyXQvSd7D0EjG45355tLlV3VOECpq10pLC+8s=
|
||||
github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
@@ -1,8 +1,9 @@
|
||||
# tinqs/ci/setup-aws — Tinqs Studio CI
|
||||
# Installs AWS CLI and optionally logs into ECR.
|
||||
# Detects Alpine (musl) vs Debian (glibc) and uses the right install method.
|
||||
# Credentials come from the runner environment (IAM task role on Fargate, instance
|
||||
# profile on EC2/Lightsail) — no explicit key configuration needed.
|
||||
# Detects Alpine (apk/pip), Debian (apt-get), and Amazon Linux/RHEL (dnf).
|
||||
# Skips install if AWS CLI is already present (pre-baked AMI).
|
||||
# Credentials come from the runner environment (IAM instance profile on EC2,
|
||||
# task role on Fargate) — no explicit key configuration needed.
|
||||
# Composite action — runs directly on the host.
|
||||
# Author: Ozan + Claude Code — 2026-05-22
|
||||
|
||||
@@ -35,9 +36,8 @@ runs:
|
||||
# Alpine — use pip (AWS CLI v2 binary needs glibc)
|
||||
apk add --no-cache python3 py3-pip
|
||||
pip3 install --break-system-packages awscli 2>/dev/null || pip3 install awscli
|
||||
elif command -v apt-get &>/dev/null; then
|
||||
# Debian/Ubuntu — use official installer
|
||||
apt-get update && apt-get install -y unzip curl
|
||||
elif command -v dnf &>/dev/null || command -v apt-get &>/dev/null; then
|
||||
# Amazon Linux / Debian — official installer (glibc available)
|
||||
curl -fsSL https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip -o /tmp/awscli.zip
|
||||
unzip -q /tmp/awscli.zip -d /tmp/aws-install
|
||||
/tmp/aws-install/aws/install
|
||||
|
||||
+16
-5
@@ -1,7 +1,7 @@
|
||||
# tinqs/ci/setup-node — Tinqs Studio CI
|
||||
# Installs Node.js and optionally pnpm.
|
||||
# Detects Alpine vs Debian and uses the right package manager.
|
||||
# Skips install if the correct major version is already present (pre-baked runner image).
|
||||
# Detects Alpine (apk), Debian (apt-get), and Amazon Linux/RHEL (dnf).
|
||||
# Skips install if the correct major version is already present (pre-baked AMI).
|
||||
# Composite action — runs directly on the host.
|
||||
# Author: Ozan + Claude Code — 2026-05-22
|
||||
|
||||
@@ -29,10 +29,17 @@ runs:
|
||||
if [ "$CURRENT" = "$NODE_VERSION" ]; then
|
||||
echo "Node $NODE_VERSION already installed"
|
||||
node --version
|
||||
if [ "$INSTALL_PNPM" = "true" ] && command -v pnpm &>/dev/null; then
|
||||
pnpm --version
|
||||
exit 0
|
||||
if [ "$INSTALL_PNPM" = "true" ]; then
|
||||
if command -v pnpm &>/dev/null; then
|
||||
pnpm --version
|
||||
exit 0
|
||||
else
|
||||
npm install -g pnpm
|
||||
pnpm --version
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
|
||||
@@ -40,6 +47,10 @@ runs:
|
||||
if command -v apk &>/dev/null; then
|
||||
# Alpine
|
||||
apk add --no-cache nodejs npm
|
||||
elif command -v dnf &>/dev/null; then
|
||||
# Amazon Linux / RHEL / Fedora
|
||||
curl -fsSL "https://rpm.nodesource.com/setup_${NODE_VERSION}.x" | bash -
|
||||
dnf install -y nodejs
|
||||
elif command -v apt-get &>/dev/null; then
|
||||
# Debian/Ubuntu
|
||||
curl -fsSL "https://deb.nodesource.com/setup_${NODE_VERSION}.x" | bash -
|
||||
|
||||
Reference in New Issue
Block a user