Tuesday, August 30, 2011

Bees Outside the Hive

It's going to be a buzzing Fall here at CloudBees. We hope to have the opportunity to connect with you when we emerge from the hive for these events:

- This Week! VMWorld – Aug 30-Sept 1, Las Vegas – come see us at Booth #664.

- Liferay West Coast Symposium – Sept 21 & 22, Anaheim, CA. We'll have a booth (number TBD) and our awesome Senior Product Manager Harpreet Singh will give a talk about continuous integration in the cloud.

- Jenkins User Conference (free!) – Oct 2, San Francisco – join the Bees as we support the very first Jenkins community conference on the Sunday before JavaOne. Also get the latest conference news on Twitter.

- JavaOne – Oct 3-6, San Francisco – we’ll be in Booth # 5509. We've also had several talks accepted, so keep an eye out for the schedule.
  • Why Java is an Ideal Platform for DevOps Automation – Michael Neale
  • What is a PaaS, After All? – Harpreet Singh and Spike Washburn
  • Continuous Integration with Jenkins – Kohsuke Kawaguchi
  • Jenkins Community Meetup – hosted by Kohsuke Kawaguchi and fellow Jenkins leader Andrew Bayer
- Devops Seminar – Oct 18, Penn State Great Valley, Pennsylvania, hosted by Chariot Solutions. Harpreet Singh will share the latest on Jenkins and Continuous Delivery.

- Devoxx - Nov 14-18, Antwerp – we don't have a booth, but we'll be buzzing about, and there are rumors of a CloudBees-hosted Drink-Up...

We also have several Mastering Continuous Integration with Jenkins training courses coming up:
  • Sept 23 – London (taught by Jenkins expert Stephen Connolly)
  • Oct 14 – Tokyo (taught by Jenkins founder Kohsuke Kawaguchi)
  • Nov 17 – San Francisco (taught by Jenkins founder Kohsuke Kawaguchi)
If you're in the neighborhood of any of these events, we really hope you'll come find us and say hello!
-- Lisa

Follow CloudBees:
Facebook Twitter

Monday, August 29, 2011

API Token in Jenkins REST API

In Jenkins 1.426, I added the API token support for the REST API.
This is motivated by the same reasons I've done the public key authentication support in Jenkins CLI. Namely, because the security implementation is completely pluggable, we need a uniform way for programs that want to interact with Jenkins to authenticate itself with Jenkins, regardless of whether Jenkins is using OpenID SSO, Active Directory, or anything else.
Starting with this version, every user automatically gets an API token. You can see this value from http://your.jenkins.server/me/configure. This page also allows you to get new API token as needed. It can be then submitted to Jenkins via BASIC authentication when making an HTTP request.
So hopefully this makes it a bit easier to develop programs that interact with Jenkins.
Now, while I was doing this, I started thinking that it'd be nice if we can unify the CLI authentication and the REST API authentication by using SSH public key authentication over SPNEGO. It won't be practical until most of the client-side libraries/tools support such implementation, but it seems a lot easier and flexible to deploy than HTTPS client authentication, and useful for all kinds of websites/webapps. All it takes is someone to define a GSSAPI binding for SSH key exchange. I'm hoping someone would make it happen!

Follow CloudBees:
Facebook Twitter

Friday, August 26, 2011

Jenkins Internal: Action and Its Subtypes

Action is one of the primary ways that plugins can use to enrich the build/project pages. This extension point has the longest history, and as such its meaning is somewhat confusing, and its use across places are somewhat inconsistent. This page attempts to clarify that.

What is Action?

The recurring UI pattern in Jenkins is to have a bunch of navigable links and command links to the left of the page. The extension point Action was born as a means to contribute custom entries here.

Three methods defined on Action are for obtaining information needed to render actions (icon, name of the link, and where it takes the user to.)

Action and URL space

