Files
Smart-game/.gitea/workflows/deploy-devnet.yml
T

179 lines
8.9 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
name: deploy-contract
on:
release:
types: [published]
workflow_dispatch:
inputs:
target:
description: "Куда деплоить: 'devnet' или 'our' (наш test-validator)"
required: true
default: our
type: choice
options:
- devnet
- our
jobs:
deploy-contract:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set our dev keypair as default solana wallet
run: |
mkdir -p "$HOME/.config/solana"
cp deploy/dev_smart_updown-keypair.json "$HOME/.config/solana/id.json"
# убедимся что это именно наш ключ
ls -l "$HOME/.config/solana/id.json"
- name: Setup Rust toolchain + C compiler
run: |
set -e
apt-get update
apt-get install -y --no-install-recommends build-essential pkg-config libssl-dev clang podman
# пробуем стандартный rustup; при недоступности static.rust-lang.org — качаем через podman-контейнер
if ! curl -sSfL --max-time 60 https://sh.rustup.rs -o /tmp/rustup-init.sh 2>/dev/null; then
echo "sh.rustup.rs недоступен, качаем rustup-init через контейнер"
podman run --rm --network=host -v /tmp:/out \
gitea/runner-images:ubuntu-latest \
sh -c 'curl -sSfL https://static.rust-lang.org/rustup/dist/x86_64-unknown-linux-gnu/rustup-init -o /out/rustup-init-binary' 2>&1 | tail -1
echo "x" >> /tmp/rustup-init.sh.tmp 2>/dev/null || true
# конвертируем бинарь в то, что rustup принимает
cp /tmp/rustup-init-binary /tmp/rustup-init.sh 2>/dev/null || true
fi
# если это бинарь — запускаем его напрямую
chmod +x /tmp/rustup-init.sh 2>/dev/null || true
if file /tmp/rustup-init.sh 2>/dev/null | grep -q 'ELF'; then
/tmp/rustup-init.sh -y --profile minimal --default-toolchain 1.91.0
else
sh /tmp/rustup-init.sh -y --profile minimal --default-toolchain 1.91.0 2>/dev/null || \
/tmp/rustup-init.sh -y --profile minimal --default-toolchain 1.91.0
fi
- 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
cp solana-release/bin/cargo-build-sbf "$HOME/solana-local/" 2>/dev/null || true
cp solana-release/bin/cargo-test-bpf "$HOME/solana-local/" 2>/dev/null || true
cp solana-release/bin/cargo-test-sbf "$HOME/solana-local/" 2>/dev/null || true
# sbf-sdk и прочие каталоги (deps, perf-libs, sdk) — рекурсивно
for d in sdk deps perf-libs; do
[ -d "solana-release/bin/$d" ] && cp -r "solana-release/bin/$d" "$HOME/solana-local/"
done
echo "### предустановка SBF platform-tools (LLVM) с anza-xyz:"
cd "$HOME/solana-local/sdk/sbf"
export PATH="$HOME/.cargo/bin:$PATH"
ls dependencies/platform-tools/llvm/bin/clang 2>/dev/null || bash scripts/install.sh || true
ls dependencies/platform-tools/llvm/bin/ 2>/dev/null | grep -iE 'clang|objcopy' | head -6
# линкуем solana toolchain (на случай если install.sh его не сделал)
. "$HOME/.cargo/env" 2>/dev/null || true
if [ -d "$HOME/solana-local/sdk/sbf/dependencies/platform-tools/rust" ]; then
rustup toolchain link solana "$HOME/solana-local/sdk/sbf/dependencies/platform-tools/rust" 2>/dev/null || true
fi
echo "### sbf-sdk на месте:"
ls "$HOME/solana-local/sdk/sbf/" 2>&1 | head -5
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"
# ставим сначала через git CLI (обход libgit2-проблем с github auth), иначе --git
if ! cargo install --force --git https://github.com/otter-sec/anchor.git \
--branch anchor-next anchor-cli --locked 2>/dev/null; then
echo "cargo --git не сработал, собираем через git clone + --path"
cd /tmp
rm -rf anchor-src && git clone --depth 1 --branch anchor-next \
https://github.com/otter-sec/anchor.git anchor-src
cargo install --force --path /tmp/anchor-src/cli --locked \
--root "$HOME/.cargo" --bin anchor
fi
echo "$HOME/.cargo/bin" >> "$GITHUB_PATH"
export PATH="$HOME/.cargo/bin:$PATH"
anchor --version
# ------ 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"
echo "### HOME=$HOME"
mkdir -p "$HOME/.config/solana"
cp ../deploy/dev_smart_updown-keypair.json "$HOME/.config/solana/id.json"
echo "### размещаем наш keypair в .anchor (для Program ID 9ALs)"
mkdir -p .anchor
cp ../deploy/dev_smart_updown-keypair.json .anchor/smart-updown-keypair.json
cp ../deploy/dev_smart_updown-keypair.json .anchor/smart_updown-keypair.json 2>/dev/null || true
cp ../deploy/dev_smart_updown-keypair.json .anchor/9ALsnxXNzDBv3mokngCHbruRTWUZiWR7pf7vswS1fCpf-keypair.json 2>/dev/null || true
ls -la .anchor/
echo "### построение:"
anchor build --ignore-keys
- 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"
mkdir -p "$HOME/.config/solana"
cp ../deploy/dev_smart_updown-keypair.json "$HOME/.config/solana/id.json"
anchor deploy --provider.cluster devnet \
--provider.wallet "$HOME/.config/solana/id.json"
# ------ deploy: наш тест-валидатор (всё в одном шаге, чтобы выжил) ------
- name: Deploy to our test-validator
# деплой по умолчанию: наш локальный test-validator (без внешних faucet-лимитов)
if: github.event.inputs.target != 'devnet'
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
mkdir -p "$HOME/.config/solana"
cp ../deploy/dev_smart_updown-keypair.json "$HOME/.config/solana/id.json"
echo ">>> Деплой в НАШ local test-validator (127.0.0.1:8899)"
anchor deploy --provider.cluster http://127.0.0.1:8899 \
--provider.wallet "$HOME/.config/solana/id.json"
kill $VPD 2>/dev/null || true