Code Monkey home page Code Monkey logo

popper's Introduction

Popper Popper

Downloads Build Status codecov Join the chat at https://gitter.im/systemslab/popper slack CROSS

Popper is a tool for defining and executing container-native testing workflows in Docker. With Popper, you define a workflow in a YAML file, and then execute it with a single command. A workflow file looks like this:

steps:
- id: dev-init
  uses: docker://rikorose/gcc-cmake:gcc-9
  runs: [sh, -uexc]
  args:
  - |
    rm -rf build/
    cmake -DCMAKE_BUILD_TYPE=Release -S . -B build

- id: build
  uses: docker://rikorose/gcc-cmake:gcc-9
  runs: [cmake, --build, build/, --parallel, '4']

- id: test
  uses: docker://rikorose/gcc-cmake:gcc-9
  dir: /workspace/build/
  runs: [ctest]

Assuming the above is stored in a ci.yml file in the root of your project folder, this entire workflow gets executed by running:

popper run -f ci.yml

Running a single step:

popper run -f ci.yml build

Starting a shell inside the build step container:

popper run -f ci.yml build

Running on another engine (Podman):

popper run -f ci.yml -e podman build

See the examples/ folder for examples for tests for other languages, as well as other types of tests (integration, regresssion, etc.).

Installation

To install or upgrade Popper, run the following in your terminal:

curl -sSfL https://raw.githubusercontent.com/getpopper/popper/master/install.sh | sh

Docker is required to run Popper and the installer will abort if the docker command cannot be invoked from your shell. For other installation options, including installing for use with the other supported engines (Singularity and Podman), or for setting up a developing environment for Popper, read the complete installation instructions.

Once installed, you can get an overview and list of available commands:

popper help

Read the Quickstart Guide to learn the basics of how to use Popper. Or browse the Official documentation.

Features

  • Lightweight workflow and task automation syntax. Defining a list of steps is as simple as writing file in a lightweight YAML syntax and invoking popper run (see demo above). If you're familiar with Docker Compose, you can think of Popper as Compose but for end-to-end tasks instead of services.

  • An abstraction over container runtimes. In addition to Docker, Popper can seamlessly execute workflows in other runtimes by interacting with distinct container engines. Popper currently supports Docker, Singularity and Podman.

  • An abstraction over CI services. Define a pipeline once and then instruct Popper to generate configuration files for distinct CI services, allowing users to run the exact same workflows they run locally on Travis, Jenkins, Gitlab, Circle and others. See the examples/ folder for examples on how to automate CI tasks for multiple projects (Go, C++, Node, etc.).

  • An abstraction over resource managers. Popper can also execute workflows on a variety of resource managers and schedulers such as Kubernetes and SLURM, without requiring any modifications to a workflow YAML file. We currently support SLURM and are working on adding support for Kubernetes.

  • Aid in workflow development. Aid in the implementation and debugging of workflows, and provide with an extensive list of example workflows that can serve as a starting point.

What Problem Does Popper Solve?

Popper is a container-native workflow execution and task automation engine. In practice, when we work following the container-native paradigm, we end up interactively executing multiple Docker commands (docker pull, docker build, docker run, etc.) so that we can build containers, compile code, test applications, deploy software, among others. Keeping track of which docker commands we have executed, in which order, and which flags were passed to each, can quickly become unmanageable, difficult to document (think of outdated README instructions) and error prone.

On top of this, having the same workflow work in other environments (CI, K8S, etc.) is time-consuming and defeats the purpose of using containers (portability). The goal of Popper is to bring order to this chaotic scenario by providing a framework for clearly and explicitly defining container-native tasks. You can think of Popper as tool for wrapping all these manual tasks in a lightweight, machine-readable, self-documented format (YAML).

While this sounds simple at first, it has significant implications: results in time-savings, improves communication and in general unifies development, testing and deployment workflows. As a developer or user of "Popperized" container-native projects, you only need to learn one tool, and leave the execution details to Popper, whether is to build and tests applications locally, on a remote CI server or a Kubernetes cluster.

Contributing

Anyone is welcome to contribute to Popper! To get started, take a look at our contributing guidelines, then dive in with our list of good first issues.

Participation Guidelines

Popper adheres to the code of conduct posted in this repository. By participating or contributing to Popper, you're expected to uphold this code. If you encounter unacceptable behavior, please immediately email us.

How to Cite Popper