Actions often want to define additional URL space into Jenkins to show information. For example, "test reports" action adds a whole bunch of subpages into Jenkins. To facilitate this common use case, Jenkins uses the Action.getUrlName() method.
For example, if the host object of Action (typically extends from Actionable) is at the URL /jenkins/foo/bar/, then Action that returns zot from the getUrlName() would be mapped to /jenkins/foo/bar/zot (and thus entire sub-space is available for this action to control. This is how you can have Action that show information.
In some other cases, actions just want to link to existing URL (perhaps even outside Jenkins.) getUrlName() javadoc explains how to do it.

Special views for the action host

Some host classes that host Action designate a specific view, and when such a view is defined, it gets pulled into the host object's page rendering. For example, AbstractBuild allows actions to define summary.groovy (or other languages), and when it is present, those views are merged into the top page of the build. For example, JUnit integration uses this to make the test report prominent.
See the javadoc of respective host classes for details. Similarly, some host classes define a marker interface that extends from Action in addition to define additional interaction with actions. See ProminentProjectAction for an example. See the subypes of Action for all such marker interfaces.

Transient and Persistent actions

Depending on the host, Action have different persistence semantics. In some hosts, such as AbstractBuild, actions are explicitly added (typically by BuildSteps that executed) and persisted along with it. In some other hosts, such as View, actions are assembled entirely from other configurations of the said object whenever it's changed and therefore not persisted. Still others have hybrid approach, such as AbstractProject, which supports some explicitly added actions as well as transient ones contributed from build steps and etc.
Unfortunately, the only way to really figure out which host behaves how is to look at the implementation of the getActions() method.
Transient actions can be discarded any moment, and new ones created to take the place of the old one. Therefore, it is not suitable to use it for synchronization, or for keeping other persisted records.
Persistent actions survive forever, until it's programmatically removed or the host object gets removed itself. So care must be taken to use 'transient' where appropriate. Those objects can be also used for synchronization.

Adding actions

How you insert your implementation of Action to Jenkins depends on the type of the host, and whether it's transient or persistent.
Persistent actions are almost always added via Actionable.addAction().
Transient actions are added via callback. You implement other extension points that can contribute transient actions, such as LabelAtomProperty, Builder, and Publisher, then your host will call your methods and expect you to return a list of transient actions. The host may do this every so often when it thinks it needs to update its transient actions.
More recently, we are introducing a series of Transient***ActionFactory, such as TransientViewActionFactory, so that transient actions can be contributed without implementing another stateful extension point like Builder. We hope to add such extension points for more host types.


Most actions are reigstered in one of the two ways described above, but there's a notable exception, which is RootAction. This is a stand-alone extension point of its own, that you'd put @Extension, and these gets automatically registered as transient actions of the root Jenkins object. There's a variant of this called UnprotectedRootAction that is made accessible even to anonymous users without the read access to Jenkins.

Actions as inputs to build

Actions are also used as a parameter/input (in a broad sense of the word) to the build, as can be seen in Queue.schedule(...), because these actions get added to the newly created AbstractBuild and then it can be accessed from build steps. For example, ParametersAction is one such use of Action that's used to implement parameterized builds. Matrix Reloaded Plugin uses this mechanism similarly to remember what subset of the matrix build to execute.
There are several subtypes that allows this kind of actions to interact with the queue, such as FoldableAction and QueueAction.

Actions as the vehicle to keep information about builds

AbstractBuild is Actionable and it takes persisted actions. This is the primary means for plugins to attach any information to the build. This allows other plugins to use your action to understand what has happened (such Action are also used to render information, the primary purpose of the Action class.)
Even if your plugin doesn't use such record by itself, we highly recommend you do it, because that opens up interesting possibilities to build on top of your work.

Invisible actions

As can be seen in the section above, some use of actions emerge over the time that goes beyond the original purpose of extending the UI, and therefore it became convenient to be able to have actions that aren't visible in the UI at all. InvisibleAction is the convenient base class for such purposes. For example, InterruptedBuildAction records how the build was aborted, but this is currently invisible, so it extends from InvisibleAction.

Follow CloudBees:
Facebook Twitter

The State of JUC

Without a doubt the first Jenkins User Conference (JUC) will be a huge success. We are only into our third week of registration and have well over 140 attendees signed up for this free event.

Join members of the growing Jenkins community for one jam-packed day of talks, demos, trainings, and lightning talks. This is a great opportunity for Jenkins developers to meet and ask the experts questions, meet fellow Jenkins users, and expand the social network.

We are excited to have knowledgeable Jenkins speakers from well-known SMBs to enterprises - coming together to share their insights and expertise of the present and future technology.  Including a special keynote by Jenkins creator, Kohsuke Kawaguchi.  Kohsuke will address the state of Jenkins, he plans to present the history of the project, its status today, strategic plans for the future, and its influence as well as impact to the community and users.

Become a sponsor or speaker - to learn more and to attend Jenkins User Conference, visit JUC .

Looking forward to seeing you there!
- Alyssa

Follow CloudBees:
Facebook Twitter

Wednesday, August 24, 2011

A Hive Full of Resources

Our mission here in the CloudBees hive is to support developers who want to focus on writing code, not managing and maintaining servers -- through both innovative products and useful information. We hope you find these new podcasts, conference talks, and other nuggets on the Cloud and Jenkins helpful…

Cloud Conference Talks
Jenkins Conference Talks
Jenkins & Nectar
Bringing Eclipse to the Cloud
CloudBees in General
Keep an eye on our Twitter feed for the latest...

Sacha & the CloudBees Team

Follow CloudBees:
Facebook Twitter

Monday, August 22, 2011

MongoHQ and CloudBees Announce Partnership

By Jason McCay, Co-Founder, MongoHQ
MongoHQ, the leading provider of cloud-based MongoDB data hosting and services, is excited to announce a new partnership with CloudBees! The partnership extends our data platform into the rich and innovative Java community. This new relationship will allow developers in the CloudBees environment to more easily and efficiently build out and scale the data layer of their Java applications.
CloudBees provides the only develop-to-deploy cloud Platform as a Service (PaaS) for Java and serves thousands of Jenkins customers. The CloudBees platform provides everything developers need to quickly and easily develop and deploy applications in the cloud — without having to purchase, configure and maintain hardware, and without having to program applications for a specific underlying infrastructure service (IaaS).
When we started MongoHQ, our primary goal was to make it easy for developers to use MongoDB as the data layer for their applications, allowing them to focus on developing code instead of the complexities of managing their data layer in the cloud. CloudBees shares this same core belief when it comes to a development platform, and has pioneered it within the Java community. We are excited to partner and offer MongoDB on the fast-growing and powerful CloudBees platform.
CloudBees users can add MongoHQ-provisioned databases through the CloudBees Ecosystem. The MongoHQ add-on is expected to be available to the community on or before Oct. 1, 2011.
We are very excited to join this growing community as a partner! ~ The MongoHQ Team
Jason McCay is a guest contributor to the CloudBees blog. Jason, along with Ben Wyrosdick, started MongoHQ in 2009 after discovering the advantages of using MongoDB in applications he and Ben were building. Jason has three boys, is an Ironman and resides in Mountain View, CA. 

Follow CloudBees:
Facebook Twitter

Friday, August 19, 2011

Liferay, Red Hat Join as Sponsors for Jenkins User Conference

Greetings Jenkins Users!
Things are coming together nicely for the Jenkins User Conference (JUC) that will be
held on October 2, which is the day before the start of the JavaOne conference in San
Francisco. I am excited about the value of this conference for the Jenkins
Community. It will bring together Jenkins users from all over the world and will be a
great forum for all of us to share best practices, tips 'n tricks, and other expertise -
all with Jenkins as the common denominator.
As the conference takes shape, I am extremely excited about two additional
sponsors who have stepped up to join CloudBees in sponsoring JUC. They are:
Liferay and Red Hat.

Liferay is one of the most popular open source Java based portals in the market.
They have a huge developer community and user community. Liferay makes
extensive use of Jenkins as their development platform. Expect to see a session from
them describing their use-case and the lessons they have learned in setting up their
Jenkins environment.
You can read about Liferay's Jenkins environment on one of Brian Chan's blogs.
Liferay runs about 800 backend and 200 Selenium tests on every commit (you need
an account on their system to view it). For Liferay users, here is another blog that
lists how to run Liferay jobs on Jenkins.
As an aside, not many know that Paul Hinz, CMO of Liferay, was at Sun Microsystems
and was a pivotal decision maker in funding Kohsuke's hobby project called Hudson.
Paul was also pivotal in releasing Hudson as a product within the now defunct
GlassFish Portfolio, which I worked on. Considering the legacy Paul has with Hudson
- and by default, Jenkins - we should all feel honored to have Paul and Liferay
support JUC!
The third sponsor that has stepped forward is Red Hat. What can I say about Red
Hat - is there anyone who doesn't know them? Red Hat has been running
Jenkins/Hudson for years and has made their Jenkins QA page publicly visible. A
funny personal note is that when I worked at Sun and was managing marketing for
the Glassfish Portfolio, I used to show this page to potential Hudson clients and
mention that Redhat JBoss uses GlassFish Portfolio :). Sometimes it's a small world
- especially in the development space - competitors become friends and friends
become competitors! Along with CloudBees and Liferay, it feels really great to see
Red Hat endorse JUC, as well.
However, what is most exciting for me is that these two companies are leaders in
their respective markets and are also hard-core users of Jenkins. To have the
established user community endorse JUC - and actively participate in it - is
Watch the JUC page. Over the next few weeks as we fill in session content and round
out the agenda, there will be lots of new information posted. More sponsors are in
the works and we have some other exciting plans for you!
So if you haven't already, be sure to register for JUC. Thanks to sponsors such as
CloudBees, Liferay, and Red Hat, it is FREE!

