Implement the sh-step as an example for how step libraries might work

The packaging isn't there yet, but at least the scaffolding of how the native
steps will be invoked is here.
This commit is contained in:
R Tyler Croy 2020-10-16 22:01:40 -07:00
parent 57f002a58d
commit 6ab574560e
7 changed files with 163 additions and 17 deletions

43
Cargo.lock generated
View File

@ -251,7 +251,7 @@ dependencies = [
"lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
"nom 5.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
"rust-ini 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.117 (registry+https://github.com/rust-lang/crates.io-index)",
"serde-hjson 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_json 1.0.56 (registry+https://github.com/rust-lang/crates.io-index)",
"toml 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)",
@ -389,7 +389,7 @@ dependencies = [
"otto-eventbus 0.1.0",
"parking_lot 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
"pretty_env_logger 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.117 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_json 1.0.56 (registry+https://github.com/rust-lang/crates.io-index)",
"smol 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)",
"tungstenite 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
@ -696,8 +696,8 @@ dependencies = [
"async-tungstenite 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
"futures 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_derive 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.117 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_derive 1.0.117 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_json 1.0.56 (registry+https://github.com/rust-lang/crates.io-index)",
"smol 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)",
"tungstenite 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
@ -825,7 +825,7 @@ dependencies = [
"log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
"otto-eventbus 0.1.0",
"pretty_env_logger 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.117 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_json 1.0.56 (registry+https://github.com/rust-lang/crates.io-index)",
]
@ -834,8 +834,8 @@ name = "otto-eventbus"
version = "0.1.0"
dependencies = [
"log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_derive 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.117 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_derive 1.0.117 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_json 1.0.56 (registry+https://github.com/rust-lang/crates.io-index)",
"uuid 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
]
@ -966,7 +966,7 @@ dependencies = [
"log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
"otto-eventbus 0.1.0",
"pretty_env_logger 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.117 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_json 1.0.56 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_yaml 0.8.13 (registry+https://github.com/rust-lang/crates.io-index)",
"uuid 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
@ -1172,10 +1172,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "serde"
version = "1.0.114"
version = "1.0.117"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"serde_derive 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_derive 1.0.117 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
@ -1192,7 +1192,7 @@ dependencies = [
[[package]]
name = "serde_derive"
version = "1.0.114"
version = "1.0.117"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"proc-macro2 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)",
@ -1207,7 +1207,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"itoa 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
"ryu 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.117 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
@ -1225,10 +1225,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"dtoa 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
"linked-hash-map 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.117 (registry+https://github.com/rust-lang/crates.io-index)",
"yaml-rust 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "sh-step"
version = "0.1.0"
dependencies = [
"serde 1.0.117 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_yaml 0.8.13 (registry+https://github.com/rust-lang/crates.io-index)",
"tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "sha-1"
version = "0.8.2"
@ -1357,7 +1366,7 @@ name = "toml"
version = "0.5.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"serde 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.117 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
@ -1460,7 +1469,7 @@ version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.117 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
@ -1746,9 +1755,9 @@ dependencies = [
"checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403"
"checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
"checksum serde 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)" = "9dad3f759919b92c3068c696c15c3d17238234498bbdcc80f2c469606f948ac8"
"checksum serde 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)" = "5317f7588f0a5078ee60ef675ef96735a1442132dc645eb1d12c018620ed8cd3"
"checksum serde 1.0.117 (registry+https://github.com/rust-lang/crates.io-index)" = "b88fa983de7720629c9387e9f517353ed404164b1e482c970a90c1a4aaf7dc1a"
"checksum serde-hjson 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6a3a4e0ea8a88553209f6cc6cfe8724ecad22e1acf372793c27d995290fe74f8"
"checksum serde_derive 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)" = "2a0be94b04690fbaed37cddffc5c134bf537c8e3329d53e982fe04c374978f8e"
"checksum serde_derive 1.0.117 (registry+https://github.com/rust-lang/crates.io-index)" = "cbd1ae72adb44aab48f325a02444a5fc079349a8d804c1fc922aed3f7454c74e"
"checksum serde_json 1.0.56 (registry+https://github.com/rust-lang/crates.io-index)" = "3433e879a558dde8b5e8feb2a04899cf34fdde1fafb894687e52105fc1162ac3"
"checksum serde_test 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)" = "110b3dbdf8607ec493c22d5d947753282f3bae73c0f56d322af1e8c78e4c23d5"
"checksum serde_yaml 0.8.13 (registry+https://github.com/rust-lang/crates.io-index)" = "ae3e2dd40a7cdc18ca80db804b7f461a39bb721160a85c9a1fa30134bf3c02a5"

View File

@ -6,4 +6,5 @@ members = [
"eventbus-cli",
"eventbus-inmemory",
"processors/travis-ci",
"stdlib/sh",
]

1
stdlib/sh/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
target/

10
stdlib/sh/Cargo.toml Normal file
View File

@ -0,0 +1,10 @@
[package]
name = "sh-step"
version = "0.1.0"
authors = ["R. Tyler Croy <rtyler@brokenco.de>"]
edition = "2018"
[dependencies]
serde_yaml = "~0.8.13"
serde = {version = "~1.0.117", features = ["derive"]}
tempfile = "~3.1.0"

13
stdlib/sh/README.adoc Normal file
View File

@ -0,0 +1,13 @@
= sh step
The `sh` step is a fundamental building block and can effectively execute
arbitrary scripts passed in by the user.
.Example parameters file passed to entrypoint
[source,yaml]
----
---
parameters:
script: 'ls -lah'
----

47
stdlib/sh/manifest.yml Normal file
View File

@ -0,0 +1,47 @@
# This manifest captures the basic functionality of the Jenkins Pipeline `sh`
# step
---
description: |
The `sh` step executes a shell script within the given execution context
# The entrypoint tells the Otto agent which actual binary to use when
# executing.
#
# This should be something that
entrypoint:
path: bin/sh-step
# Multiarch tells the agent that this should be executed on all platforms. In
# which case case it may be "blindly" invoked.
#
# Non-multiarch steps will be attempt to be invoked with
# `${entrypoint.path}-${arch}-${vendor}-${system}-${abi}` similar to how
# Rust manages target triples: https://doc.rust-lang.org/nightly/rustc/platform-support.html
multiarch: false
parameters:
script:
required: true
type: string
description: |
Runs a Bourne shell script, typically on a Unix node. Multiple lines are accepted.
An interpreter selector may be used, for example: `#!/usr/bin/perl`
Otherwise the system default shell will be run, using the `-xe` flags (you can specify `set +e` and/or `set +x` to disable those).
encoding:
description:
type: string
required: false
label:
description:
type: string
required: false
returnStatus:
description:
type: boolean
required: false
returnStdout:
description:
type: boolean
required: false

65
stdlib/sh/src/main.rs Normal file
View File

@ -0,0 +1,65 @@
/*
* A very simple step which just invokes a shell script with some flags
*/
use serde::Deserialize;
use std::fs::File;
use std::io::{stderr, stdout, Write};
use std::process::Command;
use tempfile::NamedTempFile;
#[derive(Clone, Debug, Deserialize)]
struct Config {
parameters: Parameters,
}
#[derive(Clone, Debug, Deserialize)]
struct Parameters {
script: String,
encoding: Option<String>,
label: Option<String>,
#[serde(rename = "returnStatus")]
return_status: Option<bool>,
#[serde(rename = "returnStdout")]
return_stdout: Option<bool>,
}
fn main() -> std::io::Result<()> {
let args: Vec<String> = std::env::args().collect();
if args.len() != 2 {
panic!("The sh step can only accept a single argument: the parameters file path");
}
let file = File::open(&args[1])?;
match serde_yaml::from_reader::<File, Config>(file) {
Err(e) => {
panic!("Failed to parse parameters file: {:#?}", e);
},
Ok(config) => {
// Create a file inside of `std::env::temp_dir()`.
let mut file = NamedTempFile::new()?;
writeln!(file, "{}", config.parameters.script)
.expect("Failed to write temporary file for script");
let output = Command::new("/bin/sh")
.arg(file.path())
.output()
.expect("Failed to invoke the script");
stdout().write_all(&output.stdout).unwrap();
stderr().write_all(&output.stderr).unwrap();
if output.status.success() {
return Ok(());
}
else {
std::process::exit(output.status.code().expect("Failed to get status code of script"));
}
},
}
}