152 lines
7.1 KiB
YAML
152 lines
7.1 KiB
YAML
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: 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
|
|
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"
|
|
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
|
|
|
|
- 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
|
|
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
|
|
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 |