# GitHub Actions Snippets

Some useful configs for my beloved green badges in README.md, automatic deploy, and more.

## Deploy to xmit.co via Just command

The deploy.yaml for this website:

name: deploy

on:
  push:
    branches: [ main ]
  workflow_dispatch:

# Allow one concurrent deployment
concurrency:
  group: deploy
  cancel-in-progress: true

jobs:
  deploy:
    runs-on: ubuntu-latest
    environment: prod
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Set up Node
        uses: actions/setup-node@v4

      - name: Set up Just
        uses: extractions/setup-just@v3

      - name: Deploy to xmit
        run: just deploy
        env:
          XMIT_KEY: ${{ secrets.XMIT_TOKEN }}

The justfile for this website:

set dotenv-load := true

serve:
    npx http-server public/ -o -p 8080

deploy:
    npx @xmit.co/xmit $XMIT_DOMAIN public/

## Deploy via SSH

The deploy.yml for my Telegram-bot Ashley:

name: deploy

on:
  push:
    branches:
      - main
  workflow_dispatch:

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Install SSH agent
        run: which ssh-agent || ( apt-get install openssh-client -y )
      - name: Deploy
        run: |
          eval `ssh-agent -s`
          ssh-add <(echo "${{ secrets.SSH_PRIVATE_KEY }}")
          mkdir -p ~/.ssh
          echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config
          ssh -t ${{ secrets.VPS_USERNAME }}@${{ secrets.VPS_ADDRESS}} "cd ${{ secrets.WORKING_DIR }} && git checkout main && git pull && source venv/bin/activate && pip install -r requirements.txt && sudo systemctl restart ashleybot.service"

## Validate HTML

name: validate

on:
  push:
    paths:
      - '**.html'
  pull_request:
    paths:
      - '**.html'
  workflow_dispatch:

jobs:
  validate:
    runs-on: ubuntu-latest
    steps:
      - name: "Checkout code"
        uses: actions/checkout@v4

      - name: HTML5 Validator
        uses: Cyb3r-Jak3/html5validator-action@master
        with:
          root: .

## Validate JSON

name: JSON check

on:
  push:
    paths:
      - '**.json'
    branches:
      - main
  pull_request:
    paths:
      - '**.json'

jobs:
  check:
    runs-on: ubuntu-latest
    steps:
      - name: "Checkout code"
        uses: actions/checkout@v4

      - name: json-syntax-check
        uses: limitusus/json-syntax-check@v2
        with:
          pattern: "\\.json$"

## Run Tests & Checks for a Rust Project

name: tests

on:
  push:
    paths:
      - '**/*.rs'
      - 'Cargo.toml'
      - '.github/workflows/tests.yml'
    branches:
      - main
  pull_request:
    paths:
      - '**/*.rs'
      - 'Cargo.toml'
      - '.github/workflows/tests.yml'
  workflow_dispatch:

env:
  CARGO_TERM_COLOR: always

jobs:
  tests:
    runs-on: ubuntu-latest
    steps:
      - name: "Checkout code"
        uses: actions/checkout@v4

      - name: "Install Rust toolchain"
        uses: dtolnay/rust-toolchain@master
        with:
          profile: minimal
          toolchain: stable
          components: clippy,rustfmt
          override: true

      - name: "Fmt check"
        run: cargo fmt --all -- --check

      - name: "Run tests"
        run: cargo test --all --no-fail-fast

      - name: "Run clippy"
        run: cargo clippy -- -D warnings -D clippy::pedantic -A clippy::cast_precision_loss -A clippy::cast_possible_truncation -A clippy::cast_possible_wrap -A clippy::cast_sign_loss -A clippy::cast_lossless -A clippy::module_name_repetitions -A clippy::unnecessary_box_returns --verbose --no-deps

## Automatic Release for a Rust SDL2 Project

This snippet will build project on Linux, Windows, and MacOS; automatically create a release, and upload archives with binaries to GitHub

The instruction tags: [ "v[0-9]+.*" ] will run it only on tags with semver-like name (e.g. v1.2.3)

name: release

permissions:
  contents: write

on:
  push:
    tags:
      - v[0-9]+.*
  workflow_dispatch:

env:
  GLOBAL_ENV_EXAMPLE:

jobs:
  create-release:
    runs-on: ubuntu-latest
    steps:
      - name: "Checkout code"
        uses: actions/checkout@v4

      - name: "Create release"
        uses: taiki-e/create-gh-release-action@v1
        with:
          token: ${{ secrets.GITHUB_TOKEN }}

  upload-assets:
    needs: create-release
    strategy:
      fail-fast: false
      matrix:
        include:
          - name: Windows
            os: windows-2019
          - name: Linux
            os: ubuntu-latest
          - name: OSX
            os: macos-latest
    name: ${{ matrix.name }}
    runs-on: ${{ matrix.os }}
    steps:
      - name: "Checkout code"
        uses: actions/checkout@v4

      - name: "Install Rust toolchain"
        uses: dtolnay/rust-toolchain@master
        with:
          profile: minimal
          toolchain: nightly
          override: true

      - name: "Install SDL2 (linux)"
        if: runner.os == 'Linux'
        run: |
          sudo apt-get update -y -qq
          sudo apt-get install libsdl2-dev

      - name: "Install SDL2 (mac)"
        if: runner.os == 'macOS'
        run: |
          HOMEBREW_NO_AUTO_UPDATE=yes HOMEBREW_NO_INSTALL_CLEANUP=yes brew install sdl2

      - name: "Install SDL2 (windows)"
        if: runner.os == 'Windows'
        shell: powershell
        run: |
          Import-Module BitsTransfer
          Start-BitsTransfer -Source "https://www.libsdl.org/release/SDL2-devel-2.0.22-VC.zip" -Destination SDL2.zip
          Expand-Archive -Path SDL2.zip -Destination .
          Get-ChildItem -Path SDL2-2.0.22/lib/x64/ -Recurse -File | Move-Item -Destination . -Force

      - name: "Build and upload binary"
        uses: taiki-e/upload-rust-binary-action@v1
        with:
          bin: midia
          archive: $bin-$tag-${{ runner.os }}
          token: ${{ secrets.GITHUB_TOKEN }}
          include: LICENSE,README.md,data
          leading_dir: true