name: deploy-contract on: release: types: [published] workflow_dispatch: inputs: target: description: "Куда деплоить: 'devnet' или 'our' (наш test-validator)" required: true default: devnet type: choice options: - devnet - our jobs: deploy-contract: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - name: Setup Rust toolchain + C compiler run: | apt-get update apt-get install -y --no-install-recommends build-essential pkg-config libssl-dev clang curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | \ sh -s -- -y --profile minimal --default-toolchain 1.91.0 - name: Setup Solana CLI (GitHub, минуя release.solana.com) run: | set -e SOL_VERSION=v1.18.26 cd /tmp curl -sSfL \ "https://github.com/solana-labs/solana/releases/download/${SOL_VERSION}/solana-release-x86_64-unknown-linux-gnu.tar.bz2" \ -o solana-release.tar.bz2 tar xjf solana-release.tar.bz2 mkdir -p "$HOME/solana-local" cp solana-release/bin/solana* "$HOME/solana-local/" 2>/dev/null || true cp solana-release/bin/cargo-build-bpf "$HOME/solana-local/" 2>/dev/null || true echo "$HOME/solana-local" >> "$GITHUB_PATH" echo "$HOME/.cargo/bin" >> "$GITHUB_PATH" export PATH="$HOME/solana-local:$PATH" solana --version - name: Setup Anchor CLI (anchor-next) run: | . "$HOME/.cargo/env" mkdir -p "$HOME/.cargo" printf '[net]\ngit-fetch-with-cli = true\n' > "$HOME/.cargo/config.toml" cargo install --force --git https://github.com/otter-sec/anchor.git \ --branch anchor-next anchor-cli --locked echo "$HOME/.cargo/bin" >> "$GITHUB_PATH" # ------ devnet: отдельно аирдроп ------ - name: Airdrop devnet SOL (target=devnet) if: github.event.inputs.target == 'devnet' run: | export PATH="$HOME/solana-local:$PATH" solana airdrop 2 9ALsnxXNzDBv3mokngCHbruRTWUZiWR7pf7vswS1fCpf \ --url https://api.devnet.solana.com || \ solana airdrop 2 9ALsnxXNzDBv3mokngCHbruRTWUZiWR7pf7vswS1fCpf \ --url https://api.devnet.solana.com solana balance 9ALsnxXNzDBv3mokngCHbruRTWUZiWR7pf7vswS1fCpf --url https://api.devnet.solana.com # ------ общие: build + test ------ - name: Build program working-directory: program run: | export PATH="$HOME/solana-local:$HOME/.cargo/bin:$PATH" anchor build - name: Test program working-directory: program run: | export PATH="$HOME/solana-local:$HOME/.cargo/bin:$PATH" anchor test # ------ deploy: devnet ------ - name: Deploy to devnet if: github.event.inputs.target == 'devnet' working-directory: program run: | export PATH="$HOME/solana-local:$HOME/.cargo/bin:$PATH" anchor deploy --provider.cluster devnet \ --provider.wallet ../deploy/dev_smart_updown-keypair.json # ------ deploy: наш тест-валидатор (всё в одном шаге, чтобы выжил) ------ - name: Deploy to our test-validator if: github.event.inputs.target == 'our' working-directory: program run: | export PATH="$HOME/solana-local:$HOME/.cargo/bin:$PATH" mkdir -p /tmp/solana-ledger solana-test-validator --ledger /tmp/solana-ledger \ --rpc-port 8899 --quiet > /tmp/validator.log 2>&1 & VPD=$! for i in $(seq 1 40); do curl -s http://127.0.0.1:8899 -H 'Content-Type: application/json' \ -d '{"jsonrpc":"2.0","id":1,"method":"getHealth"}' 2>/dev/null | grep -q '"ok"' && break sleep 1 done solana airdrop 100 9ALsnxXNzDBv3mokngCHbruRTWUZiWR7pf7vswS1fCpf \ --url http://127.0.0.1:8899 || true solana config set --url http://127.0.0.1:8899 echo ">>> Деплой в НАШ local test-validator (127.0.0.1:8899)" anchor deploy --provider.cluster http://127.0.0.1:8899 \ --provider.wallet ../deploy/dev_smart_updown-keypair.json kill $VPD 2>/dev/null || true