# FnKit Deploy โ€” Forgejo Actions # Builds and deploys this function container on every push to main # Requires: Forgejo runner with Docker socket access (fnkit deploy runner) # # Pipeline: git push โ†’ build image โ†’ deploy container โ†’ health check on: push: branches: [main] jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Build image run: | FUNCTION_NAME="fn-python" IMAGE_NAME="fnkit-fn-${FUNCTION_NAME}:latest" IMAGE_PREV="fnkit-fn-${FUNCTION_NAME}:prev" echo "๐Ÿ”จ Building ${FUNCTION_NAME}..." docker build -t $IMAGE_NAME . echo "IMAGE_NAME=$IMAGE_NAME" >> $GITHUB_ENV echo "IMAGE_PREV=$IMAGE_PREV" >> $GITHUB_ENV echo "FUNCTION_NAME=$FUNCTION_NAME" >> $GITHUB_ENV - name: Deploy container run: | echo "๐ŸŒ Ensuring fnkit-network exists..." docker network create fnkit-network 2>/dev/null || true # Tag current image as :prev for rollback docker tag $IMAGE_NAME $IMAGE_PREV 2>/dev/null || true echo "โ™ป๏ธ Replacing running container..." docker stop $FUNCTION_NAME 2>/dev/null || true docker rm $FUNCTION_NAME 2>/dev/null || true echo "๐Ÿš€ Starting ${FUNCTION_NAME}..." docker run -d \ --name $FUNCTION_NAME \ --network fnkit-network \ --label fnkit.fn=true \ --label fnkit.deployed="$(date -u +%Y-%m-%dT%H:%M:%SZ)" \ --restart unless-stopped \ $IMAGE_NAME - name: Health check run: | echo "๐Ÿฅ Checking container health..." sleep 3 if docker ps --filter "name=$FUNCTION_NAME" --filter "status=running" -q | grep -q .; then echo "โœ… ${FUNCTION_NAME} is running" echo "๐ŸŒ Available at gateway: /${FUNCTION_NAME}" else echo "โŒ Container failed to start โ€” rolling back..." docker logs $FUNCTION_NAME 2>&1 || true # Rollback to previous image if available if docker image inspect $IMAGE_PREV >/dev/null 2>&1; then echo "๐Ÿ”„ Rolling back to previous image..." docker rm $FUNCTION_NAME 2>/dev/null || true docker run -d \ --name $FUNCTION_NAME \ --network fnkit-network \ --label fnkit.fn=true \ --label fnkit.deployed="$(date -u +%Y-%m-%dT%H:%M:%SZ)" \ --label fnkit.rollback=true \ --restart unless-stopped \ $IMAGE_PREV echo "โš ๏ธ Rolled back to previous version" fi exit 1 fi - name: Cleanup old images run: | echo "๐Ÿงน Cleaning up dangling images..." docker image prune -f --filter "label=fnkit.fn=true" 2>/dev/null || true