Skip to content

custom_event

custom_event #570

name: API Triggered Workflow
on:
repository_dispatch:
types: [ custom_event ]
jobs:
receive_cmd:
runs-on: ubuntu-latest
steps:
- name: Acknowledge command from Slack
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
run: |
curl -X POST -H 'Content-type: application/json' --data '{"text":"🎮 Someone issued the Minecraft command: `${{ github.event.client_payload.action }}`\nI will get right on it!"}' $SLACK_WEBHOOK_URL
interpret_cmd:
needs: receive_cmd
runs-on: ubuntu-latest
outputs:
command: ${{ steps.set_command.outputs.command }}
steps:
- name: Interpret payload command
id: set_command
run: |
case "${{ github.event.client_payload.action }}" in
start)
echo "command=running" >> $GITHUB_OUTPUT
;;
stop)
echo "command=stopped" >> $GITHUB_OUTPUT
;;
status)
echo "command=status" >> $GITHUB_OUTPUT
;;
*)
echo "Unknown action: ${{ github.event.client_payload.action }}"
exit 1
;;
esac
check_status:
needs: interpret_cmd
runs-on: ubuntu-latest
if: needs.interpret_cmd.outputs.command == 'status'
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
steps:
- name: Checkout repository
uses: actions/checkout@v2
- name: Setup Terraform
uses: hashicorp/setup-terraform@v1
with:
terraform_wrapper: false
- name: Initialize Terraform
working-directory: ./terraform/game-server
run: terraform init
- name: Get server IP
working-directory: ./terraform/game-server
id: server
run: |
echo "Fetching Terraform output..."
TERRAFORM_OUTPUT=$(terraform output -json minecraft_server_public_ip)
echo "Terraform output: $TERRAFORM_OUTPUT"
echo "Extracting IP..."
IP=$(echo $TERRAFORM_OUTPUT | jq -r '.[0]')
echo "Extracted IP: $IP"
echo "ip=${IP}" >> $GITHUB_ENV
- name: Send server status to Slack
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
run: |
curl -X POST -H 'Content-type: application/json' --data '{"text":"⛏️ Minecraft server ip: `${{ env.ip }}`"}' $SLACK_WEBHOOK_URL
stop_server:
needs: interpret_cmd
runs-on: ubuntu-latest
if: needs.interpret_cmd.outputs.command == 'stopped'
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
steps:
- name: Checkout repository
uses: actions/checkout@v2
- name: Setup Terraform
uses: hashicorp/setup-terraform@v1
with:
terraform_wrapper: false
- name: Initialize Terraform
working-directory: ./terraform/game-server
run: terraform init
- name: Configure AWS Credentials
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: us-east-2
- name: Get server instance ID
working-directory: ./terraform/game-server
id: server-instance-id
run: |
echo "Fetching Terraform output..."
TERRAFORM_OUTPUT=$(terraform output -json minecraft_server_instance_ids)
echo "Terraform output: $TERRAFORM_OUTPUT"
echo "Extracting Instance ID..."
INSTANCE_ID=$(echo $TERRAFORM_OUTPUT | jq -r '.[0]')
echo "Extracted Instance ID: $INSTANCE_ID"
echo "instance_id=${INSTANCE_ID}" >> $GITHUB_ENV
- name: Create Ansible Inventory
working-directory: ./ansible
run: |
# Create a directory for the inventory if it doesn't exist
mkdir -p ./inventory
# Create the inventory file with the server IP
echo "[minecraft_server]" > ./inventory/minecraft
echo "${{ env.ip }} ansible_python_interpreter=${{ env.PYTHON_PATH }}" >> ./inventory/minecraft
- name: Install boto3
run: |
sudo pipx inject ansible-core boto3
- name: Run stop_server playbook
uses: dawidd6/action-ansible-playbook@v2
with:
# Required, playbook filepath
playbook: stop_server.yml
# Optional, directory where playbooks live
directory: ./ansible
# Optional, additional flags to pass to ansible-playbook
options: |
--inventory ./inventory/minecraft
--extra-vars "ansible_aws_ssm_instance_id=${{ env.instance_id }}"
--verbose
- name: Execute Terraform based on command
working-directory: ./terraform/game-server
env:
TF_VAR_vpc_id: ${{ secrets.AWS_VPC_ID }}
run: terraform apply -auto-approve -var="game_state=stopped" -var="slack_token=${{ secrets.SLACK_BOT_OAUTH_TOKEN }}" -var="github_token=${{ secrets.GH_ACTIONS_TOKEN }}"
- name: Send server status to Slack
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
run: |
curl -X POST -H 'Content-type: application/json' --data '{"text":"🛑 The minecraft server has been stopped 🛑"}' $SLACK_WEBHOOK_URL
start_server:
needs: interpret_cmd
runs-on: ubuntu-latest
if: needs.interpret_cmd.outputs.command == 'running'
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
steps:
- name: Checkout repository
uses: actions/checkout@v2
- name: Set up Node.js
uses: actions/setup-node@v2
with:
node-version: '16'
- name: Install dependencies
working-directory: ./minecraft-slack-bot
run: npm install
- name: Zip Lambda function
run: |
mkdir dist
(cd minecraft-slack-bot && zip -r ../dist/minecraftBot.zip .)
- name: Setup Terraform
uses: hashicorp/setup-terraform@v1
with:
terraform_wrapper: false
- name: Initialize Terraform
working-directory: ./terraform/game-server
run: terraform init
- name: Execute Terraform based on command
working-directory: ./terraform/game-server
env:
TF_VAR_vpc_id: ${{ secrets.AWS_VPC_ID }}
run: terraform apply -auto-approve -var="game_state=running" -var="slack_token=${{ secrets.SLACK_BOT_OAUTH_TOKEN }}" -var="github_token=${{ secrets.GH_ACTIONS_TOKEN }}"
- name: Configure AWS Credentials
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: us-east-2
- name: Get server IP
working-directory: ./terraform/game-server
id: server
run: |
echo "Fetching Terraform output..."
TERRAFORM_OUTPUT=$(terraform output -json minecraft_server_public_ip)
echo "Terraform output: $TERRAFORM_OUTPUT"
echo "Extracting IP..."
IP=$(echo $TERRAFORM_OUTPUT | jq -r '.[0]')
echo "Extracted IP: $IP"
echo "ip=${IP}" >> $GITHUB_ENV
- name: Get server instance ID
working-directory: ./terraform/game-server
id: server-instance-id
run: |
echo "Fetching Terraform output..."
TERRAFORM_OUTPUT=$(terraform output -json minecraft_server_instance_ids)
echo "Terraform output: $TERRAFORM_OUTPUT"
echo "Extracting Instance ID..."
INSTANCE_ID=$(echo $TERRAFORM_OUTPUT | jq -r '.[0]')
echo "Extracted Instance ID: $INSTANCE_ID"
echo "instance_id=${INSTANCE_ID}" >> $GITHUB_ENV
- name: Create Ansible Inventory
working-directory: ./ansible
run: |
# Create a directory for the inventory if it doesn't exist
mkdir -p ./inventory
# Create the inventory file with the server IP
echo "[minecraft_server]" > ./inventory/minecraft
echo "${{ env.ip }} ansible_python_interpreter=${{ env.PYTHON_PATH }}" >> ./inventory/minecraft
- name: Install boto3
run: |
sudo pipx inject ansible-core boto3
- name: Run playbook
uses: dawidd6/action-ansible-playbook@v2
with:
# Required, playbook filepath
playbook: playbook.yml
# Optional, directory where playbooks live
directory: ./ansible
# Optional, additional flags to pass to ansible-playbook
options: |
--inventory ./inventory/minecraft
--extra-vars "ansible_aws_ssm_instance_id=${{ env.instance_id }}"
--verbose
- name: Send server status to Slack
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
run: |
curl -X POST -H 'Content-type: application/json' --data '{"text":"⛏️ Minecraft server ip: `${{ env.ip }}`"}' $SLACK_WEBHOOK_URL