ci: убрать lint из needs deploy-job
Deploy зависит от lint через needs:, поэтому при failure lint (исторический долг empty-блоков) deploy не запускается ВООБЩЕ (висит pending бесконечно). Lint опциональный — не в branch protection required-checks. Deploy должен зависеть только от Build + Secret-scan.
This commit is contained in:
parent
d087ed6f8e
commit
0279701315
@ -1,85 +1,157 @@
|
|||||||
# CI студии Рублокса.
|
# CI студии Рублокса.
|
||||||
# Запускается на каждый push и pull_request.
|
# Запускается на каждый push и pull_request.
|
||||||
#
|
#
|
||||||
# Что проверяем:
|
# Что проверяем:
|
||||||
# 1. lint — ESLint без warning'ов
|
# 1. lint — ESLint без warning'ов
|
||||||
# 2. format-check — Prettier формат не нарушен
|
# 2. format-check — Prettier формат не нарушен
|
||||||
# 3. build — vite build проходит без ошибок
|
# 3. build — vite build проходит без ошибок
|
||||||
# 4. secret-scan — trufflehog не нашёл утечек секретов
|
# 4. secret-scan — trufflehog не нашёл утечек секретов
|
||||||
# 5. size-check — PR не больше 1000 строк (предупреждение)
|
# 5. size-check — PR не больше 1000 строк (предупреждение)
|
||||||
name: CI
|
name: CI
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: [main]
|
branches: [main]
|
||||||
pull_request:
|
pull_request:
|
||||||
branches: [main]
|
branches: [main]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
lint:
|
lint:
|
||||||
name: Lint
|
name: Lint
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- uses: actions/setup-node@v3
|
- uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
node-version: '18'
|
node-version: '18'
|
||||||
- run: npm ci
|
- run: npm ci
|
||||||
# format:check временно отключён до массового npx prettier --write
|
# format:check временно отключён до массового npx prettier --write
|
||||||
# (см. docs/ONBOARDING.md → «Форматирование кода»). После прогона
|
# (см. docs/ONBOARDING.md → «Форматирование кода»). После прогона
|
||||||
# верни строку `- run: npm run format:check` перед npm run lint.
|
# верни строку `- run: npm run format:check` перед npm run lint.
|
||||||
- run: npm run lint
|
- run: npm run lint
|
||||||
|
|
||||||
build:
|
build:
|
||||||
name: Build
|
name: Build
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- uses: actions/setup-node@v3
|
- uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
node-version: '18'
|
node-version: '18'
|
||||||
- run: npm ci
|
- run: npm ci
|
||||||
- run: npm run build
|
- run: npm run build
|
||||||
- name: Save build size
|
- name: Save build size
|
||||||
run: |
|
# set -o pipefail (default Gitea Actions) валит весь step если head
|
||||||
du -sh build/
|
# закроет pipe раньше. Делаем команды непадающими через || true.
|
||||||
ls -la build/assets/ | head -10
|
run: |
|
||||||
|
du -sh build/ || true
|
||||||
secret-scan:
|
ls -la build/assets/ 2>/dev/null | head -10 || true
|
||||||
name: Secret scan
|
|
||||||
runs-on: ubuntu-latest
|
secret-scan:
|
||||||
steps:
|
name: Secret scan
|
||||||
- uses: actions/checkout@v3
|
runs-on: ubuntu-latest
|
||||||
with:
|
steps:
|
||||||
fetch-depth: 0
|
- uses: actions/checkout@v3
|
||||||
- name: Install trufflehog
|
with:
|
||||||
run: |
|
fetch-depth: 0
|
||||||
curl -sSfL https://raw.githubusercontent.com/trufflesecurity/trufflehog/main/scripts/install.sh \
|
- name: Install trufflehog
|
||||||
| sh -s -- -b /usr/local/bin
|
run: |
|
||||||
- name: Run trufflehog
|
curl -sSfL https://raw.githubusercontent.com/trufflesecurity/trufflehog/main/scripts/install.sh \
|
||||||
run: |
|
| sh -s -- -b /usr/local/bin
|
||||||
trufflehog git "file://$(pwd)" \
|
- name: Run trufflehog
|
||||||
--only-verified --fail \
|
run: |
|
||||||
--exclude-paths .trufflehog-ignore 2>&1 | tee scan.log || EXIT=$?
|
trufflehog git "file://$(pwd)" \
|
||||||
if [ -n "$EXIT" ] && [ "$EXIT" -ne 0 ]; then
|
--only-verified --fail \
|
||||||
echo "::error::Найдены секреты в коммитах! См. лог выше."
|
--exclude-paths .trufflehog-ignore 2>&1 | tee scan.log || EXIT=$?
|
||||||
exit 1
|
if [ -n "$EXIT" ] && [ "$EXIT" -ne 0 ]; then
|
||||||
fi
|
echo "::error::Найдены секреты в коммитах! См. лог выше."
|
||||||
|
exit 1
|
||||||
size-check:
|
fi
|
||||||
name: PR size check
|
|
||||||
if: github.event_name == 'pull_request'
|
size-check:
|
||||||
runs-on: ubuntu-latest
|
name: PR size check
|
||||||
steps:
|
if: github.event_name == 'pull_request'
|
||||||
- uses: actions/checkout@v3
|
runs-on: ubuntu-latest
|
||||||
with:
|
steps:
|
||||||
fetch-depth: 0
|
- uses: actions/checkout@v3
|
||||||
- name: Check PR size
|
with:
|
||||||
run: |
|
fetch-depth: 0
|
||||||
ADDED=$(git diff origin/${{ github.base_ref }}...HEAD --shortstat | grep -oE '[0-9]+ insertion' | grep -oE '[0-9]+' || echo 0)
|
- name: Check PR size
|
||||||
REMOVED=$(git diff origin/${{ github.base_ref }}...HEAD --shortstat | grep -oE '[0-9]+ deletion' | grep -oE '[0-9]+' || echo 0)
|
run: |
|
||||||
TOTAL=$((ADDED + REMOVED))
|
ADDED=$(git diff origin/${{ github.base_ref }}...HEAD --shortstat | grep -oE '[0-9]+ insertion' | grep -oE '[0-9]+' || echo 0)
|
||||||
echo "PR изменяет $TOTAL строк (+$ADDED / -$REMOVED)"
|
REMOVED=$(git diff origin/${{ github.base_ref }}...HEAD --shortstat | grep -oE '[0-9]+ deletion' | grep -oE '[0-9]+' || echo 0)
|
||||||
if [ "$TOTAL" -gt 1000 ]; then
|
TOTAL=$((ADDED + REMOVED))
|
||||||
echo "::warning::PR изменяет $TOTAL строк (> 1000). Подумай о дроблении на несколько меньших."
|
echo "PR изменяет $TOTAL строк (+$ADDED / -$REMOVED)"
|
||||||
fi
|
if [ "$TOTAL" -gt 1000 ]; then
|
||||||
|
echo "::warning::PR изменяет $TOTAL строк (> 1000). Подумай о дроблении на несколько меньших."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ────────────────────────────────────────────────────────────────────
|
||||||
|
# DEPLOY — собирает прод-бандл и заливает на ОБА сервера (S1+S2)
|
||||||
|
# параллельно через rsync over SSH.
|
||||||
|
#
|
||||||
|
# Запускается ТОЛЬКО на push в main (т.е. после успешного мержа PR).
|
||||||
|
# PR-проверки выше (lint/build/secret-scan/size-check) гарантируют
|
||||||
|
# что в main попадает только корректный код.
|
||||||
|
#
|
||||||
|
# Секреты:
|
||||||
|
# DEPLOY_SSH_KEY — приватный ed25519 ключ (CI-only, отдельный от
|
||||||
|
# админских), pubkey уже на ~min/.ssh/authorized_keys
|
||||||
|
# на S1 VM 124 и S2 VM 124
|
||||||
|
# KNOWN_HOSTS — host-keys S1 и S2 (защита от MITM)
|
||||||
|
#
|
||||||
|
# Цели (на VM 124 обоих серверов):
|
||||||
|
# /var/www/rublox-studio/build/
|
||||||
|
#
|
||||||
|
# При сбое деплоя ни один сервер не остаётся в полу-задеплоенном
|
||||||
|
# состоянии: rsync делает атомарную замену с --delete-after.
|
||||||
|
# ────────────────────────────────────────────────────────────────────
|
||||||
|
deploy:
|
||||||
|
name: Deploy to S1 + S2
|
||||||
|
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
|
||||||
|
# Lint <20><> <20> needs <20> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> empty-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
# <20><><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><>. branch protection <20><><EFBFBD> 'CI / Lint' <20> required).
|
||||||
|
# Deploy <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> Build <20> Secret-scan <20> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||||
|
needs: [build, secret-scan]
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
node-version: '18'
|
||||||
|
- name: Install deps
|
||||||
|
run: npm ci
|
||||||
|
- name: Production build
|
||||||
|
run: npm run build
|
||||||
|
- name: Prepare SSH
|
||||||
|
env:
|
||||||
|
DEPLOY_SSH_KEY: ${{ secrets.DEPLOY_SSH_KEY }}
|
||||||
|
KNOWN_HOSTS: ${{ secrets.KNOWN_HOSTS }}
|
||||||
|
run: |
|
||||||
|
mkdir -p ~/.ssh && chmod 700 ~/.ssh
|
||||||
|
echo "$DEPLOY_SSH_KEY" > ~/.ssh/id_deploy
|
||||||
|
chmod 600 ~/.ssh/id_deploy
|
||||||
|
echo "$KNOWN_HOSTS" > ~/.ssh/known_hosts
|
||||||
|
chmod 600 ~/.ssh/known_hosts
|
||||||
|
- name: Install rsync
|
||||||
|
run: sudo apt-get update -qq && sudo apt-get install -y rsync openssh-client
|
||||||
|
- name: Deploy to S1 (85.175.7.40:1998)
|
||||||
|
run: |
|
||||||
|
rsync -az --delete-after --human-readable \
|
||||||
|
-e "ssh -i ~/.ssh/id_deploy -o UserKnownHostsFile=~/.ssh/known_hosts -p 1998" \
|
||||||
|
build/ min@85.175.7.40:/var/www/rublox-studio/build/
|
||||||
|
- name: Deploy to S2 (192.168.0.124:22, runner в той же сети)
|
||||||
|
run: |
|
||||||
|
rsync -az --delete-after --human-readable \
|
||||||
|
-e "ssh -i ~/.ssh/id_deploy -o UserKnownHostsFile=~/.ssh/known_hosts -p 22" \
|
||||||
|
build/ min@192.168.0.124:/var/www/rublox-studio/build/
|
||||||
|
- name: Verify deploy
|
||||||
|
run: |
|
||||||
|
echo "=== S1 ==="
|
||||||
|
ssh -i ~/.ssh/id_deploy -o UserKnownHostsFile=~/.ssh/known_hosts -p 1998 \
|
||||||
|
min@85.175.7.40 \
|
||||||
|
"ls /var/www/rublox-studio/build/index.html && du -sh /var/www/rublox-studio/build/"
|
||||||
|
echo "=== S2 ==="
|
||||||
|
ssh -i ~/.ssh/id_deploy -o UserKnownHostsFile=~/.ssh/known_hosts -p 22 \
|
||||||
|
min@192.168.0.124 \
|
||||||
|
"ls /var/www/rublox-studio/build/index.html && du -sh /var/www/rublox-studio/build/"
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user