See you at JUC!

Follow CloudBees:
Facebook Twitter

Tuesday, August 16, 2011

WELCOME: André Pino as VP of Marketing

One of CloudBees' objectives for 2011 is to build a robust and talented executive team that can successfully drive our growth.

As part of this, a few weeks back we announced that Jim McLoughlin was joining as our VP of Sales. Today, I am thrilled to report that André Pino is joining as our VP of Marketing.

André has worked for companies such as Bluestone (remember the J2EE application server bought by HP?), HP, Segue, iPhrase and more recently as an analyst for Forrester Research. Those various roles gave him great expertise in working with developers, middleware, SaaS businesses and analyzing fast growing markets.

André will be working from our headquarters in Massachusetts.

Welcome André!


P.S.: We should have more talent joining our ranks pretty soon, so stay tuned.

Sacha Labourey, CEO
Follow CloudBees:
Facebook Twitter

Monday, August 15, 2011

Deploying PHP Applications on CloudBees

CloudBees focus on being the bleeding edge PaaS for Java, but please remember "Java" is used here as the name of the virtual machine, not the language. The JVM is able to host a large set of languages, including some unexpected ones like PHP!

Quercus is a PHP emulation / compiler for the JVM, that will bring Java power and facilities to PHP developers. Thanks to Java platform they can benefit enhanced performance (with the adequate compiler license), server features like session clustering  and connection pooling, or even integrate with Java libraries and services.

