Files
progcode/.gitea/workflows/deploy.yml
T
huncode 10a83d39a2
Build and deploy / deploy (push) Successful in 6s
add letsencrypt
2026-05-18 01:34:11 +03:00

120 lines
3.6 KiB
YAML

name: Build and deploy
on:
push:
branches:
- master
workflow_dispatch:
jobs:
deploy:
runs-on: ubuntu-latest
env:
DOMAIN: ${{ vars.DOMAIN }}
IMAGE: ${{ vars.IMAGE }}
IMAGE_REPO: ${{ vars.IMAGE_REPO }}
REGISTRY: ${{ vars.REGISTRY }}
REGISTRY_USERNAME: ${{ secrets.REGISTRY_USERNAME }}
REGISTRY_PASSWORD: ${{ secrets.REGISTRY_PASSWORD }}
STACK_NAME: ${{ vars.STACK_NAME }}
TRAEFIK_NETWORK: ${{ vars.TRAEFIK_NETWORK }}
TRAEFIK_ENTRYPOINT: ${{ vars.TRAEFIK_ENTRYPOINT }}
TRAEFIK_CERTRESOLVER: ${{ vars.TRAEFIK_CERTRESOLVER }}
SWARM_MANAGER_HOST: ${{ secrets.SWARM_MANAGER_HOST }}
SWARM_SSH_USER: ${{ secrets.SWARM_SSH_USER }}
SWARM_SSH_PORT: ${{ secrets.SWARM_SSH_PORT }}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Prepare image name
shell: bash
run: |
set -euo pipefail
short_sha="${GITHUB_SHA:-${GITEA_SHA:-manual}}"
short_sha="${short_sha:0:12}"
if [ -z "${IMAGE}" ]; then
: "${IMAGE_REPO:?Set IMAGE or IMAGE_REPO in Gitea variables}"
IMAGE="${IMAGE_REPO}:${short_sha}"
fi
if [ -z "${IMAGE_REPO}" ]; then
IMAGE_REPO="${IMAGE%:*}"
fi
{
echo "IMAGE=${IMAGE}"
echo "IMAGE_REPO=${IMAGE_REPO}"
echo "IMAGE_TAG=${short_sha}"
echo "STACK_NAME=${STACK_NAME:-progcode}"
echo "TRAEFIK_NETWORK=${TRAEFIK_NETWORK:-traefik-public}"
echo "TRAEFIK_ENTRYPOINT=${TRAEFIK_ENTRYPOINT:-websecure}"
echo "TRAEFIK_CERTRESOLVER=${TRAEFIK_CERTRESOLVER:-le}"
echo "SWARM_SSH_PORT=${SWARM_SSH_PORT:-22}"
} >> "${GITHUB_ENV}"
- name: Docker login
shell: bash
run: |
set -euo pipefail
if [ -n "${REGISTRY_PASSWORD}" ]; then
: "${REGISTRY:?Set REGISTRY when REGISTRY_PASSWORD is configured}"
: "${REGISTRY_USERNAME:?Set REGISTRY_USERNAME secret when REGISTRY_PASSWORD is configured}"
echo "${REGISTRY_PASSWORD}" | docker login "${REGISTRY}" -u "${REGISTRY_USERNAME}" --password-stdin
else
echo "REGISTRY_PASSWORD is not set; skipping docker login"
fi
- name: Build image
shell: bash
run: |
set -euo pipefail
docker build --pull -t "${IMAGE}" .
- name: Push image
shell: bash
run: |
set -euo pipefail
docker push "${IMAGE}"
latest_image="${IMAGE_REPO}:latest"
if [ "${IMAGE}" != "${latest_image}" ]; then
docker tag "${IMAGE}" "${latest_image}"
docker push "${latest_image}"
fi
- name: Configure remote Docker host
shell: bash
run: |
set -euo pipefail
if [ -z "${SWARM_MANAGER_HOST}" ]; then
echo "SWARM_MANAGER_HOST is not set; using the local Docker daemon"
exit 0
fi
: "${SWARM_SSH_USER:?Set SWARM_SSH_USER when SWARM_MANAGER_HOST is configured}"
ssh -p "${SWARM_SSH_PORT}" \
-o BatchMode=yes \
"${SWARM_SSH_USER}@${SWARM_MANAGER_HOST}" \
"docker info >/dev/null"
echo "DOCKER_HOST=ssh://${SWARM_SSH_USER}@${SWARM_MANAGER_HOST}:${SWARM_SSH_PORT}" >> "${GITHUB_ENV}"
- name: Deploy stack
shell: bash
run: |
set -euo pipefail
: "${DOMAIN:?Set DOMAIN in Gitea variables}"
docker stack deploy \
--with-registry-auth \
-c deploy/stack.example.yml \
"${STACK_NAME}"