EC2 GitHub Actions Runner
launch-runner :
runs-on : ubuntu-latest
outputs :
label : ${{ steps.launch.outputs.label }} # github runner label
instance-id : ${{ steps.launch.outputs.instance-id }} # ec2 instance id
steps :
- uses : aws-actions/configure-aws-credentials@v1
with :
aws-access-key-id : ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key : ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region : ${{ secrets.AWS_REGION }}
- id : launch
uses : solarwindscloud/ec2-runner-action@main
with :
action : launch
github-token : ${{ secrets.GITHUB_TOKEN }}
runner-user : github # existing user
runner-directory : /github/actions # existing directory containing the runner scripts
instance-type : t4g.medium
ami-name : actions-runner-.+ # the most recent ami matching this regex will be picked
ami-owner : abc12 # only amis from this owner will be considered
subnet-id : def34
security-group-ids : | # one id per line
hij56
klm78
work :
needs : launch-runner
runs-on : ${{ needs.launch-runner.outputs.label }}
steps :
- run : echo "Hello from EC2 !"
terminate-runner :
needs :
- launch-runner
- work # don't terminate until the job is complete
runs-on : ubuntu-latest
if : ${{ always() }} # need to terminate the instance even if the workflow failed
steps :
- uses : aws-actions/configure-aws-credentials@v1
with :
aws-access-key-id : ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key : ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region : ${{ secrets.AWS_REGION }}
- uses : solarwindscloud/ec2-runner-action@main
with :
action : terminate
github-token : ${{ secrets.GITHUB_TOKEN }}
label : ${{ needs.launch-runner.outputs.label }}
instance-id : ${{ needs.launch-runner.outputs.instance-id }}
launch-runners :
runs-on : ubuntu-latest
outputs :
matrix : ${{ steps.launch.outputs.matrix }} # this will be a json object mapping identifiers to labels and instance ids
steps :
- uses : aws-actions/configure-aws-credentials@v1
with :
aws-access-key-id : ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key : ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region : ${{ secrets.AWS_REGION }}
- id : launch
uses : solarwindscloud/ec2-runner-action@main
with :
action : launch
matrix : | # one identifier per line
job1
job2
github-token : ${{ secrets.GITHUB_TOKEN }}
runner-user : github
runner-directory : /github/actions
instance-type : t4g.medium
ami-name : actions-runner-.+
ami-owner : abc12
subnet-id : def34
security-group-ids : |
hij56
klm78
work :
needs : launch-runners
strategy :
matrix :
job :
- job1
- job2
runs-on : ${{ fromJSON(needs.launch-runners.outputs.matrix)[matrix.job].label }} # parse the matrix output, index by identifier, and grab the label
steps :
- run : echo "Hello from EC2 ${{ matrix.job }} !"
terminate-runners :
needs :
- launch-runners
- work
runs-on : ubuntu-latest
if : ${{ always() }}
steps :
- uses : aws-actions/configure-aws-credentials@v1
with :
aws-access-key-id : ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key : ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region : ${{ secrets.AWS_REGION }}
- uses : solarwindscloud/ec2-runner-action@main
with :
action : terminate
github-token : ${{ secrets.GITHUB_TOKEN }}
matrix : ${{ needs.launch-runner.outputs.matrix }} # passing a matrix will terminate all runners, not just one
launch-runners :
runs-on : ubuntu-latest
outputs :
matrix : ${{ steps.launch.outputs.matrix }} # this will be a json object mapping identifiers to labels and instance ids
steps :
- uses : aws-actions/configure-aws-credentials@v1
with :
aws-access-key-id : ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key : ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region : ${{ secrets.AWS_REGION }}
- id : launch
uses : solarwindscloud/ec2-runner-action@main
with :
action : launch
matrix : | # everything is provided as json
{
"job1": {
"runner-user": "github",
"runner-directory": "/github/actions",
"instance-type": "t4g.medium",
"ami-name": "actions-runner-1-.+",
"ami-owner": ["acb12"],
"subnet-id": "def32",
"security-group-ids": [
"hij56",
"klm78"
]
},
"job2": {
"runner-user": "github",
"runner-directory": "/github/actions",
"instance-type": "t4g.medium",
"ami-name": "actions-runner-2-.+",
"ami-owner": ["acb12"],
"subnet-id": "def32",
"security-group-ids": [
"nop90"
]
}
}
work :
needs : launch-runners
strategy :
matrix :
job :
- job1
- job2
runs-on : ${{ fromJSON(needs.launch-runners.outputs.matrix)[matrix.job].label }}
steps :
- run : echo "Hello from EC2 ${{ matrix.job }} !"
terminate-runners :
needs :
- launch-runners
- work
runs-on : ubuntu-latest
if : ${{ always() }}
steps :
- uses : aws-actions/configure-aws-credentials@v1
with :
aws-access-key-id : ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key : ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region : ${{ secrets.AWS_REGION }}
- uses : solarwindscloud/ec2-runner-action@main
with :
action : terminate
github-token : ${{ secrets.GITHUB_TOKEN }}
matrix : ${{ needs.launch-runner.outputs.matrix }}