custom_event #672
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |