Skip to content

Deploy Chat Service

Deploy Chat Service #9

Workflow file for this run

name: Deploy Chat Service
on:
workflow_dispatch:
inputs:
deploy:
description: 'Deploy the service'
required: true
default: 'false'
deploy_target:
description: 'Deployment target (k8s or vps)'
required: true
default: 'k8s'
env:
DOCKER_HUB_USERNAME: ${{ secrets.DOCKER_HUB_USERNAME }}
DOCKER_HUB_PASSWORD: ${{ secrets.DOCKER_HUB_PASSWORD }}
KUBE_CONFIG: ${{ secrets.KUBE_CONFIG }}
NAMESPACE: ${{ secrets.NAMESPACE }}
IMAGE: andreq21/chat:${{ github.sha }}
VPS_SSH_KEY: ${{ secrets.VPS_SSH_KEY }}
VPS_USER: ${{ secrets.VPS_USER }}
VPS_HOST: ${{ secrets.VPS_HOST }}
jobs:
lint:
runs-on: ubuntu-latest
environment: chat-production
if: github.event_name == 'workflow_dispatch' && github.event.inputs.deploy == 'true'
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Set up Go
uses: actions/setup-go@v4
with:
go-version: 1.22.4
- name: Run linters
run: |
go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.59.1
golangci-lint run ./service/chat/... --config ./.golangci.pipeline.yaml
build:
runs-on: ubuntu-latest
environment: chat-production
needs: lint
if: github.event_name == 'workflow_dispatch' && github.event.inputs.deploy == 'true' && github.event.inputs.deploy_target == 'k8s'
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Build Docker image
run: |
docker build -t $IMAGE -f ./service/chat/Dockerfile .
- name: Login to Docker Hub
run: |
echo $DOCKER_HUB_PASSWORD | docker login -u $DOCKER_HUB_USERNAME --password-stdin
- name: Push Docker image to Docker Hub
run: |
docker push $IMAGE
deploy-k8s:
runs-on: ubuntu-latest
environment: chat-production
needs: build
if: github.event_name == 'workflow_dispatch' && github.event.inputs.deploy == 'true' && github.event.inputs.deploy_target == 'k8s'
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y gettext
- name: Create .env file
run: |
echo "ENV=${{ vars.ENV }}" >> .env
echo "MONGO_HOST=${{ vars.MONGO_HOST }}" >> .env
echo "MONGO_PORT=${{ vars.MONGO_PORT }}" >> .env
echo "MONGO_USER=${{ vars.MONGO_USER }}" >> .env
echo "MONGO_PASSWORD=${{ vars.MONGO_PASSWORD }}" >> .env
echo "MONGO_DB=${{ vars.MONGO_DB }}" >> .env
echo "GRPC_SERVER_HOST=${{ vars.GRPC_SERVER_HOST }}" >> .env
echo "GRPC_SERVER_PORT=${{ vars.GRPC_SERVER_PORT }}" >> .env
echo "GRPC_SERVER_TIMEOUT=${{ vars.GRPC_SERVER_TIMEOUT }}" >> .env
echo "GRPC_AUTH_HOST=${{ vars.GRPC_AUTH_HOST }}" >> .env
echo "GRPC_AUTH_PORT=${{ vars.GRPC_AUTH_PORT }}" >> .env
- name: Set up kubectl
run: |
mkdir -p $HOME/.kube
echo "$KUBE_CONFIG" | base64 --decode > $HOME/.kube/config
- name: Substitute environment variables in configmap
run: |
export $(cat .env | xargs)
envsubst < deploy/helm/chat/templates/configmap.yaml > ./configmap.yaml
mv ./configmap.yaml deploy/helm/chat/templates/configmap.yaml
- name: Deploy to Kubernetes
run: |
helm upgrade --install chat ./deploy/helm/chat --namespace=$NAMESPACE --set app.image.tag=$IMAGE
deploy-vps:
runs-on: ubuntu-latest
environment: chat-production
needs: lint
if: github.event_name == 'workflow_dispatch' && github.event.inputs.deploy == 'true' && github.event.inputs.deploy_target == 'vps'
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y sshpass
- name: Create .env file
run: |
echo "ENV=${{ vars.ENV }}" >> .env
echo "MONGO_HOST=${{ vars.MONGO_HOST }}" >> .env
echo "MONGO_PORT=${{ vars.MONGO_PORT }}" >> .env
echo "MONGO_USER=${{ vars.MONGO_USER }}" >> .env
echo "MONGO_PASSWORD=${{ vars.MONGO_PASSWORD }}" >> .env
echo "MONGO_DB=${{ vars.MONGO_DB }}" >> .env
echo "GRPC_SERVER_HOST=${{ vars.GRPC_SERVER_HOST }}" >> .env
echo "GRPC_SERVER_PORT=${{ vars.GRPC_SERVER_PORT }}" >> .env
echo "GRPC_SERVER_TIMEOUT=${{ vars.GRPC_SERVER_TIMEOUT }}" >> .env
echo "GRPC_AUTH_HOST=${{ vars.GRPC_AUTH_HOST }}" >> .env
echo "GRPC_AUTH_PORT=${{ vars.GRPC_AUTH_PORT }}" >> .env
- name: Copy .env file to VPS
run: |
echo "$VPS_SSH_KEY" > deploy_key.pem
chmod 600 deploy_key.pem
scp -i deploy_key.pem -o StrictHostKeyChecking=no -r .env $VPS_USER@$VPS_HOST:/home/$VPS_USER/apps/chat/.env
ssh -i deploy_key.pem -o StrictHostKeyChecking=no $VPS_USER@$VPS_HOST "sudo mv /home/$VPS_USER/apps/chat/.env /root/apps/chat/.env && sudo chmod 600 /root/apps/chat/.env"
- name: Copy binary to VPS
run: |
go mod download
go build -o ./bin ./service/chat/cmd/app/main.go
scp -i deploy_key.pem -o StrictHostKeyChecking=no ./bin $VPS_USER@$VPS_HOST:/home/$VPS_USER/apps/chat/bin
ssh -i deploy_key.pem -o StrictHostKeyChecking=no $VPS_USER@$VPS_HOST "sudo mv /home/$VPS_USER/apps/chat/bin /root/apps/chat/bin"
- name: Set up systemd service on VPS
run: |
scp -i deploy_key.pem -o StrictHostKeyChecking=no deploy/vps/chat.ini $VPS_USER@$VPS_HOST:/home/$VPS_USER/apps/chat/chat.ini
ssh -i deploy_key.pem -o StrictHostKeyChecking=no $VPS_USER@$VPS_HOST "sudo mv /home/$VPS_USER/apps/chat/chat.ini /etc/systemd/system/chat.service && sudo systemctl daemon-reload && sudo systemctl restart chat.service && sudo systemctl status chat.service"