Skip to content

Deploy

Deploy #34

Workflow file for this run

name: Deploy
on:
workflow_dispatch:
env:
REGISTRY: ghcr.io
IMAGE_TAG: latest
FRONTEND_PATH: ./frontend
BACKEND_PATH: ./backend
DOCKER_COMPOSE_FILE: docker-compose.prod.yml
jobs:
form-repository-lowercase-name:
runs-on: ubuntu-latest
outputs:
repository_name_lowercase: ${{ steps.formatting.outputs.lowercase }}
steps:
# - name: Get repository code
# uses: actions/checkout@v4
- name: Get repository name in lowercase
id: formatting
uses: ASzc/change-string-case-action@v5
with:
string: ${{ github.repository }}
build-and-push-frontend-image:
needs: [form-repository-lowercase-name]
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
outputs:
image-name: ${{ steps.image-name.outputs.IMAGE_NAME }}
steps:
- name: Get repository code
uses: actions/checkout@v4
- name: Log in container registry
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.REGISTRY }}/${{ github.repository }}
- name: Output Frontend Docker image name
id: image-name
run: echo "IMAGE_NAME=${{ env.REGISTRY }}/${{ needs.form-repository-lowercase-name.outputs.repository_name_lowercase }}-frontend:${{ env.IMAGE_TAG }}" >> "$GITHUB_OUTPUT"
- name: Build and push Frontend Docker image
uses: docker/build-push-action@v5
with:
context: ${{ env.FRONTEND_PATH }}
file: ${{ env.FRONTEND_PATH }}/Dockerfile
push: true
tags: ${{ steps.meta.outputs.tags }},${{ steps.image-name.outputs.IMAGE_NAME }}
labels: ${{ steps.meta.outputs.labels }}
build-and-push-backend-image:
needs: [form-repository-lowercase-name]
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
outputs:
image-name: ${{ steps.image-name.outputs.IMAGE_NAME }}
steps:
- name: Get repository code
uses: actions/checkout@v4
- name: Log in container registry
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.REGISTRY }}/${{ github.repository }}
- name: Output Backend Docker image name
id: image-name
run: echo "IMAGE_NAME=${{ env.REGISTRY }}/${{ needs.form-repository-lowercase-name.outputs.repository_name_lowercase }}-backend:${{ env.IMAGE_TAG }}" >> "$GITHUB_OUTPUT"
- name: Build and push Backend Docker image
uses: docker/build-push-action@v5
with:
context: ${{ env.BACKEND_PATH }}
file: ${{ env.BACKEND_PATH }}/Dockerfile
push: true
tags: ${{ steps.meta.outputs.tags }},${{ steps.image-name.outputs.IMAGE_NAME }}
labels: ${{ steps.meta.outputs.labels }}
pull-frontend-image:
needs: [build-and-push-frontend-image]
runs-on: ubuntu-latest
steps:
# - name: Get repository code
# uses: actions/checkout@v4
- name: Pull latest Frontend Docker image
uses: appleboy/ssh-action@v1.0.0
with:
host: ${{ secrets.SERVER_IP }}
username: ${{ secrets.SERVER_USERNAME }}
password: ${{ secrets.SERVER_PASSWORD }}
script: docker pull ${{ needs.build-and-push-frontend-image.outputs.image-name }}
pull-backend-image:
needs: [build-and-push-backend-image]
runs-on: ubuntu-latest
steps:
# - name: Get repository code
# uses: actions/checkout@v4
- name: Pull latest Backend Docker image
uses: appleboy/ssh-action@v1.0.0
with:
host: ${{ secrets.SERVER_IP }}
username: ${{ secrets.SERVER_USERNAME }}
password: ${{ secrets.SERVER_PASSWORD }}
script: docker pull ${{ needs.build-and-push-backend-image.outputs.image-name }}
deploy:
needs: [build-and-push-frontend-image, build-and-push-backend-image, pull-frontend-image, pull-backend-image]
runs-on: ubuntu-latest
steps:
# - name: Get repository code
# uses: actions/checkout@v4
- name: Stop docker compose
uses: appleboy/ssh-action@v1.0.0
with:
host: ${{ secrets.SERVER_IP }}
username: ${{ secrets.SERVER_USERNAME }}
password: ${{ secrets.SERVER_PASSWORD }}
script: docker compose -f /tmp/${{ env.DOCKER_COMPOSE_FILE }} down
- name: Copy docker compose to remote server
uses: appleboy/scp-action@v0.1.7
with:
host: ${{ secrets.SERVER_IP }}
username: ${{ secrets.SERVER_USERNAME }}
password: ${{ secrets.SERVER_PASSWORD }}
source: ${{ env.DOCKER_COMPOSE_FILE }}
target: /tmp
- name: Run docker compose
uses: appleboy/ssh-action@v1.0.0
with:
host: ${{ secrets.SERVER_IP }}
username: ${{ secrets.SERVER_USERNAME }}
password: ${{ secrets.SERVER_PASSWORD }}
script: |
NOTISEND_TOKEN=${{ secrets.NOTISEND_TOKEN }} \
FRONT_IMAGE=${{ needs.build-and-push-frontend-image.outputs.image-name }} \
BACK_IMAGE=${{ needs.build-and-push-backend-image.outputs.image-name }} \
docker compose -f /tmp/${{ env.DOCKER_COMPOSE_FILE }} up -d