Skip to content

Deploy

Deploy #650

Workflow file for this run

name: Deploy
concurrency:
group: deploy
on:
workflow_dispatch:
inputs:
ci_required:
description: 'CI Suite is required'
type: boolean
required: true
default: true
perform_deploy_main:
description: 'Deploy Paradise Main/Secondary'
type: boolean
required: true
default: true
perform_deploy_vega:
description: 'Deploy Paradise Vega'
type: boolean
required: true
default: true
perform_deploy_cleo:
description: 'Deploy Paradise Cleo'
type: boolean
required: true
default: true
perform_deploy_prime:
description: 'Deploy Paradise Prime'
type: boolean
required: true
default: false
perform_deploy_wl:
description: 'Deploy Paradise WL'
type: boolean
required: true
default: false
perform_deploy_tutorial:
description: 'Deploy Paradise Tutorial'
type: boolean
required: true
default: false
jobs:
check:
name: Check User Permission
runs-on: ubuntu-latest
steps:
- uses: skjnldsv/check-actor-permission@v3
with:
require: 'admin'
CI:
needs: [check]
uses: ./.github/workflows/ci.yml # use the callable tests job to run tests
if: ${{ inputs.ci_required }}
update-isp-lists:
name: Update ISP Lists
runs-on: ubuntu-latest
needs: [check]
steps:
- name: Update ISP Lists
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.PRODUCTION_HOST }}
username: ${{ secrets.PRODUCTION_USERNAME }}
key: ${{ secrets.PRODUCTION_SSH_KEY }}
passphrase: ${{ secrets.PRODUCTION_SSH_KEY_PASS }}
script: /var/lib/byond/update_isp_lists.sh
set-matrix:
name: Set Deployment Matrix
runs-on: ubuntu-latest
needs: [check]
outputs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
steps:
- id: set-matrix
run: |
MATRIX_JSON="{\"include\": ["
if ${{ github.event.inputs.perform_deploy_main }}; then
MATRIX_JSON="${MATRIX_JSON}{\"environment\": \"Main\"},"
MATRIX_JSON="${MATRIX_JSON}{\"environment\": \"Secondary\"},"
fi
if ${{ github.event.inputs.perform_deploy_vega }}; then
MATRIX_JSON="${MATRIX_JSON}{\"environment\": \"Vega\"},"
fi
if ${{ github.event.inputs.perform_deploy_cleo }}; then
MATRIX_JSON="${MATRIX_JSON}{\"environment\": \"Cleo\"},"
fi
if ${{ github.event.inputs.perform_deploy_prime }}; then
MATRIX_JSON="${MATRIX_JSON}{\"environment\": \"Prime\"},"
fi
if ${{ github.event.inputs.perform_deploy_wl }}; then
MATRIX_JSON="${MATRIX_JSON}{\"environment\": \"WL\"},"
fi
if ${{ github.event.inputs.perform_deploy_tutorial }}; then
MATRIX_JSON="${MATRIX_JSON}{\"environment\": \"Tutorial\"},"
fi
MATRIX_JSON="${MATRIX_JSON%?}]}" # Remove the trailing comma
echo "matrix=${MATRIX_JSON}" >> $GITHUB_OUTPUT
deploy:
name: Deploy Paradise
runs-on: ubuntu-latest
permissions:
deployments: write
strategy:
fail-fast: false
matrix: ${{fromJson(needs.set-matrix.outputs.matrix)}}
environment: ${{ matrix.environment }}
needs: [check, update-isp-lists, CI, set-matrix]
if: always() && !cancelled() && !failure()
steps:
- uses: chrnorm/deployment-action@v2
name: Create GitHub deployment
id: deployment
with:
token: '${{ github.token }}'
environment: ${{ matrix.environment }}
environment-url: ${{ vars.ENVIRONMENT_URL }}
log-url: '${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}'
ref: ${{ vars.BRANCH }}
production-environment: true
initial-status: 'in_progress'
- name: Update and Build Paradise Main
if: matrix.environment == 'Main' && inputs.perform_deploy_main
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.PRODUCTION_HOST }}
username: ${{ secrets.PRODUCTION_USERNAME }}
key: ${{ secrets.PRODUCTION_SSH_KEY }}
passphrase: ${{ secrets.PRODUCTION_SSH_KEY_PASS }}
script: |
TIME=$(date +'%Y-%m-%d%T')
sudo systemctl --wait start deploy-main
journalctl --since $TIME -u deploy-main --no-pager --all
systemctl is-failed deploy-main | grep -q "failed" && echo "Deployment Failed!" && exit 1 || exit 0
- name: Update and Build Paradise Secondary
if: matrix.environment == 'Secondary' && inputs.perform_deploy_main
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.PRODUCTION_HOST }}
username: ${{ secrets.PRODUCTION_USERNAME }}
key: ${{ secrets.PRODUCTION_SSH_KEY }}
passphrase: ${{ secrets.PRODUCTION_SSH_KEY_PASS }}
script: |
systemctl is-failed deploy-main | grep -q "failed" && echo "Deployment Failed!" && exit 1 || exit 0
- name: Update and Build Paradise Vega
if: matrix.environment == 'Vega' && inputs.perform_deploy_vega
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.PRODUCTION_HOST }}
username: ${{ secrets.PRODUCTION_USERNAME }}
key: ${{ secrets.PRODUCTION_SSH_KEY }}
passphrase: ${{ secrets.PRODUCTION_SSH_KEY_PASS }}
script: |
TIME=$(date +'%Y-%m-%d%T')
sudo systemctl --wait start deploy-vega
journalctl --since $TIME -u deploy-vega --no-pager --all
systemctl is-failed deploy-vega | grep -q "failed" && echo "Deployment Failed!" && exit 1 || exit 0
- name: Update and Build Paradise Cleo
if: matrix.environment == 'Cleo' && inputs.perform_deploy_cleo
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.PRODUCTION_HOST }}
username: ${{ secrets.PRODUCTION_USERNAME }}
key: ${{ secrets.PRODUCTION_SSH_KEY }}
passphrase: ${{ secrets.PRODUCTION_SSH_KEY_PASS }}
script: |
TIME=$(date +'%Y-%m-%d%T')
sudo systemctl --wait start deploy-cleo
journalctl --since $TIME -u deploy-cleo --no-pager --all
systemctl is-failed deploy-cleo | grep -q "failed" && echo "Deployment Failed!" && exit 1 || exit 0
- name: Update and Build Paradise Prime
if: matrix.environment == 'Prime' && inputs.perform_deploy_prime
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.PRODUCTION_HOST }}
username: ${{ secrets.PRODUCTION_USERNAME }}
key: ${{ secrets.PRODUCTION_SSH_KEY }}
passphrase: ${{ secrets.PRODUCTION_SSH_KEY_PASS }}
script: |
TIME=$(date +'%Y-%m-%d%T')
sudo systemctl --wait start deploy-prime
journalctl --since $TIME -u deploy-prime --no-pager --all
systemctl is-failed deploy-prime | grep -q "failed" && echo "Deployment Failed!" && exit 1 || exit 0
- name: Update and Build Paradise WL
if: matrix.environment == 'WL' && inputs.perform_deploy_wl
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.PRODUCTION_HOST }}
username: ${{ secrets.PRODUCTION_USERNAME }}
key: ${{ secrets.PRODUCTION_SSH_KEY }}
passphrase: ${{ secrets.PRODUCTION_SSH_KEY_PASS }}
script: |
TIME=$(date +'%Y-%m-%d%T')
sudo systemctl --wait start deploy-wl
journalctl --since $TIME -u deploy-wl --no-pager --all
systemctl is-failed deploy-wl | grep -q "failed" && echo "Deployment Failed!" && exit 1 || exit 0
- name: Update and Build Paradise Tutorial
if: matrix.environment == 'Tutorial' && inputs.perform_deploy_tutorial
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.PRODUCTION_HOST }}
username: ${{ secrets.PRODUCTION_USERNAME }}
key: ${{ secrets.PRODUCTION_SSH_KEY }}
passphrase: ${{ secrets.PRODUCTION_SSH_KEY_PASS }}
script: |
TIME=$(date +'%Y-%m-%d%T')
sudo systemctl --wait start deploy-tutorial
journalctl --since $TIME -u deploy-tutorial --no-pager --all
systemctl is-failed deploy-tutorial | grep -q "failed" && echo "Deployment Failed!" && exit 1 || exit 0
- name: Update deployment status (success)
if: |
success()
uses: chrnorm/deployment-status@v2
with:
token: '${{ github.token }}'
environment-url: ${{ steps.deployment.outputs.environment_url }}
log-url: '${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}'
deployment-id: ${{ steps.deployment.outputs.deployment_id }}
state: 'success'
- name: Update deployment status (failure)
if: |
failure()
uses: chrnorm/deployment-status@v2
with:
token: '${{ github.token }}'
environment-url: ${{ steps.deployment.outputs.environment_url }}
log-url: '${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}'
deployment-id: ${{ steps.deployment.outputs.deployment_id }}
state: 'failure'
delete-automatic-deployments:
name: Delete Automatic Deployments
runs-on: ubuntu-latest
needs: [deploy]
if: always()
steps:
- name: Delete previous automatic deployments
uses: actions/github-script@v7
env:
GITHUB_SHA_HEAD: ${{ github.sha }}
with:
script: |
const { GITHUB_SHA_HEAD } = process.env
const deployments = await github.rest.repos.listDeployments({
owner: context.repo.owner,
repo: context.repo.repo,
sha: GITHUB_SHA_HEAD
});
await Promise.all(
deployments.data.filter((d) => d.performed_via_github_app).map(async (deployment) => {
await github.rest.repos.createDeploymentStatus({
owner: context.repo.owner,
repo: context.repo.repo,
deployment_id: deployment.id,
state: 'inactive'
});
return github.rest.repos.deleteDeployment({
owner: context.repo.owner,
repo: context.repo.repo,
deployment_id: deployment.id
});
})
);