feat: add ci
This commit is contained in:
parent
a100ba9549
commit
b1b2fe2e4a
17
.dockerignore
Normal file
17
.dockerignore
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
# A whitelist of files that should be included into Docker.
|
||||||
|
# Put an exclamation mark before everything to include.
|
||||||
|
|
||||||
|
# Ignore everything
|
||||||
|
*
|
||||||
|
|
||||||
|
# Allow the source code folders
|
||||||
|
!/src/
|
||||||
|
!/wit/
|
||||||
|
!/vine.toml
|
||||||
|
|
||||||
|
# Allow build.rs or git sha
|
||||||
|
!/.git
|
||||||
|
|
||||||
|
# Dependencies
|
||||||
|
!Cargo.lock
|
||||||
|
!Cargo.toml
|
||||||
7
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
7
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<!-- Follow the Conventional Commits spec: <https://www.conventionalcommits.org/en/v1.0.0/> -->
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
## Testing
|
||||||
|
|
||||||
|
Please follow our [Coding Guidelines](https://github.com/Pumpkin-MC/Pumpkin/blob/master/CONTRIBUTING.md#coding-guidelines)
|
||||||
15
.github/dependabot.yml
vendored
Normal file
15
.github/dependabot.yml
vendored
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
# To get started with Dependabot version updates, you'll need to specify which
|
||||||
|
# package ecosystems to update and where the package manifests are located.
|
||||||
|
# Please see the documentation for more information:
|
||||||
|
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
|
||||||
|
|
||||||
|
version: 2
|
||||||
|
updates:
|
||||||
|
- package-ecosystem: "cargo"
|
||||||
|
directory: "/"
|
||||||
|
schedule:
|
||||||
|
interval: weekly
|
||||||
|
- package-ecosystem: "github-actions"
|
||||||
|
directory: "/"
|
||||||
|
schedule:
|
||||||
|
interval: weekly
|
||||||
150
.github/workflows/docker.yml
vendored
Normal file
150
.github/workflows/docker.yml
vendored
Normal file
@ -0,0 +1,150 @@
|
|||||||
|
# https://docs.docker.com/build/ci/github-actions/multi-platform/#distribute-build-across-multiple-runners
|
||||||
|
name: deploy-docker-image
|
||||||
|
|
||||||
|
env:
|
||||||
|
REGISTRY: ghcr.io
|
||||||
|
GITHUB_REPOSITORY: ${{ github.repository }}
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- "master"
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
docker-build-deploy:
|
||||||
|
if: github.repository == 'Pumpkin-MC/Vine'
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
packages: write
|
||||||
|
attestations: write
|
||||||
|
id-token: write
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- os: ubuntu-26.04-arm
|
||||||
|
platform: linux/arm64
|
||||||
|
- os: ubuntu-latest
|
||||||
|
platform: linux/amd64
|
||||||
|
|
||||||
|
runs-on: ${{matrix.os}}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Set lowercase repository name
|
||||||
|
run: |
|
||||||
|
echo "REGISTRY_IMAGE=${GITHUB_REPOSITORY,,}" >> ${GITHUB_ENV}
|
||||||
|
|
||||||
|
- name: Prepare
|
||||||
|
run: |
|
||||||
|
platform=${{ matrix.platform }}
|
||||||
|
echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v7
|
||||||
|
with:
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
|
- name: Login to GitHub CR
|
||||||
|
uses: docker/login-action@v4
|
||||||
|
with:
|
||||||
|
registry: ${{ env.REGISTRY }}
|
||||||
|
username: ${{ github.repository_owner }}
|
||||||
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Extract Metadata
|
||||||
|
id: meta
|
||||||
|
uses: docker/metadata-action@v6
|
||||||
|
with:
|
||||||
|
images: ${{ env.REGISTRY }}/${{ env.REGISTRY_IMAGE }}
|
||||||
|
|
||||||
|
- name: Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v4
|
||||||
|
|
||||||
|
- name: Build and Push
|
||||||
|
id: build
|
||||||
|
uses: docker/build-push-action@v7
|
||||||
|
with:
|
||||||
|
context: .
|
||||||
|
platforms: ${{ matrix.platform }}
|
||||||
|
labels: ${{ steps.meta.outputs.labels }}
|
||||||
|
tags: ${{ env.REGISTRY }}/${{ env.REGISTRY_IMAGE }}
|
||||||
|
outputs: type=image,push-by-digest=true,name-canonical=true,push=true
|
||||||
|
|
||||||
|
- name: Export digest
|
||||||
|
run: |
|
||||||
|
mkdir -p ${{ runner.temp }}/digests
|
||||||
|
digest="${{ steps.build.outputs.digest }}"
|
||||||
|
touch "${{ runner.temp }}/digests/${digest#sha256:}"
|
||||||
|
|
||||||
|
- name: Upload digest
|
||||||
|
uses: actions/upload-artifact@v7
|
||||||
|
with:
|
||||||
|
name: digests-${{ env.PLATFORM_PAIR }}
|
||||||
|
path: ${{ runner.temp }}/digests/*
|
||||||
|
if-no-files-found: error
|
||||||
|
retention-days: 1
|
||||||
|
|
||||||
|
merge:
|
||||||
|
if: github.repository == 'Pumpkin-MC/Vine'
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
packages: write
|
||||||
|
attestations: write
|
||||||
|
id-token: write
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs:
|
||||||
|
- docker-build-deploy
|
||||||
|
steps:
|
||||||
|
- name: Set lowercase repository name
|
||||||
|
run: |
|
||||||
|
echo "REGISTRY_IMAGE=${GITHUB_REPOSITORY,,}" >> ${GITHUB_ENV}
|
||||||
|
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v7
|
||||||
|
with:
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
|
- name: Download Digests
|
||||||
|
uses: actions/download-artifact@v8
|
||||||
|
with:
|
||||||
|
path: ${{ runner.temp }}/digests
|
||||||
|
pattern: digests-*
|
||||||
|
merge-multiple: true
|
||||||
|
|
||||||
|
- name: Extract Versions
|
||||||
|
id: versions
|
||||||
|
run: |
|
||||||
|
VERSION=$(awk -F '"' '/^version/ {print $2}' Cargo.toml)
|
||||||
|
echo "VINE_VERSION=$VERSION" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
- name: Login to GitHub CR
|
||||||
|
uses: docker/login-action@v4
|
||||||
|
with:
|
||||||
|
registry: ${{ env.REGISTRY }}
|
||||||
|
username: ${{ github.repository_owner }}
|
||||||
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v4
|
||||||
|
|
||||||
|
- name: Extract Metadata
|
||||||
|
id: meta
|
||||||
|
uses: docker/metadata-action@v6
|
||||||
|
with:
|
||||||
|
images: ${{ env.REGISTRY }}/${{ env.REGISTRY_IMAGE }}
|
||||||
|
tags: |
|
||||||
|
type=ref,event=branch
|
||||||
|
type=raw,value=latest
|
||||||
|
type=sha
|
||||||
|
type=raw,value=${{ env.VINE_VERSION }}
|
||||||
|
|
||||||
|
- name: Create manifest list and push
|
||||||
|
working-directory: ${{ runner.temp }}/digests
|
||||||
|
run: |
|
||||||
|
docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
|
||||||
|
$(printf '${{ env.REGISTRY }}/${{ env.REGISTRY_IMAGE }}@sha256:%s ' *)
|
||||||
|
|
||||||
|
- name: Inspect image
|
||||||
|
run: |
|
||||||
|
docker buildx imagetools inspect ${{ env.REGISTRY }}/${{ env.REGISTRY_IMAGE }}:${{ steps.meta.outputs.version }}
|
||||||
165
.github/workflows/release.yml
vendored
Normal file
165
.github/workflows/release.yml
vendored
Normal file
@ -0,0 +1,165 @@
|
|||||||
|
name: Release
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- "*"
|
||||||
|
- "!nightly"
|
||||||
|
- "!nightly*"
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
tag_name:
|
||||||
|
description: "Release Tag name (optional, defaults to Cargo.toml version)"
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
|
||||||
|
env:
|
||||||
|
CARGO_TERM_COLOR: always
|
||||||
|
RUSTFLAGS: "-Dwarnings"
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build_release:
|
||||||
|
name: Build & Sign Release
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
os:
|
||||||
|
[
|
||||||
|
ubuntu-latest,
|
||||||
|
ubuntu-26.04-arm,
|
||||||
|
windows-latest,
|
||||||
|
windows-11-arm,
|
||||||
|
macos-latest,
|
||||||
|
]
|
||||||
|
toolchain:
|
||||||
|
- stable
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v7
|
||||||
|
with:
|
||||||
|
submodules: recursive
|
||||||
|
- name: Checkout Pumpkin dependency
|
||||||
|
shell: bash
|
||||||
|
run: git clone --depth 1 https://github.com/Pumpkin-MC/Pumpkin.git ../Pumpkin
|
||||||
|
- run: rustup update ${{ matrix.toolchain }} && rustup default ${{ matrix.toolchain }}
|
||||||
|
- uses: Swatinem/rust-cache@v2
|
||||||
|
|
||||||
|
- name: Install musl-tools (Linux only)
|
||||||
|
if: runner.os == 'Linux'
|
||||||
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y musl-tools
|
||||||
|
|
||||||
|
- name: Build Release
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
cargo build --verbose --release
|
||||||
|
if [ "${{ runner.os }}" == "Linux" ]; then
|
||||||
|
if [ "${{ runner.arch }}" == "X64" ]; then
|
||||||
|
TARGET="x86_64-unknown-linux-musl"
|
||||||
|
elif [ "${{ runner.arch }}" == "ARM64" ]; then
|
||||||
|
TARGET="aarch64-unknown-linux-musl"
|
||||||
|
fi
|
||||||
|
rustup target add "$TARGET"
|
||||||
|
cargo build --verbose --release --target "$TARGET"
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Prepare artifacts
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
mkdir -p dist
|
||||||
|
EXT=""
|
||||||
|
if [ "${{ runner.os }}" == "Windows" ]; then EXT=".exe"; fi
|
||||||
|
cp "target/release/vine$EXT" "dist/vine-${{ runner.arch }}-${{ runner.os }}$EXT"
|
||||||
|
if [ "${{ runner.os }}" == "Linux" ]; then
|
||||||
|
if [ "${{ runner.arch }}" == "X64" ]; then
|
||||||
|
TARGET="x86_64-unknown-linux-musl"
|
||||||
|
elif [ "${{ runner.arch }}" == "ARM64" ]; then
|
||||||
|
TARGET="aarch64-unknown-linux-musl"
|
||||||
|
fi
|
||||||
|
cp "target/$TARGET/release/vine" "dist/vine-${{ runner.arch }}-${{ runner.os }}-musl"
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Upload unsigned executable for SignPath (Windows only)
|
||||||
|
if: runner.os == 'Windows' && env.SIGNPATH_API_TOKEN != ''
|
||||||
|
id: upload_unsigned
|
||||||
|
uses: actions/upload-artifact@v7
|
||||||
|
with:
|
||||||
|
name: unsigned-${{ runner.arch }}-${{ runner.os }}
|
||||||
|
path: dist/vine-*
|
||||||
|
retention-days: 1
|
||||||
|
|
||||||
|
- name: Submit SignPath signing request (Windows only)
|
||||||
|
if: runner.os == 'Windows' && env.SIGNPATH_API_TOKEN != ''
|
||||||
|
uses: signpath/github-action-submit-signing-request@v2
|
||||||
|
with:
|
||||||
|
api-token: '${{ secrets.SIGNPATH_API_TOKEN }}'
|
||||||
|
organization-id: '${{ secrets.SIGNPATH_ORGANIZATION_ID }}'
|
||||||
|
project-slug: '${{ secrets.SIGNPATH_PROJECT_SLUG }}'
|
||||||
|
signing-policy-slug: '${{ secrets.SIGNPATH_RELEASE_SIGNING_POLICY_SLUG || secrets.SIGNPATH_SIGNING_POLICY_SLUG }}'
|
||||||
|
github-artifact-id: '${{ steps.upload_unsigned.outputs.artifact-id }}'
|
||||||
|
wait-for-completion: true
|
||||||
|
output-artifact-directory: dist/signed/
|
||||||
|
|
||||||
|
- name: Overwrite with signed version (Windows only)
|
||||||
|
if: runner.os == 'Windows' && env.SIGNPATH_API_TOKEN != ''
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
cp dist/signed/* dist/
|
||||||
|
rm -rf dist/signed/
|
||||||
|
|
||||||
|
- name: Export executable
|
||||||
|
uses: actions/upload-artifact@v7
|
||||||
|
with:
|
||||||
|
name: vine-${{ runner.arch }}-${{ runner.os }}
|
||||||
|
compression-level: 9
|
||||||
|
path: dist/vine-*
|
||||||
|
|
||||||
|
publish_release:
|
||||||
|
name: Publish GitHub Release
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
needs: [build_release]
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v7
|
||||||
|
with:
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
|
- name: Determine tag name
|
||||||
|
id: tag
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
if [ -n "${{ github.event.inputs.tag_name }}" ]; then
|
||||||
|
TAG="${{ github.event.inputs.tag_name }}"
|
||||||
|
elif [ "${{ github.ref_type }}" == "tag" ]; then
|
||||||
|
TAG="${{ github.ref_name }}"
|
||||||
|
else
|
||||||
|
VERSION=$(awk -F '"' '/^version/ {print $2}' Cargo.toml)
|
||||||
|
TAG="${VERSION}"
|
||||||
|
fi
|
||||||
|
echo "tag_name=${TAG}" >> $GITHUB_OUTPUT
|
||||||
|
echo "Determined release tag: ${TAG}"
|
||||||
|
|
||||||
|
- name: Download prebuilt binary artifacts
|
||||||
|
uses: actions/download-artifact@v8
|
||||||
|
with:
|
||||||
|
pattern: "vine-*"
|
||||||
|
path: dist/
|
||||||
|
merge-multiple: true
|
||||||
|
|
||||||
|
- name: Generate Checksums
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
cd dist
|
||||||
|
sha256sum vine-* > checksums.sha256
|
||||||
|
cat checksums.sha256
|
||||||
|
|
||||||
|
- name: Create GitHub Release
|
||||||
|
uses: softprops/action-gh-release@v3
|
||||||
|
with:
|
||||||
|
tag_name: ${{ steps.tag.outputs.tag_name }}
|
||||||
|
name: Release ${{ steps.tag.outputs.tag_name }}
|
||||||
|
files: |
|
||||||
|
dist/vine*
|
||||||
|
dist/checksums.sha256
|
||||||
|
generate_release_notes: true
|
||||||
229
.github/workflows/rust.yml
vendored
Normal file
229
.github/workflows/rust.yml
vendored
Normal file
@ -0,0 +1,229 @@
|
|||||||
|
name: Cargo Build, Test, and Linting
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
pull_request:
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
env:
|
||||||
|
CARGO_TERM_COLOR: always
|
||||||
|
RUSTFLAGS: "-Dwarnings"
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
format:
|
||||||
|
name: Check formatting
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
toolchain:
|
||||||
|
- stable
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v7
|
||||||
|
with:
|
||||||
|
submodules: recursive
|
||||||
|
- name: Checkout Pumpkin dependency
|
||||||
|
shell: bash
|
||||||
|
run: git clone --depth 1 https://github.com/Pumpkin-MC/Pumpkin.git ../Pumpkin
|
||||||
|
- run: rustup update ${{ matrix.toolchain }} && rustup default ${{ matrix.toolchain }}
|
||||||
|
- run: rustup component add rustfmt
|
||||||
|
- uses: Swatinem/rust-cache@v2
|
||||||
|
- run: cargo fmt --check
|
||||||
|
|
||||||
|
machete:
|
||||||
|
name: Detect unused dependencies
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
toolchain:
|
||||||
|
- stable
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v7
|
||||||
|
with:
|
||||||
|
submodules: recursive
|
||||||
|
- name: Checkout Pumpkin dependency
|
||||||
|
shell: bash
|
||||||
|
run: git clone --depth 1 https://github.com/Pumpkin-MC/Pumpkin.git ../Pumpkin
|
||||||
|
- run: rustup update ${{ matrix.toolchain }} && rustup default ${{ matrix.toolchain }}
|
||||||
|
- uses: bnjbvr/cargo-machete@main
|
||||||
|
|
||||||
|
clippy_debug:
|
||||||
|
name: Run lints (debug)
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
toolchain:
|
||||||
|
- stable
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v7
|
||||||
|
with:
|
||||||
|
submodules: recursive
|
||||||
|
- name: Checkout Pumpkin dependency
|
||||||
|
shell: bash
|
||||||
|
run: git clone --depth 1 https://github.com/Pumpkin-MC/Pumpkin.git ../Pumpkin
|
||||||
|
- run: rustup update ${{ matrix.toolchain }} && rustup default ${{ matrix.toolchain }}
|
||||||
|
- run: rustup component add clippy
|
||||||
|
- uses: Swatinem/rust-cache@v2
|
||||||
|
- name: Clippy (debug)
|
||||||
|
run: cargo clippy --all-targets --all-features
|
||||||
|
|
||||||
|
clippy_release:
|
||||||
|
name: Run lints (release)
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
toolchain:
|
||||||
|
- stable
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v7
|
||||||
|
with:
|
||||||
|
submodules: recursive
|
||||||
|
- name: Checkout Pumpkin dependency
|
||||||
|
shell: bash
|
||||||
|
run: git clone --depth 1 https://github.com/Pumpkin-MC/Pumpkin.git ../Pumpkin
|
||||||
|
- run: rustup update ${{ matrix.toolchain }} && rustup default ${{ matrix.toolchain }}
|
||||||
|
- run: rustup component add clippy
|
||||||
|
- uses: Swatinem/rust-cache@v2
|
||||||
|
- name: Clippy (release)
|
||||||
|
run: cargo clippy --release --all-targets --all-features
|
||||||
|
|
||||||
|
build_and_test:
|
||||||
|
name: Build project and test
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
needs: [format, machete, clippy_debug, clippy_release]
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
os:
|
||||||
|
[
|
||||||
|
ubuntu-latest,
|
||||||
|
ubuntu-26.04-arm,
|
||||||
|
windows-latest,
|
||||||
|
windows-11-arm,
|
||||||
|
macos-latest,
|
||||||
|
]
|
||||||
|
toolchain:
|
||||||
|
- stable
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v7
|
||||||
|
with:
|
||||||
|
submodules: recursive
|
||||||
|
- name: Checkout Pumpkin dependency
|
||||||
|
shell: bash
|
||||||
|
run: git clone --depth 1 https://github.com/Pumpkin-MC/Pumpkin.git ../Pumpkin
|
||||||
|
- run: rustup update ${{ matrix.toolchain }} && rustup default ${{ matrix.toolchain }}
|
||||||
|
- uses: taiki-e/install-action@nextest
|
||||||
|
- uses: Swatinem/rust-cache@v2
|
||||||
|
- name: Cargo nextest
|
||||||
|
run: cargo nextest run --verbose
|
||||||
|
- name: Cargo doctest
|
||||||
|
run: cargo test --doc --verbose
|
||||||
|
|
||||||
|
build_release:
|
||||||
|
name: Build project in release
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
needs: [build_and_test]
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
os:
|
||||||
|
[
|
||||||
|
ubuntu-latest,
|
||||||
|
ubuntu-26.04-arm,
|
||||||
|
windows-latest,
|
||||||
|
windows-11-arm,
|
||||||
|
macos-latest,
|
||||||
|
]
|
||||||
|
toolchain:
|
||||||
|
- stable
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v7
|
||||||
|
with:
|
||||||
|
submodules: recursive
|
||||||
|
- name: Checkout Pumpkin dependency
|
||||||
|
shell: bash
|
||||||
|
run: git clone --depth 1 https://github.com/Pumpkin-MC/Pumpkin.git ../Pumpkin
|
||||||
|
- run: rustup update ${{ matrix.toolchain }} && rustup default ${{ matrix.toolchain }}
|
||||||
|
- uses: Swatinem/rust-cache@v2
|
||||||
|
|
||||||
|
- name: Install musl-tools (Linux only)
|
||||||
|
if: runner.os == 'Linux'
|
||||||
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y musl-tools
|
||||||
|
|
||||||
|
- name: Build Release
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
cargo build --verbose --release
|
||||||
|
if [ "${{ runner.os }}" == "Linux" ]; then
|
||||||
|
if [ "${{ runner.arch }}" == "X64" ]; then
|
||||||
|
TARGET="x86_64-unknown-linux-musl"
|
||||||
|
elif [ "${{ runner.arch }}" == "ARM64" ]; then
|
||||||
|
TARGET="aarch64-unknown-linux-musl"
|
||||||
|
fi
|
||||||
|
rustup target add "$TARGET"
|
||||||
|
cargo build --verbose --release --target "$TARGET"
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Prepare artifacts
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
mkdir -p dist
|
||||||
|
EXT=""
|
||||||
|
if [ "${{ runner.os }}" == "Windows" ]; then EXT=".exe"; fi
|
||||||
|
cp "target/release/vine$EXT" "dist/vine-${{ runner.arch }}-${{ runner.os }}$EXT"
|
||||||
|
if [ "${{ runner.os }}" == "Linux" ]; then
|
||||||
|
if [ "${{ runner.arch }}" == "X64" ]; then
|
||||||
|
TARGET="x86_64-unknown-linux-musl"
|
||||||
|
elif [ "${{ runner.arch }}" == "ARM64" ]; then
|
||||||
|
TARGET="aarch64-unknown-linux-musl"
|
||||||
|
fi
|
||||||
|
cp "target/$TARGET/release/vine" "dist/vine-${{ runner.arch }}-${{ runner.os }}-musl"
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Export executable
|
||||||
|
uses: actions/upload-artifact@v7
|
||||||
|
with:
|
||||||
|
name: vine-${{ runner.arch }}-${{ runner.os }}
|
||||||
|
compression-level: 9
|
||||||
|
path: dist/vine-*
|
||||||
|
|
||||||
|
draft_release:
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
needs: [build_release]
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
if: github.event_name == 'push' && github.ref == 'refs/heads/master'
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v7
|
||||||
|
with:
|
||||||
|
submodules: recursive
|
||||||
|
- name: Download prebuilt binary artifacts
|
||||||
|
uses: actions/download-artifact@v8
|
||||||
|
with:
|
||||||
|
pattern: "**/vine-*"
|
||||||
|
path: dist/
|
||||||
|
merge-multiple: true
|
||||||
|
- name: Generate release notes
|
||||||
|
run: |
|
||||||
|
tree dist/ || ls -la dist/
|
||||||
|
echo "From commit: $(git rev-parse --short HEAD)" > dist/RELEASE.md
|
||||||
|
echo "Generated on: $(date -u +"%Y-%m-%d %H:%M") UTC" >> dist/RELEASE.md
|
||||||
|
cat dist/RELEASE.md
|
||||||
|
|
||||||
|
- name: Update the nightly tag
|
||||||
|
run: |
|
||||||
|
git config user.name "github-actions[bot]"
|
||||||
|
git config user.email "github-actions[bot]@users.noreply.github.com"
|
||||||
|
git tag --force nightly && git push --force origin tag nightly
|
||||||
|
|
||||||
|
- name: Draft a nightly github release
|
||||||
|
uses: softprops/action-gh-release@v3
|
||||||
|
with:
|
||||||
|
prerelease: true
|
||||||
|
files: dist/vine*
|
||||||
|
tag_name: nightly
|
||||||
|
name: Nightly Build
|
||||||
|
body_path: dist/RELEASE.md
|
||||||
24
.github/workflows/typos.yml
vendored
Normal file
24
.github/workflows/typos.yml
vendored
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
name: Spelling
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
pull_request:
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
env:
|
||||||
|
CLICOLOR: 1
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
spelling:
|
||||||
|
name: Spell Check with Typos
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout Actions Repository
|
||||||
|
uses: actions/checkout@v7
|
||||||
|
with:
|
||||||
|
submodules: recursive
|
||||||
|
- name: Spell Check Repo
|
||||||
|
uses: crate-ci/typos@v1.50.0
|
||||||
31
Dockerfile
Normal file
31
Dockerfile
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
FROM alpine:3.24
|
||||||
|
|
||||||
|
ARG TARGETARCH
|
||||||
|
ARG VINE_TAG=nightly
|
||||||
|
|
||||||
|
RUN apk add --no-cache curl ca-certificates && \
|
||||||
|
case "${TARGETARCH}" in \
|
||||||
|
"amd64") BIN_ARCH="X64" ;; \
|
||||||
|
"arm64") BIN_ARCH="ARM64" ;; \
|
||||||
|
*) echo "Unsupported architecture: ${TARGETARCH}" && exit 1 ;; \
|
||||||
|
esac && \
|
||||||
|
curl -fsSL "https://github.com/Pumpkin-MC/Vine/releases/download/${VINE_TAG}/vine-${BIN_ARCH}-Linux-musl" \
|
||||||
|
-o /usr/local/bin/vine && \
|
||||||
|
chmod +x /usr/local/bin/vine && \
|
||||||
|
apk del curl
|
||||||
|
|
||||||
|
RUN addgroup -g 2613 vine && \
|
||||||
|
adduser -u 2613 -G vine -D -h /vine vine && \
|
||||||
|
chown -R vine:vine /vine
|
||||||
|
|
||||||
|
WORKDIR /vine
|
||||||
|
USER vine:vine
|
||||||
|
|
||||||
|
ENV RUST_BACKTRACE=1
|
||||||
|
EXPOSE 25565
|
||||||
|
EXPOSE 19132/udp
|
||||||
|
|
||||||
|
ENTRYPOINT [ "vine" ]
|
||||||
|
|
||||||
|
HEALTHCHECK --interval=30s --timeout=3s --retries=3 \
|
||||||
|
CMD nc -z 127.0.0.1 25565 || exit 1
|
||||||
21
docker-compose.yml
Normal file
21
docker-compose.yml
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
services:
|
||||||
|
vine:
|
||||||
|
# Make sure to change the tag to the vine version you want to use.
|
||||||
|
# https://github.com/Pumpkin-MC/Vine/pkgs/container/vine/versions?filters%5Bversion_type%5D=tagged
|
||||||
|
#image: ghcr.io/pumpkin-mc/vine:master
|
||||||
|
build: .
|
||||||
|
ports:
|
||||||
|
- "25565:25565"
|
||||||
|
- "19132:19132/udp"
|
||||||
|
volumes:
|
||||||
|
- ./data:/vine
|
||||||
|
# Use the following, if you want to make your config immutable
|
||||||
|
#- ./vine.toml:/vine/vine.toml:ro
|
||||||
|
security_opt:
|
||||||
|
- no-new-privileges:true
|
||||||
|
restart: unless-stopped
|
||||||
|
stdin_open: true
|
||||||
|
tty: true
|
||||||
|
cap_drop:
|
||||||
|
- ALL
|
||||||
|
read_only: false
|
||||||
73
egg-vine.json
Normal file
73
egg-vine.json
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
{
|
||||||
|
"_comment": "DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY PTERODACTYL PANEL - PTERODACTYL.IO",
|
||||||
|
"meta": {
|
||||||
|
"version": "PTDL_v2",
|
||||||
|
"update_url": null
|
||||||
|
},
|
||||||
|
"exported_at": "2026-09-08T18:00:00+00:00",
|
||||||
|
"name": "Vine",
|
||||||
|
"author": "lilalexmed@proton.me",
|
||||||
|
"description": "Vine is a high-performance, lightweight, multi-version Minecraft proxy built entirely in Rust, offering sub-millisecond packet routing, WASM plugin support, and modern protocol compatibility.",
|
||||||
|
"features": null,
|
||||||
|
"docker_images": {
|
||||||
|
"Alpine": "ghcr.io/pterodactyl/yolks:alpine",
|
||||||
|
"Debian": "ghcr.io/pterodactyl/yolks:debian"
|
||||||
|
},
|
||||||
|
"file_denylist": [],
|
||||||
|
"startup": "./vine",
|
||||||
|
"config": {
|
||||||
|
"files": "{\r\n \"vine.toml\": {\r\n \"parser\": \"file\",\r\n \"find\": {\r\n \"bind_address = \\\"0.0.0.0:25565\\\"\": \"bind_address = \\\"0.0.0.0:{{server.build.default.port}}\\\"\"\r\n }\r\n }\r\n}",
|
||||||
|
"startup": "{\r\n \"done\": \"Vine Minecraft Proxy is listening on\"\r\n}",
|
||||||
|
"logs": "{}",
|
||||||
|
"stop": "stop"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"installation": {
|
||||||
|
"script": "#!/bin/ash\r\nset -eux\r\n\r\napk add --no-cache curl jq\r\nmkdir -p /mnt/server\r\ncd /mnt/server\r\n\r\nARCH=$(uname -m)\r\ncase \"$ARCH\" in\r\n x86_64|amd64)\r\n VINE_ARCH=\"X64\"\r\n ;;\r\n aarch64|arm64)\r\n VINE_ARCH=\"ARM64\"\r\n ;;\r\n *)\r\n echo \"Unsupported architecture: $ARCH\"\r\n exit 1\r\n ;;\r\nesac\r\n\r\nBINARY_NAME=\"vine-${VINE_ARCH}-Linux-musl\"\r\n\r\nif [ -n \"${DOWNLOAD_URL:-}\" ]; then\r\n URL=\"$DOWNLOAD_URL\"\r\nelif [ \"${VERSION:-nightly}\" = \"latest\" ] || [ \"${VERSION:-nightly}\" = \"nightly\" ]; then\r\n URL=\"https://github.com/${GITHUB_PACKAGE:-Pumpkin-MC/Vine}/releases/download/nightly/${BINARY_NAME}\"\r\nelse\r\n URL=\"https://github.com/${GITHUB_PACKAGE:-Pumpkin-MC/Vine}/releases/download/${VERSION}/${BINARY_NAME}\"\r\nfi\r\n\r\necho \"Downloading Vine from: $URL\"\r\ncurl -fsSL \"$URL\" -o /mnt/server/vine\r\nchmod +x /mnt/server/vine\r\n\r\n# Quickly start and kill proxy to generate initial configuration if not present\r\nif [ ! -f /mnt/server/vine.toml ]; then\r\n timeout 2 ./vine || true\r\nfi",
|
||||||
|
"container": "ghcr.io/pterodactyl/installers:alpine",
|
||||||
|
"entrypoint": "ash"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"variables": [
|
||||||
|
{
|
||||||
|
"name": "Rust backtrace",
|
||||||
|
"description": "\"0\" -> No backtrace is generated. This is the default behavior.\r\n\"1\" -> Generates a minimal backtrace showing only relevant information about where the panic occurred.\r\n\"full\" -> Generates a detailed backtrace, showing all frames leading to the panic, including functions in the Rust standard library and dependencies.",
|
||||||
|
"env_variable": "RUST_BACKTRACE",
|
||||||
|
"default_value": "1",
|
||||||
|
"user_viewable": true,
|
||||||
|
"user_editable": true,
|
||||||
|
"rules": "required|in:1,0,full",
|
||||||
|
"field_type": "text"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Vine Version",
|
||||||
|
"description": "The version of Vine to install. Options: 'nightly', 'latest', or a specific release tag (e.g. 'v0.1.0').\r\nScope: installation",
|
||||||
|
"env_variable": "VERSION",
|
||||||
|
"default_value": "nightly",
|
||||||
|
"user_viewable": true,
|
||||||
|
"user_editable": true,
|
||||||
|
"rules": "required|string|max:64",
|
||||||
|
"field_type": "text"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "GitHub Repository",
|
||||||
|
"description": "GitHub repository in 'owner/repo' format to download releases from. Useful if you are using a fork.\r\nScope: installation",
|
||||||
|
"env_variable": "GITHUB_PACKAGE",
|
||||||
|
"default_value": "Pumpkin-MC/Vine",
|
||||||
|
"user_viewable": true,
|
||||||
|
"user_editable": true,
|
||||||
|
"rules": "required|string|max:128",
|
||||||
|
"field_type": "text"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Direct Download URL",
|
||||||
|
"description": "Direct URL to download the Vine binary from. If provided, this overrides VERSION and GITHUB_PACKAGE.\r\nScope: installation",
|
||||||
|
"env_variable": "DOWNLOAD_URL",
|
||||||
|
"default_value": "",
|
||||||
|
"user_viewable": true,
|
||||||
|
"user_editable": true,
|
||||||
|
"rules": "nullable|string",
|
||||||
|
"field_type": "text"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
10
typos.toml
Normal file
10
typos.toml
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
[files]
|
||||||
|
extend-exclude = ["assets/"]
|
||||||
|
|
||||||
|
[default.extend-words]
|
||||||
|
handled = "handled"
|
||||||
|
received = "received"
|
||||||
|
ba = "ba"
|
||||||
|
fo = "fo"
|
||||||
|
undescore = "undescore"
|
||||||
|
replaceables = "replaceables"
|
||||||
Loading…
Reference in New Issue
Block a user