diff --git a/.github/workflows/update-dependencies.yml b/.github/workflows/update-dependencies.yml index 78840775..b1bbb040 100644 --- a/.github/workflows/update-dependencies.yml +++ b/.github/workflows/update-dependencies.yml @@ -2,22 +2,23 @@ name: Update Go Dependencies on: schedule: - - cron: '0 0 * * 1' - workflow_dispatch: + - cron: '0 0 * * 1' # Запуск каждую неделю в понедельник в 00:00 UTC + workflow_dispatch: # Возможность ручного запуска permissions: - contents: write + contents: write # Явное указание разрешений jobs: update: - runs-on: ubuntu-latest - timeout-minutes: 30 + runs-on: ubuntu-latest # Используем последнюю версию Ubuntu + + timeout-minutes: 30 # Добавляем таймаут для предотвращения зависания steps: - name: Checkout repository uses: actions/checkout@v4 with: - fetch-depth: 0 + fetch-depth: 0 # Загружаем всю историю token: ${{ secrets.GITHUB_TOKEN }} - name: Setup Go @@ -25,58 +26,100 @@ jobs: with: go-version-file: go.mod check-latest: true - cache: true + cache: true # Включаем кэширование модулей - - name: Install coreutils - run: sudo apt-get install -y coreutils - - - name: Check and initialize go.mod + - name: Fetch latest Xray-core release + id: get_latest_release run: | - [ -f go.mod ] || (echo "Error: go.mod not found" && exit 1) + LATEST_TAG=$(curl -s https://api.github.com/repos/XTLS/Xray-core/releases/latest | jq -r .tag_name) + echo "Latest Xray-core release: $LATEST_TAG" + echo "latest_tag=$LATEST_TAG" >> $GITHUB_ENV + + - name: Check go.mod and go.sum exist + run: | + if [ ! -f go.mod ]; then + echo "Error: go.mod file not found" + exit 1 + fi + + # Проверка наличия go.sum и создание, если отсутствует if [ ! -f go.sum ]; then - echo "Initializing go.sum..." + echo "go.sum file not found, initializing it..." go mod tidy fi - name: Clean Go module cache - run: go clean -modcache && go clean -cache + run: | + go clean -modcache + go clean -cache - name: Update dependencies id: update run: | - set -euo pipefail - - # Обновляем стандартные зависимости - go list -f '{{if not (or .Main .Indirect)}}{{.Path}}{{end}}' -m all \ - | grep -v -e 'gvisor.dev/gvisor' -e 'github.com/xtls/xray-core' \ - | xargs -r go get -u - - # Получаем последний релизный тег через GitHub API - release_info=$(curl -s https://api.github.com/repos/xtls/xray-core/releases/latest) - tag_name=$(echo "$release_info" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/') - - # Обновляем xray-core/v25 до последнего релизного тега - go get github.com/xtls/xray-core/v25@$tag_name + set -euo pipefail # Строгий режим для bash + + echo "Updating standard Go dependencies..." + + # Обновляем стандартные зависимости с исключением gvisor и xray-core + go list -f '{{if not (or .Main .Indirect)}}{{.Path}}{{end}}' -m all | \ + grep -v 'gvisor.dev/gvisor' | \ + grep -v 'github.com/xtls/xray-core' | \ + xargs -r go get -u + + echo "Updating xray-core to latest release: ${{ env.latest_tag }}" + go get github.com/xtls/xray-core@${{ env.latest_tag }} + + # Проверяем, какую версию получили + echo "Updated xray-core to:" + go list -m github.com/xtls/xray-core # Очистка и проверка go mod tidy - go mod verify + go mod verify || exit 1 + + # Выводим изменения для лога + echo "Updated dependencies:" + go list -m all - name: Check for changes id: check run: | if git diff --quiet go.mod go.sum; then echo "changes=false" >> $GITHUB_OUTPUT + echo "No changes detected in dependencies" else echo "changes=true" >> $GITHUB_OUTPUT - git diff go.mod + echo "Changes detected in dependencies:" + git diff go.mod || true fi - name: Commit and push changes if: steps.check.outputs.changes == 'true' run: | git config --global user.name "github-actions[bot]" - git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com" + git config --global user.email "github-actions[bot]@users.noreply.github.com" + git add go.mod go.sum - git commit -m "chore(deps): update xray-core/v25 to $tag_name" - git push origin HEAD:${{ github.ref }} + git commit -m "chore(deps): update Go dependencies + + Automated update of Go dependencies including xray-core to latest release ${{ env.latest_tag }}" + + # Попытка push с повторами при ошибках + max_attempts=3 + attempt=1 + + while [ $attempt -le $max_attempts ]; do + if git push origin ${{ github.ref }}; then + echo "Successfully pushed changes on attempt $attempt" + break + else + if [ $attempt -eq $max_attempts ]; then + echo "Failed to push after $max_attempts attempts" + exit 1 + fi + echo "Push failed on attempt $attempt, retrying..." + attempt=$((attempt + 1)) + git pull --rebase + sleep 5 + fi + done