I just setup a proof of concept deployment for a PHP application. I choose phpBB to get something more significant than just a simple HelloWorld.

First step is naturally to setup a repository for code. I've used github so that you can browse this sample project. Quercus is distributed as a war archive, I just expanded it at repository root so that I just can add PHP files like I'd do for an old-school FTP deployment on my favorite LAMP hosting. 

I've added the adequate cloudbees-web.xml, so that my application can be deployed on RUN@cloud and access my MySQL database :


  <resource name="jdbc/phpbb" auth="Container" type="javax.sql.DataSource">
    <param name="username" value="phpBB" />
    <param name="url" value="jdbc:cloudbees />
    <param name="password" value="*********"://phpbb" />

With a single line configuration in web.xml, Quercus will automagically redirects all mysql_connect() calls to my JDBC datasource, so that RUN@cloud connection pool will be used under the hood.

A simple Ant build script is used to assemble the war archive for deployment :

<project name="quercus-cloudbees" default="war" basedir=".">
  <description> deploying a php app on cloudbees </description>
  <target name="war">
    <war destfile="build/application.war" basedir="${basedir}"
          excludes="build/**/*" />
I've also created a Jenkins job on DEV@cloud and used the CloudBees deployer plugin to push the application on RUN@cloud as a continuous deployment process. You can see the application running at http://quercus.nicolas.cloudbees.net/

Note : by default, phpBB is using a configuration file stored on local file system, that will not be persisted as RUN@cloud is dynamically assigning physical resources, so I had to hack a preconfigured config.php script.

Follow CloudBees:
Facebook Twitter

Enterprise IT and the Hungry Beast

A guest post by Daniel Nolan, FlexiGroup Ltd.

We like to think of ourselves as full-time software professionals. Yet how much of our time and energy is actually focused on producing really great software? That is, software that delights and excites our customers?

If you work within an entrepreneurial, scrappy, and ambitious sales-driven organisation the answer is possibly "not enough".

