From db71bfdc66a69465d79f9ee5899f7d468c4783cc Mon Sep 17 00:00:00 2001 From: Jake Shadle Date: Thu, 6 Apr 2023 12:26:02 +0200 Subject: [PATCH] Vendor gh-pages script (#505) * Embed gh-pages script * Oops * Need to checkout * Fix ordering * Return to only pushing on main --- .github/workflows/ci.yaml | 5 +-- scripts/build-pages.rs | 67 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+), 2 deletions(-) create mode 100644 scripts/build-pages.rs diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index d6e7173a..7a9cc6bb 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -112,7 +112,7 @@ jobs: steps: - uses: actions/checkout@v3 - env: - version: "0.4.21" + version: "0.4.28" run: | set -e curl -L https://github.com/rust-lang-nursery/mdBook/releases/download/v${version}/mdbook-v${version}-x86_64-unknown-linux-gnu.tar.gz | tar xzf - @@ -227,6 +227,7 @@ jobs: runs-on: ubuntu-22.04 if: github.event_name == 'push' && github.ref == 'refs/heads/main' steps: + - uses: actions/checkout@v3 - name: Download book uses: actions/download-artifact@v1 with: @@ -240,7 +241,7 @@ jobs: # rebuild. - name: Push to gh-pages # Uses a rust script to setup and push to the gh-pages branch - run: curl -LsSf https://git.io/fhJ8n | rustc - && (cd gh-pages && ../rust_out) + run: rustc scripts/build-pages.rs && (cd gh-pages && ../build-pages) env: GITHUB_DEPLOY_KEY: ${{ secrets.GITHUB_DEPLOY_KEY }} BUILD_REPOSITORY_ID: ${{ github.repository }} diff --git a/scripts/build-pages.rs b/scripts/build-pages.rs new file mode 100644 index 00000000..03fb7916 --- /dev/null +++ b/scripts/build-pages.rs @@ -0,0 +1,67 @@ +use std::env::var; +use std::fs; +use std::io::{Read, Write}; +use std::os::unix::net::UnixStream; +use std::os::unix::prelude::*; +use std::process::{Command, Stdio}; + +fn main() { + let slug = var("BUILD_REPOSITORY_ID").unwrap(); + let key = var("GITHUB_DEPLOY_KEY").unwrap(); + + let socket = "/tmp/.github-deploy-socket"; + run(Command::new("ssh-agent").arg("-a").arg(&socket)); + while UnixStream::connect(&socket).is_err() { + std::thread::sleep(std::time::Duration::from_millis(5)); + } + + let mut decode = Command::new("base64") + .arg("-d") + .stdin(Stdio::piped()) + .stdout(Stdio::piped()) + .spawn() + .unwrap(); + decode + .stdin + .take() + .unwrap() + .write_all(&key.as_bytes()) + .unwrap(); + let mut key = Vec::new(); + decode.stdout.take().unwrap().read_to_end(&mut key).unwrap(); + decode.wait().unwrap(); + + let path = "_the_key"; + fs::write(&path, key).unwrap(); + fs::set_permissions(&path, fs::Permissions::from_mode(0o600)).unwrap(); + run(Command::new("ssh-add") + .arg(&path) + .env("SSH_AUTH_SOCK", &socket)); + fs::remove_file(&path).unwrap(); + + let sha = var("BUILD_SOURCEVERSION").unwrap(); + let msg = format!("Deploy {sha} to gh-pages"); + + drop(fs::remove_dir_all(".git")); + run(Command::new("git").arg("init")); + run(Command::new("git") + .arg("config") + .arg("user.name") + .arg("Deploy from CI")); + run(Command::new("git").arg("config").arg("user.email").arg("")); + run(Command::new("git").arg("add").arg(".")); + run(Command::new("git").arg("commit").arg("-m").arg(&msg)); + run(Command::new("git") + .arg("push") + .arg(format!("git@github.com:{}", slug)) + .arg("master:gh-pages") + .env("GIT_SSH_COMMAND", "ssh -o StrictHostKeyChecking=no") + .env("SSH_AUTH_SOCK", &socket) + .arg("-f")); +} + +fn run(cmd: &mut Command) { + println!("{cmd:?}"); + let status = cmd.status().unwrap(); + assert!(status.success()); +}