.github/workflows/publish.yml

name: Publish

on:
  push:
    branches: [master]
  workflow_dispatch:
  repository_dispatch:
    types: [content-changed]

concurrency:
  group: publish
  cancel-in-progress: true

jobs:
  publish:
    runs-on: ubuntu-latest
    steps:
      - name: Clone cyberia-blog into ~/cyber/cyberia-blog
        run: |
          mkdir -p "$HOME/cyber"
          git clone --depth 1 https://github.com/cyberia-to/cyberia-blog.git "$HOME/cyber/cyberia-blog"

      - name: Install Nushell
        run: |
          NU_TAG=$(curl -fsSL https://api.github.com/repos/nushell/nushell/releases/latest | grep '"tag_name"' | cut -d'"' -f4)
          NU_VER="${NU_TAG#v}"
          ARCHIVE="nu-${NU_VER}-x86_64-unknown-linux-gnu.tar.gz"
          curl -fsSL "https://github.com/nushell/nushell/releases/download/${NU_TAG}/${ARCHIVE}" -o /tmp/nu.tar.gz
          tar -xzf /tmp/nu.tar.gz -C /tmp
          sudo cp "/tmp/nu-${NU_VER}-x86_64-unknown-linux-gnu/nu" /usr/local/bin/nu
          nu --version

      - name: Clone public subgraphs from subgraphs.toml
        run: |
          cd "$HOME/cyber/cyberia-blog"
          nu -c '
            let decls = (open subgraphs.toml | get subgraph)
            $decls
            | where {|d| ($d.name? | default "") != "cyberia-blog"}
            | where {|d| ($d.archived? | default false) != true}
            | where {|d| ($d.orphan? | default false) != true}
            | where {|d| ($d."local-only"? | default false) != true}
            | where {|d| ($d.visibility? | default "public") == "public"}
            | each {|d|
              let name = $d.name
              let repo = ($d.repo? | default $d.name)
              let target = $"($env.HOME)/cyber/($name)"
              if not ($target | path exists) {
                print $"Cloning ($name) from ($repo)..."
                let url = $"https://github.com/cyberia-to/($repo).git"
                try {
                  ^git clone --depth 1 $url $target
                } catch {|e|
                  print $"skip ($name): ($e.msg)"
                }
              }
            }
          '

      - name: Install Rust
        run: |
          rustup update stable
          rustup default stable

      - name: Cache optica build
        uses: actions/cache@v4
        with:
          path: |
            /tmp/optica-target-cache
            ~/.cargo/registry
            ~/.cargo/git
          key: ${{ runner.os }}-optica-v4

      - name: Build optica
        run: |
          rm -rf "$HOME/cyber/optica"
          git clone --depth 1 https://github.com/cyberia-to/optica.git "$HOME/cyber/optica"
          if [ -d /tmp/optica-target-cache ]; then
            mv /tmp/optica-target-cache "$HOME/cyber/optica/target"
          fi
          cd "$HOME/cyber/optica" && cargo build --release
          cp -r "$HOME/cyber/optica/target" /tmp/optica-target-cache

      - name: Build site
        run: |
          cd "$HOME/cyber/cyberia-blog"
          nu scripts/build.nu --public-only \
            --optica "$HOME/cyber/optica/target/release/optica" \
            --output "$HOME/cyber/cyberia-blog/build"

      - name: Upload site artifact
        uses: actions/upload-artifact@v4
        with:
          name: cyberia-blog-site
          path: ~/cyber/cyberia-blog/build
          retention-days: 14

      - name: Deploy to cyberproxy
        if: github.ref == 'refs/heads/master' && env.CYBERPROXY_SSH_KEY != ''
        env:
          CYBERPROXY_SSH_KEY: ${{ secrets.CYBERPROXY_SSH_KEY }}
        run: |
          mkdir -p ~/.ssh
          echo "$CYBERPROXY_SSH_KEY" > ~/.ssh/id_ed25519
          chmod 600 ~/.ssh/id_ed25519
          ssh-keyscan -p 8333 -H 167.235.28.94 >> ~/.ssh/known_hosts
          rsync -az --delete -e "ssh -p 8333 -i ~/.ssh/id_ed25519" \
            "$HOME/cyber/cyberia-blog/build/" \
            "cyber@167.235.28.94:/var/www/html/cyberia.blog/"

Homonyms

cyber/.github/workflows/publish.yml

Graph