Skip to content

Use GITHUB_TOKEN

Use GITHUB_TOKEN #4

---
name: Build, Push and Deploy
on:
push:
branches:
- main
tags:
- v*
workflow_dispatch:
env:
IMAGE_NAME: libdb
SERVER_USER: ${{ vars.SERVER_USER }}
SERVER_HOST: ${{ vars.SERVER_IP }}
SERVER_PORT: 22
RELEASE_VERSION:
jobs:
test:
uses: ./.github/workflows/test.yml
build-and-push:
runs-on: ubuntu-latest
needs: test
outputs:
version: ${{ steps.version.outputs.value }}
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Build image
run: |
export DOCKER_CONTENT_TRUST=1
docker build . --file Dockerfile --tag $IMAGE_NAME
- name: Log into registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Extract version
id: version
run: |
# Extract branch or tag name
REF_NAME="${GITHUB_REF#refs/*/}"
if [[ "$GITHUB_REF" == "refs/tags/"* ]]; then
# Strip leading v from tag
VERSION="${REF_NAME#v}"
elif [[ "$REF_NAME" == "main" ]]; then
VERSION="latest"
else
VERSION="$REF_NAME"
fi
echo "VERSION=$VERSION"
echo "value=$VERSION" >> "$GITHUB_OUTPUT"
- name: Push image
run: |
IMAGE_ID=ghcr.io/Dom-TC/$IMAGE_NAME
# Change all uppercase to lowercase
IMAGE_ID=$(echo $IMAGE_ID | tr '[A-Z]' '[a-z]')
VERSION="${{ steps.version.outputs.value }}"
echo IMAGE_ID=$IMAGE_ID
echo VERSION=$VERSION
docker tag $IMAGE_NAME $IMAGE_ID:$VERSION
docker push $IMAGE_ID:$VERSION
# Also push "latest" if this is a tag push
if [[ "${{ github.ref }}" == "refs/tags/"* ]]; then
echo "Also tagging as 'latest'"
docker tag $IMAGE_NAME $IMAGE_ID:latest
docker push $IMAGE_ID:latest
fi
echo "Pushed $IMAGE_ID:$VERSION"
[ "$VERSION" != "latest" ] && \
echo "Also tagged as latest: $IMAGE_ID:latest"
deploy:
runs-on: ubuntu-latest
needs: build-and-push
if: github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/')
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Set Release Version
run: |
echo "RELEASE_VERSION=${{ needs.build-and-push.outputs.version }}" \
>> $GITHUB_ENV[ "$VERSION" == "main" ] && VERSION=latest
- name: Connect to Tailnet
uses: tailscale/github-action@v3
with:
oauth-client-id: ${{ secrets.TS_OAUTH_CLIENT_ID }}
oauth-secret: ${{ secrets.TS_OAUTH_SECRET }}
tags: tag:github-ci
- name: Deploy to main
uses: appleboy/ssh-action@v1.2.2
with:
host: ${{ env.SERVER_HOST }}
username: ${{ env.SERVER_USER }}
key: ${{ secrets.SSH_KEY }}
port: ${{ env.SERVER_PORT }}
script: |
# Set environment variables
echo "LIBDB_SETTINGS_FILE=${{ vars.LIBDB_SETTINGS_FILE}}" \
> ${{ vars.SERVER_PATH}}/env_file
echo "LOG_LEVEL=${{ vars.LOG_LEVEL}}" \
>> ${{ vars.SERVER_PATH}}/env_file
echo "LOG_TO_FILE=${{ vars.LOG_TO_FILE}}" \
>> ${{ vars.SERVER_PATH}}/env_file
echo "LOG_FOLDER_PATH=${{ vars.LOG_FOLDER_PATH}}" \
>> ${{ vars.SERVER_PATH}}/env_file
echo "RELEASE_VERSION=${{ env.RELEASE_VERSION }}" \
>> ${{ vars.SERVER_PATH}}/env_file
# Create log folder, if needed
log_path="${{ vars.SERVER_PATH}}/ \
$(echo "${{ vars.LOG_FOLDER_PATH }}" | sed 's#/etc/libdb##')"
echo log_path=$log_path
mkdir -p $log_path
chown -R ${{ env.SERVER_USER }}:${{ env.SERVER_USER }} $log_path
# Rebuild container
docker compose -f ${{ vars.SERVER_PATH}}/docker-compose.yml pull
docker compose -f ${{ vars.SERVER_PATH}}/docker-compose.yml down
docker compose -f ${{ vars.SERVER_PATH}}/docker-compose.yml up -d
# Prune old images
docker image prune -a --force --filter "until=72h"