Skip to content

Deploy to a test-server #172

Deploy to a test-server

Deploy to a test-server #172

name: Deploy to a test-server
on:
workflow_dispatch:
inputs:
branch_name:
description: "Which branch to deploy"
required: true
type: string
environment_name:
description: "Which environment to deploy (e.g. artemis-test7.artemis.cit.tum.de, etc.)."
required: true
type: string
triggered_by:
description: "Username that triggered deployment (not required, shown if triggered via GitHub UI, logged if triggered via GitHub app)"
required: false
type: string
concurrency: ${{ github.event.inputs.environment_name }}
env:
CI: true
# Keep filename in sync with the workflow responsible for automatic builds on PRs
PR_AUTO_BUILD_FILE_NAME: "build.yml"
RAW_URL: https://raw.githubusercontent.com/${{ github.repository }}/${{ github.event.inputs.branch_name }}
jobs:
# Log the inputs for debugging
log-inputs:
name: Log Inputs
runs-on: ubuntu-latest
steps:
- name: Print Inputs
run: |
echo "Branch: ${{ github.event.inputs.branch_name }}"
echo "Environment: ${{ github.event.inputs.environment_name }}"
echo "Triggered by: ${{ github.event.inputs.triggered_by }}"
echo "RAW_URL: ${{ env.RAW_URL }}"
determine-build-context:
name: Determine Build Context
runs-on: ubuntu-latest
needs: log-inputs
outputs:
pr_number: ${{ steps.get_pr.outputs.pr_number }}
pr_head_sha: ${{ steps.get_pr.outputs.pr_head_sha }}
tag: ${{ steps.get_pr.outputs.tag }}
steps:
- name: Check if a PR exists for the branch
id: get_pr
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
BRANCH_NAME=${{ github.event.inputs.branch_name }}
echo "Checking if PR exists for branch: $BRANCH_NAME targeting 'develop'."
PR_DETAILS=$(gh api repos/${{ github.repository }}/pulls \
--paginate \
--jq ".[] | select(.head.ref == \"$BRANCH_NAME\" and .base.ref == \"develop\") | {number: .number, sha: .head.sha}")
PR_NUMBER=$(echo "$PR_DETAILS" | jq -r ".number")
PR_HEAD_SHA=$(echo "$PR_DETAILS" | jq -r ".sha")
if [ -n "$PR_NUMBER" ] && [ "$PR_NUMBER" != "null" ]; then
echo "Found PR: $PR_NUMBER from branch: $BRANCH_NAME targeting 'develop' with Head: $PR_HEAD_SHA."
echo "pr_number=$PR_NUMBER" >> $GITHUB_OUTPUT
echo "pr_head_sha=$PR_HEAD_SHA" >> $GITHUB_OUTPUT
echo "tag=pr-$PR_NUMBER" >> $GITHUB_OUTPUT
else
echo "No PR found for branch: $BRANCH_NAME targeting 'develop'."
echo "pr_number=" >> $GITHUB_OUTPUT
echo "pr_head_sha=" >> $GITHUB_OUTPUT
# Fetch the latest commit SHA of the branch
LATEST_SHA=$(gh api repos/${{ github.repository }}/git/refs/heads/$BRANCH_NAME --jq '.object.sha')
if [ -z "$LATEST_SHA" ]; then
echo "::error::Could not find the latest commit SHA for branch $BRANCH_NAME."
exit 1
fi
echo "Latest SHA for branch $BRANCH_NAME is $LATEST_SHA."
# Set tag as branch-SHA
echo "tag=branch-$LATEST_SHA" >> $GITHUB_OUTPUT
fi
# Build the Docker image (branch without PR)
conditional-build:
if: ${{ needs.determine-build-context.outputs.pr_number == '' }}
needs: determine-build-context
uses: ./.github/workflows/reusable-build.yml
with:
docker: true
docker_ref: ${{ github.event.inputs.branch_name }}
docker_build_tag: ${{ needs.determine-build-context.outputs.tag }}
# Check if the build has run successfully (PR)
check-existing-build:
name: Check Existing Build
if: ${{ needs.determine-build-context.outputs.pr_number != '' }}
needs: determine-build-context
runs-on: ubuntu-latest
steps:
- name: Get latest successful build for branch
id: check_build
uses: octokit/[email protected]
with:
route: GET /repos/${{ github.repository }}/actions/workflows/build.yml/runs?event=pull_request&status=success&head_sha=${{ needs.determine-build-context.outputs.pr_head_sha }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Fail if no successful build found
if: ${{ steps.check_build.conclusion == 'success' && fromJSON(steps.check_build.outputs.data).total_count == 0 }}
run: |
echo "::error::No successful build found for branch '${{ github.event.inputs.branch_name }}' with SHA '${{ needs.determine-build-context.outputs.pr_head_sha }}'."
exit 1
# Deploy to the test-server
deploy:
needs: [ determine-build-context, conditional-build, check-existing-build ]
# Run if either the conditional-build or check-existing-build job was successful
# Use always() since one of the jobs will always skip
if: always() && (needs.conditional-build.result == 'success' || needs.check-existing-build.result == 'success')
name: Deploy to Test-Server
runs-on: ubuntu-latest
environment:
name: ${{ github.event.inputs.environment_name }}
url: ${{ vars.DEPLOYMENT_URL }}
env:
GATEWAY_USER: "jump"
GATEWAY_HOST: "gateway.artemis.in.tum.de:2010"
GATEWAY_HOST_PUBLIC_KEY: "[gateway.artemis.in.tum.de]:2010 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKtTLiKRILjKZ+Qg4ReWKsG7mLDXkzHfeY5nalSQUNQ4"
steps:
# Download artemis-server-cli from GH without cloning the Repo
- name: Fetch Artemis CLI
run: |
wget ${{ env.RAW_URL }}/artemis-server-cli
chmod +x artemis-server-cli
# Configure SSH Key
- name: Setup SSH Keys and known_hosts
env:
SSH_AUTH_SOCK: /tmp/ssh_agent.sock
GATEWAY_SSH_KEY: "${{ secrets.DEPLOYMENT_GATEWAY_SSH_KEY }}"
DEPLOYMENT_SSH_KEY: "${{ secrets.DEPLOYMENT_SSH_KEY }}"
run: |
mkdir -p ~/.ssh
ssh-agent -a $SSH_AUTH_SOCK > /dev/null
ssh-add - <<< $GATEWAY_SSH_KEY
ssh-add - <<< $DEPLOYMENT_SSH_KEY
cat - <<< $GATEWAY_HOST_PUBLIC_KEY >> ~/.ssh/known_hosts
- name: Deploy Artemis with Docker
env:
SSH_AUTH_SOCK: /tmp/ssh_agent.sock
DEPLOYMENT_USER: ${{ vars.DEPLOYMENT_USER }}
DEPLOYMENT_HOSTS: ${{ vars.DEPLOYMENT_HOSTS }}
TAG: ${{ needs.determine-build-context.outputs.tag }}
BRANCH_NAME: ${{ github.event.inputs.branch_name }}
DEPLOYMENT_FOLDER: ${{ vars.DEPLOYMENT_FOLDER }}
run: |
./artemis-server-cli docker-deploy "$DEPLOYMENT_USER@$DEPLOYMENT_HOSTS" -g "$GATEWAY_USER@$GATEWAY_HOST" -t $TAG -b $BRANCH_NAME -d $DEPLOYMENT_FOLDER -y