| 
 | 1 | +use std::env::var;  | 
 | 2 | +use std::fs;  | 
 | 3 | +use std::io::{Read, Write};  | 
 | 4 | +use std::os::unix::net::UnixStream;  | 
 | 5 | +use std::os::unix::prelude::*;  | 
 | 6 | +use std::process::{Command, Stdio};  | 
 | 7 | + | 
 | 8 | +fn main() {  | 
 | 9 | +    let slug = var("BUILD_REPOSITORY_ID").unwrap();  | 
 | 10 | +    let key = var("GITHUB_DEPLOY_KEY").unwrap();  | 
 | 11 | + | 
 | 12 | +    let socket = "/tmp/.github-deploy-socket";  | 
 | 13 | +    run(Command::new("ssh-agent").arg("-a").arg(&socket));  | 
 | 14 | +    while UnixStream::connect(&socket).is_err() {  | 
 | 15 | +        std::thread::sleep(std::time::Duration::from_millis(5));  | 
 | 16 | +    }  | 
 | 17 | + | 
 | 18 | +    let mut decode = Command::new("base64")  | 
 | 19 | +        .arg("-d")  | 
 | 20 | +        .stdin(Stdio::piped())  | 
 | 21 | +        .stdout(Stdio::piped())  | 
 | 22 | +        .spawn()  | 
 | 23 | +        .unwrap();  | 
 | 24 | +    decode  | 
 | 25 | +        .stdin  | 
 | 26 | +        .take()  | 
 | 27 | +        .unwrap()  | 
 | 28 | +        .write_all(&key.as_bytes())  | 
 | 29 | +        .unwrap();  | 
 | 30 | +    let mut key = Vec::new();  | 
 | 31 | +    decode.stdout.take().unwrap().read_to_end(&mut key).unwrap();  | 
 | 32 | +    decode.wait().unwrap();  | 
 | 33 | + | 
 | 34 | +    let path = "_the_key";  | 
 | 35 | +    fs::write(&path, key).unwrap();  | 
 | 36 | +    fs::set_permissions(&path, fs::Permissions::from_mode(0o600)).unwrap();  | 
 | 37 | +    run(Command::new("ssh-add")  | 
 | 38 | +        .arg(&path)  | 
 | 39 | +        .env("SSH_AUTH_SOCK", &socket));  | 
 | 40 | +    fs::remove_file(&path).unwrap();  | 
 | 41 | + | 
 | 42 | +    let sha = var("BUILD_SOURCEVERSION").unwrap();  | 
 | 43 | +    let msg = format!("Deploy {sha} to gh-pages");  | 
 | 44 | + | 
 | 45 | +    drop(fs::remove_dir_all(".git"));  | 
 | 46 | +    run(Command::new("git").arg("init"));  | 
 | 47 | +    run(Command::new("git")  | 
 | 48 | +        .arg("config")  | 
 | 49 | +        .arg("user.name")  | 
 | 50 | +        .arg("Deploy from CI"));  | 
 | 51 | +    run(Command::new("git").arg("config").arg("user.email").arg(""));  | 
 | 52 | +    run(Command::new("git").arg("add").arg("."));  | 
 | 53 | +    run(Command::new("git").arg("commit").arg("-m").arg(&msg));  | 
 | 54 | +    run(Command::new("git")  | 
 | 55 | +        .arg("push")  | 
 | 56 | +        .arg(format!("[email protected]:{}", slug ))  | 
 | 57 | +        .arg("master:gh-pages")  | 
 | 58 | +        .env("GIT_SSH_COMMAND", "ssh -o StrictHostKeyChecking=no")  | 
 | 59 | +        .env("SSH_AUTH_SOCK", &socket)  | 
 | 60 | +        .arg("-f"));  | 
 | 61 | +}  | 
 | 62 | + | 
 | 63 | +fn run(cmd: &mut Command) {  | 
 | 64 | +    println!("{cmd:?}");  | 
 | 65 | +    let status = cmd.status().unwrap();  | 
 | 66 | +    assert!(status.success());  | 
 | 67 | +}  | 
0 commit comments