Ivo Jimenez, Michael Sevilla, Noah Watkins, Carlos Maltzahn, Jay Lofstead, Kathryn Mohror, Andrea Arpaci-Dusseau and Remzi Arpaci-Dusseau. The Popper Convention: Making Reproducible Systems Evaluation Practical. In 2017 IEEE International Parallel and Distributed Processing Symposium Workshops (IPDPSW), 1561โ€“70, 2017. (https://doi.org/10.1109/IPDPSW.2017.157)

PDF for a pre-print version available here. For BibTeX, click here.

popper's People

Contributors

akashrajr1 avatar anishhota avatar ankan17 avatar arshul avatar barbaradorame avatar cristiklein avatar dsfalves avatar edeediong avatar eltrufas avatar fernandadguez avatar franko1307 avatar fsr313 avatar gitter-badger avatar ivotron avatar jayjeetatgithub avatar jswig avatar maruthgoyal avatar michiboo avatar namnatulco avatar nicolecastillo avatar pcwilcox avatar qwofford avatar ricardo-he avatar rishiut avatar shumbo avatar ujjwalayyangar avatar vd44 avatar vipulchhabra99 avatar vivekr123 avatar wtraylor avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

popper's Issues

doc: rewrite domain-specific examples

For example, in the 'Popper in Data Science' guide:

This was very confusing for me. What is the goal of the CLI? Is it
someone looking at someone else's popper repo and wanting to re-run
an experiment? Is it me starting a new project?

What does popper experiment jupyter-bww myexperiment do? Pull
stuff from the internet, re-run stuff?

In general, the guides give the impression that in order to understand
it you need to already be familiar with Popper. Isn't the goal of a
guide to familiarize the reader with Popper?

Roadmap

Roadmap

Lowering the barrier to follow a sound experimentation protocol rooted in best open source software (OSS) practices.

Validating experimental results in research is time-consuming; it takes too long to recreate the environment where an experiment originally ran. Popper is an experimentation protocol and convention for organizing files in a version-control repository. The Popper CLI tool aids practitioners in following the convention, providing an easy way to generate experiments that are automatically re-executed and validated.

What do we need to do?

This issue is our roadmap. It's a place to start to investigate the myriad of issues that you can contribute to. Check out the different milestones listed below, but feel free to explore the issues by label too.

Please check out our contribution guidelines and code of conduct to help you get started, and the README for an overview if you haven't read it yet!


Upcoming milestones

Completed Milestones

wiki: create 30-60 min "hands-on" guide

use the "everything-in-the-cloud" template

create a tutorial with questions for the audience so they can realize how easy was to know information (e.g. parameters, flags, etc.) that otherwise it would have been hard to get.

cli: support multiple versions for a given tool

We currently assume that every run/validate dependency is dockerized
by the user. For example, if an experiment relies on ansible, the
run.sh command creates a container from an image of the
corresponding ansible version that the experiment depends on.

We can make this easier for users by providing a list of built-in
dependencies. For example, the user specifies in popper.yml:

run: ansible:2.1.2.0

And, as part of our project, maintain a list of images that we know
have the requested dependency. In the above, we would create a
container from an william/ansible:2.1-debian8 image, bind-mount the
experiment folder and inside the container, we'd invoke the run.sh
or validate.sh script. For dependencies that we don't know images
for, we can open new issues to create them as part of this project.

wiki: complete the data science example

  • Add link(s) to 'Intro to Popper' once it's done (see #6)
  • Add link to 'Tool agnosticism' once it's done (see #6)
  • Add link to '.popper.yml config' once it's done (see #11)
  • Add link to 'Folder Structure' explanation once it's done (see
    #10)
  • Add description of BWW notebook (what it consists off)
  • Finish with 'Adding More Datasets' section
  • Finish 'Generating Image Files for Later Usage' section
  • Finish 'Documenting Experiment' section

cli: add '--dependencies' flag to 'popper run'

Check dependencies when a --dependencies flag is passed to the check subcommand. The convention for checking things is the following:

Folders named after a tool (e.g. docker or terraform) have special meaning. For each of these, tests are executed that check the integrity of the associated files. For example, if we have an experiment that is orchestrated with Ansible, the associated files are stored in an ansible folder. When checking the integrity of this experiment, the ansible folder is inspected and associated files are checked to see if they are healthy. The following is a list of currently supported folder names and their CI semantics (support for others is in the making):

  • docker. An image is created for every Dockerfile.
  • ansible. YAML syntax is checked.
  • datapackages. Availability of every dataset is checked.
  • vagrant. Definition of the VM is verified.
  • terraform. Infrastructure configuration files are checked by running terraform validate.

All these will be added in a pluggable way (we need to define an API), so that other tools can be included.

cli: allow user to specify popperized repos

After #70 , popperized examples are in the github/popperized organization. This is the default organization that gets registered in .popper.yml. This issue will track the work needed to add support for adding other orgs or repos containing popper pipelines

wiki: describe "popperization" in Getting Started guide

Explain what does it mean that an experiment is popper-compliant. Add a diagram
of the workflow and how each step is implemented with current tools . Also
explain the concept of a "entrypoints" (visualize and run for experiments; build for papers).

Also explain why Popper is tool-agnostic and what are the basic properties that
make a tool popperizable.

cli: add basic tool checking capabilities

For every experiment in popper-templates, we can have the convention
of having a .popper.yml file that has a list of tools and versions.
When popper experiment add ... is invoked, the CLI quickly checks
for the existence of these and reports if they're available or not.

cli: add an --update-status flag to check subcommand

The output of popper check is one of the following three:

  • 1: failed to run experiment.
  • 0: ran experiment and validation successfully, but results are
    not valid.
  • 2: same as in above but results are valid.

When an --update-status flag is given, the status of the experiment
is updated at http://falsifiable.us. The <repo, experiment> pair that the
RESTful service expects is obtained explicitly from the user (--repo) flag and
experiment in question being executed.

cli: abstract templates repo

github is hard-coded in the CLI tool. We can abstract and add support for bitbucket and others, as well as for plain URLs

cli: experiment scaffolding

Add a popper experiment init subcommand that creates empty,
documented run.sh and validate.sh scripts.

Please explain the issue. The first line will become the title.

Trailing

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.