name: CD # Как в Vobot: тесты здесь не гоняем — они прошли в CI на PR. # dev → /srv/tgit/dev, main → /srv/tgit/prod на хосте Vobot (infra/deploy/deploy.sh). # Окружение без /srv/tgit//.env на сервере пропускается (prod — когда будет свой токен бота). on: push: branches: [dev, main] workflow_dispatch: {} # Деплои одной ветки — строго по очереди, без отмены. concurrency: group: cd-${{ github.ref }} cancel-in-progress: false jobs: deploy: name: deploy # Gitea doesn't render expressions in job names runs-on: ubuntu-latest env: DEPLOY_ENV: ${{ github.ref_name == 'main' && 'prod' || 'dev' }} steps: - uses: actions/checkout@v4 # Серия мержей подряд: устаревший прогон сам сворачивается, задеплоит актуальный (опыт Vobot) - id: guard name: "Актуален ли ещё этот пуш?" run: | if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then echo "go=true" >> "$GITHUB_OUTPUT"; exit 0; fi REMOTE_SHA=$(git ls-remote origin "refs/heads/${{ github.ref_name }}" | cut -f1) if [ "$REMOTE_SHA" = "${{ github.sha }}" ]; then echo "go=true" >> "$GITHUB_OUTPUT" else echo "⏭ ${{ github.sha }} уже не HEAD ${{ github.ref_name }} — пропускаю"; echo "go=false" >> "$GITHUB_OUTPUT"; fi - name: Deploy if: steps.guard.outputs.go == 'true' env: # Через env:, а не инлайном в run: — многострочный ключ иначе может попасть в лог (опыт Vobot) DEPLOY_SSH_KEY: ${{ secrets.DEPLOY_SSH_KEY }} DEPLOY_HOST: ${{ secrets.DEPLOY_HOST }} run: | install -d -m 700 ~/.ssh printf '%s\n' "$DEPLOY_SSH_KEY" > ~/.ssh/deploy_key chmod 600 ~/.ssh/deploy_key export DEPLOY_SSH_OPTS="-F /dev/null -i $HOME/.ssh/deploy_key -o IdentitiesOnly=yes -o StrictHostKeyChecking=accept-new -o ConnectTimeout=20" infra/deploy/deploy.sh "$DEPLOY_ENV" HEAD