If you are a key team member with the experience and deep technical knowledge of how your vast, sprawling array of systems tick, upon which said organisation depends to earn a crust, the answer is probably "very little".

Chances are, your days are instead filled with a mixture of activities that have very little to do with the art of software development. This may include investigating production system performance or reliability issues, installing and configuring your software on servers, checking the status of builds and testing environments. Or if it's a particularly bad week perhaps you're just watching your inbox, waiting for the next outage notification to arrive.

I was inspired by this statement in a recent CloudBees blog post regarding the recent launch of its CloudBees Ecosystem program:

"If you are a developer, you should be focusing on building a great application, not busy setting up an application server or a 3rd party solution."

In enterprise IT, we spend far too much time prepping and maintaining our infrastructure instead of meeting the needs of our customers and fighting the accrual of technical debt as our systems grow evermore complex. It's a battle that rages within many entrepreneurial organisations as they feverishly attempt to fight the decay of system code, whilst managing to satisfy the insatiable appetite of the hungry beast we call "the business".

This is where I can see that the new breed of cloud-based services starting to emerge could make a big difference to the way we work: if we're willing to leave the running of our systems to those who are already equipped to handle its needs, we can finally start to free ourselves up from the burden of self-hosting. As a development organisation, we can also hope to achieve greater autonomy by being able to configure and administer systems ourselves, without going through IT or a separate group.

Making an entry into this brave new world can be a daunting prospect, but I've found hosting source control in the cloud to be a great place to start: Distributed Version Control Systems (DVCS) such as Git and Mercurial are really built from the ground up for this purpose and I can now forget about the state of the repository and can easily access it anywhere I go. The next logical step to offload DevOps management hassle is to start doing continuous integration in the cloud and begin to host your applications systems with a Platform as a Service (PaaS) provider like CloudBees.

Making great software is a challenging business to be in, and having to respond to the ever-changing needs of the business can bring out the street-fighter in all of us. But if we keep a clear focus on doing the things that we're best at and find a way to offload or automate everything else, then we have a much better chance of staying on top of our customer's needs and keeping that hungry beast satisfied.

Based in Sydney, Australia, Daniel Nolan (Twitter: @dan3r3) is a Senior Developer with FlexiGroup Ltd and has 15 years experience in Software Development. He is passionate about fostering 'virtuous cycles' in software development by promoting Continuous Integration and Software Configuration Management practices within teams. He divides his time between his work at FlexiGroup and his new software startup, ReadyRoll, which aims to provide a better workflow for refactoring SQL Server databases. You can read more of Dan's insights on his blog.

The fine print:
The views expressed above including any references to third-party products or services are Daniel's and not those of FlexiGroup Limited.

Follow CloudBees:
Facebook Twitter

Tuesday, August 9, 2011

Jenkins User Conference: Call for Papers Deadline Sept 1, 2011

Jenkins CI is the leading open-source continuous integration server. Built with Java, it provides over 300 plug-ins to support building and testing virtually any project.

The first Jenkins User Conference is delighted to announce its Call for Papers is now open. We are looking forward to receiving amazing proposals from infrastructure experts to novice developers in the Jenkins community. Get creative! Share and showcase your unique approach to utilizing Jenkins technology.

We do not encourage overt marketing pitches. We encourage breakout sessions, work shops, good case studies with transferable, tangible lessons and other topics like:
  • Plug-in development

  • Specific Jenkins applications that solve testing/building problems in particular areas: mobility, enterprise/web/cloud applications, and UI testing...

  • Jenkins best practices, tips and tricks

  • Beyond Java (i.e Jenkins with PHP, Ruby, etc)

  • Lightning talks (10 min)

Submit your proposal as soon as possible to juc-cfp@cloudbees.com
Call for Papers closes Sept 1, 2011. Sessions are 45 minutes long. In your proposal please include:
  • Name

  • Job Title

  • Email

  • twitter ID

  • Company/website

  • Paper Title

  • Audience Level (General, Beginner, Intermediate, Advance)

  • Paper Abstract

  • Your Bio

Looking forward to your proposals. Read more about the conference and register now!
- Alyssa Tong

Follow CloudBees:
Facebook Twitter

Friday, August 5, 2011

Jenkins User Conference: Proposed Agenda

