Skip to content

PRJenkinsSetupFirewall

Josh Hursey edited this page Jan 18, 2017 · 11 revisions

Setting up a Jenkins Pull Request Builder from behind a firewall

If you have testing equipment behind a firewall then it can be difficult to use the Open MPI Community Jenkins server since it will not be able to reach your machines from the open internet.

Requirements

  • You will need to setup a Jenkins master internally to your site. We will call this (Internal)Jenkins.
  • Must be able to test internally without any external entity having access and visibility on the test environment or (Internal)Jenkins.
  • (Internal)Jenkins must be able to connect to the GitHub API.
  • (Internal)Jenkins must be able to report build result to the open internet so other developers can view details of build failures.
  • (Internal)Jenkins must be able to connect to the BuildNode, where you will run the tests.

Setup

Setting up the BuildNode

Setting up the environment on the BuildNode

# Setup a log file touch $PATH_TO_OMPI_TESTS/log/your-log.md # Push this file to the Gist site # Make sure to note the URL returned, as you will need the ID for later # --public makes it publicly available, remove that option if you want it private $PATH_TO_OMPI_TESTS/jenkins/bin/gist.pl --tokenfile $TOKENFILE -cmd create --public $PATH_TO_OMPI_TESTS/log/your-log.md # Setup the configuration for the relay system. Start with the template. cp $PATH_TO_OMPI_TESTS/jenkins/bin/config.inc.sample $PATH_TO_OMPI_TESTS/jenkins/bin/config.inc $EDITOR $PATH_TO_OMPI_TESTS/jenkins/bin/config.inc # Setup a crontab entry for the following script crontab -e # This script removes gists older than N days (Defined in config.inc) 0 8 * * * $PATH_TO_OMPI_TESTS/jenkins/bin/clean-history.sh $PATH_TO_OMPI_TESTS/jenkins/bin/config.inc

Setting up the (Internal)Jenkins Job

  • Define a default sha1 parameter and a default parameter that will be the default URL pushed to GitHub when the Jenkins job starts.
 -> "This build is parameterized" -> "String Parameter" -> Name: sha1 -> Default Value: master -> Description: -> "String Parameter" -> Name: GISTURL -> Default Value: https://gist.github.com -> Description: Initial URL for HitHub 
  • (Suggested) Additional Behaviors
    • Wipe out repository & force clone
  • Configure the Pull Request Builder
 -> "GitHub Pull Request Builder" -> Define "Admin list" (add at least your bot account) -> "Advanced" -> Trigger phrase (replace 'ibm' with your org): .*bot:(ibm:)?retest.* -> Skip build phrase: .*((\[skip\W+ci\])|(\[ci\W+skip\])|(bot:notest)).* -> Crontab line (poll every 5 min): H/5 * * * * -> White list: open-mpi (your bot name) -> List of organizations. Their members will be whitelisted.: open-mpi -> (check) Build every pull request automatically without asking (Dangerous!). -> Whitelist Target Branches: master -> Poll SCM -> Schedule (should match earlier crontab line): H/5 * * * * -> "Trigger Setup" -> "Update commit status during build" # The "Commit Status Context" is what is displayed to GitHub next to the build status. # Usually seen as the "Details" link # So if you have multiple Jenkins jobs that run on a PR then distinguish them via # this string. Commit Status Context: YOUR-COMPANY-CI # This will be the URL posted next to the "Commit Status Context" on GitHub. # This environment variable is set in a .properties.txt file (in next step) Commit Status URL: ${GISTURL} Commit Status Build Triggered: Commit Status Build Started: -> "Build Status Messages" (optional if you want it to add a comment on failed builds) Build Result: Failure Message: "Test Failed! Some friendly string to put in the Comment field of the PR" 
  • "Build" (in this order)
    • "Set build status to pending on GitHub commit"
    • "Execute shell"
#!/bin/bash -xe # This script does a few things: # - Post a placeholder file to Gist (we need the ID for later) # - Save the GISTID to a .properties.txt file (so we can update it later) # - Save the GISTURL to the .properties.txt file (so we can push it to GitHub later) # - Create a .env.sh with some information that we will need in the "Execute shell" phase below source $PATH_TO_OMPI_TESTS/jenkins/bin/pre-build.sh
  • "Inject environment variables"
    • Properties File Path: .properties.txt
  • "Execute shell"
#!/bin/bash -xe # Pick up the environment variables from the earlier "Execute shell" phase source $WORKSPACE/.env.sh #----------------------- # Redirect output to the file exec > >(tee -i output.txt) exec 2>&1 # Jenkins will fail this script at the point it has a non-zero exist status # so we need a file to see if we made it through the CI script successfully. touch $WORKSPACE/.in-progress.txt # Run your CI script here... # If we get here then everything is fine, so remove the file. rm $WORKSPACE/.in-progress.txt
  • "Post-build Actions"
    • "Execute a set of scripts"
      • "Build Steps" -> "Execute shell"
#!/bin/bash -x # This script does a few things # - Checks for the existance of the $WORKSPACE/.in-progress.txt to determine success/failure # - Updates the logfile $PATH_TO_OMPI_TESTS/log/your-log.md # - Pushes the log file to Gist # - Pushed the output file to Gist # - If the build was successful then the last N lines are sent (defined in config.inc) # - If the build was not successful then the entire output is sent source $PATH_TO_OMPI_TESTS/jenkins/bin/post-build.sh
  • "Set build status on GitHub commit"
    • Leave "Content" blank, Select "FAILURE" in "Result on failure"

Assorted notes (work in progress - not formatted correctly)

...

Clone this wiki locally