Using JFrog Artifactory for repeatable Flogo builds

Using JFrog Artifactory for repeatable Flogo builds

Look at this cute little frog! (Photo by Pixabay)

Developers want to build better software faster, I don’t think any developer would disagree on that and with the release of Go 1.11 a long-awaited (and debated) feature became available, Go modules! With that amazing addition to the Go language, you can now really have repeatable builds because all the information is put in a single go.mod file and during the build the Go compiler will get all the right versions for you.

If you haven’t caught up on Go modules yet, there is a really great talk by Paul Jolly on YouTube. Note, this only works with Go 1.11 and above…

Now that we can have easier repeatable builds, should every developer at every build have to pull down the dependencies and store them locally or is there a different way to do this? I think the engineers at JFrog have a good answer with their latest updates of Artifactory, which now supports Go modules. So when I saw their Go challenge, I couldn’t pass on a good opportunity to see if a hummingbird can join the gopher and frog on their boat.

Setting up Artifactory and JFrog CLI

To start with Artifactory, just visit their downloads page and choose one of the options to get started. For my setup I’ve opted to run the Docker container on my Intel NUC (yes… I manage that one machine 😅). To run the container, simply run:

# Pull the container
$ docker pull docker.bintray.io/jfrog/artifactory-pro:latest
# Run it and expose port 8081
$ docker run -d -p 8081:8081 --name=artifactory docker.bintray.io/jfrog/artifactory-pro:latest

After a few seconds you can open up the homepage of Artifactory (like http://localhost:8081) and follow the on-screen instructions to set up the Artifactory server. If you need a license for the Pro features, you can very easily sign up for a trial. Be sure to select Go as one of the options (or, as an admin, add a new local repository of type Go).

Next, you’ll need the, Go based, JFrog CLI. For macOS users, downloading the CLI is as easy as running brew install jfrog-cli-go. Users of other Operating Systems can download a binary or an installer from that page as well. Now that is installed, you’ll need to configure it to talk to your server:

# Run this command and answer the prompts
$ jfrog rt config
Artifactory server ID: myServer
Artifactory URL: http://localhost:8181/artifactory
User: admin
Password/API key: <your password>

Converting a Flogo app to use modules

Converting a Go app to use modules is relatively easy. According to most of the Go engineers you should be able to simply clone a Git repo to a path outside of your $GOPATH and running a few commands. Personally, I’ve learned a great deal from a blog post by Roberto Selback. To get started, I decided to use one of the Flogo apps I built using the Go API; my InvoiceService

The first step is to initialize the Go modules:

cd /path/to/source
go mod init github.com/TIBCOSoftware/apiscout/samples/invoiceservice-go/main

The next step is to populate the go.mod file with all the module dependencies that the app has. You could do that manually, but let’s face it… you probably want a command for that. So, run go mod tidy which inserts all dependencies into the file and generates a go.sum file with the commit hashes of those dependencies.

Building the app

Now the app works with Go modules (yay! 😁), but every developer will have to get the code from GitHub. With a two commands you can make sure that all those dependencies are checked into Artifactory.

# Upload the modules to Artifactory and build an app
$ jfrog rt go build go --url=http://localhost:8081/artifactory --user=admin --password=<your password>

To build an app and make sure the modules are downloaded from Artifactory, you’ll need to set the new GOPROXY environment variable.

export GOPROXY="http://admin:<your password>@localhost:8081/artifactory/api/go/go"
go build

So now we have a repeatable build, no matter if the sources change, or worse, disappear (😱) from the version control system while you’re working on the code! 🎉

Wrapping up

So if you haven’t done so yet, take the JFrog Go challenge and see how awesome hummingbirds, gophers and frogs can work together! I’d love to know your thoughts! Let me know by dropping me a note here or on Twitter.

Disclaimer: I’m not an Artifactory expert, so if I can improve my workflow please let me know!

Let's connect

If you have any questions or comments, feel free to drop me a note on Twitter!