My previous blog post mentioned about the upcoming Jenkins User Conference. Given that, time is of the essence (proposal is for October 2nd) – here is proposed schedule – we will like the organization committee to actively discuss this (Organization Committee: juc-oc-ext@cloudbees.com.

We are considering running 2 tracks. Track 1 will be a technical track while track 2 will be a mix of technical and partner tracks. 

The agenda may look like:
  • 9am – 10am: Registration, coffee/tea
  • 10am – 10:45am: Kohsuke Kawaguchi: Welcome, Opening Keynote
  • Tracks Split (T1 = Track 1, T2 = Track 2)
  • 10:45am – 11:30: Session (T1, T2)
  • 11:30 – 12:15pm: Session (T1 , T2)
  • 12:15pm – 1:15pm: LUNCH
  • 1:15pm – 2:00pm: Session (T1, T2)
  • 2:00pm – 2:45pm: Session (T1, T2)
  • 2:45pm – 3:30pm: BREAK
  • 3:30pm – 4:15pm: Session (T1, T2)
  • 4:15pm – 5:00pm: Session (T1, T2)
  • 5:00pm – 6:00pm: Lightening talks, Hackathon?, Training (for e.g: how to write a plugin from Kohsuke)
  • 6:00pm – 7:00pm: Socialize
As I mentioned – this is a proposed agenda and we will really like to hear from the community on what they would like. Please send an email to juc-oc-ext@cloudbees.com for feedback on the agenda. If you like to join the OC – please shoot me/Kohsuke an email.

- Harpreet
(hsingh @ cloudbees . com)

Follow CloudBees:
Facebook Twitter

Thursday, August 4, 2011

Jenkins User Conference

CloudBees Motivation:

At CloudBees, Jenkins is everywhere - from people to our products. For example, Kohsuke is in the virtual office next to me, I talk with Ryan (Jenkins as a Service guy), Stephen (weather icons guy) and Paul (Jenkins on private clouds guy) daily; we have built Nectar (our supported version of Jenkins) and DEV@cloud which takes Jenkins into the cloud. We actively contribute source code and encourage Kohsuke to continue in his endeavor of making Jenkins even better.

Internally, we have talked about doing something more than supporting Kohsuke and contributing code - contributing directly to the Jenkins community. Over the past few months, this taken the shape of trying to do a"Jenkins User Conference" - giving the community an opportunity to congregate, present the latest thinking and share some beers.


We approached the governance board early this week with a proposal to do the conference. The governance board has given us their approval. We would like active engagement from the community. CloudBees will be sponsoring a part of the conference (and we will actively look for others) - any surpluses from the conference will be given back to the community for future events (or infrastructure!). CloudBees has dedicated a few folks to help make the logistics of the conference happen.

Where & When: San Francisco, Oct 2nd 2011.

The idea is to do this on the Sunday before JavaOne (October 2nd).

Why JavaOne? Given that a number of Java developers and Jenkins users will be flying into San Francisco - it just seemed natural to do it at this time.

What's Next?

  • Given the extremely tight deadlines (8 weeks) to set this up. We have setup an Organization Committee made up of couple of members from the Jenkins governance board and from CloudBees. Alias is juc-oc-ext @ cloudbees . com.
  • We invite other community members who want to actively contribute to join the Organization Committee.
  • One of the first things that we want the OC to do quickly is determine the agenda and format. (My follow up blog will indicate a proposed agenda)
  • We will be opening for sponsors soon - we are currently working on sponsorship details. Please let me know if you or your organization would be interested in helping to sponsor this event. We would like the event to be free to attendees.
  • We are immediately opening for a Call for Papers. Talks will likely be 30 minutes in length. We are considering doing a lightening talk session for plugin developers with talks that are 10 minutes in length as well. Email alias for submission: juc-cfp @ cloudbees.com
  • Naming the conference? Suggestions are welcomed! I propose JUC (pronounced juice) :-)
Last words:

I was the Product Manager for Hudson at Sun Microsystems and pushed to offer Hudson as a product while at Sun. I now handle DEV@cloud and Nectar. I have always felt that I needed to directly contribute to the community and I am very excited to see this taking shape. The Jenkins product and the community ROCK (Kohsuke you do too ;-)).

Please shoot me an email - if you want to contribute or have questions and concerns.

- Harpreet Singh, Senior Director of Product Management
(hsingh @ cloudbees . com)

Follow CloudBees:
Facebook Twitter