You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 15 Next »

Fineract-CN projects depend on each other. The simplest option is to build all projects locally so artifacts are published to local maven repository and available from there.

Sometomes still there is need to only work with a single project and resolve the other fineract-cn-* dependencies from public repository. Also in order for continous integration (Travis-ci.com) to build a specific project it needs that all the dependencies are available.

JFrog Artifactory has been set up to host these artifacts in https://mifos.jfrog.io/mifos/. Maven Central would not be suitable for the task as it doesn't hold "work-in-progress" snapshots.

In this artifacotry there are two repositories:

  • libs-release to hold releases
  • libs-snapshot to hold snapshot builds. Snapshot builds are updated every time something new gets pushed to git (and the build passes)

In order to use snapshot builds one needs to have following line in repositories list:

repositories {
  jcenter()
  mavenLocal()
  maven { url 'https://mifos.jfrog.io/mifos/libs-snapshot/' }
}

How snapshots are built by Travis

All apache/fineract-cn-* repositories are configured to be built with Travis-CI.com. Whenever something is pushed to a repository travis tries to run gradle build on it. Travis also detects the branch name that the changes were pushed to.

Changes pushed/merged to "develop" branch

If travis detects that the changes were pushed to "develop" branch and build doesn't fail then it uploads the new snapshot artifacts to the public repository. You can pick them up the same way as artifacts deployed to local Maven:

dependencies {
compile(
[group: 'org.apache.fineract.cn', name: 'reponame', version: '0.1.0-BUILD-SNAPSHOT']
)
)

Changes pushed/merged to other branches (not "develop")

Travis builds and publishes the snapshots out of all branches but for branches not named "develop" it overwrites the version of the artifact (defined in build.gradle) with "branchname-SNAPSHOT". If you want to point some other project to branch "myfeaturebranch" then you need to use:

dependencies {
compile(
[group: 'org.apache.fineract.cn', name: 'reponame', version: 'myfeaturebranch-SNAPSHOT']
)
)

Handling pull requests

Travis also builds all pull requests but for security reasons it doesn't upload any artifacts built from pull requests.

How releases work

If a release is tagged in github then Travis-CI builds that as a release and uploads it under different repoKey - release artifacts are available at https://mifos.jfrog.io/mifos/libs-release

Travis and Artifactory setup

Following instructions are useful if you want to set up a new project or change existing setup.

Configure a new fineract-cn-* project to upload artifacts to artifactory

  • in build.gradle / shared.gradle:
    1. If not already, add snapshots repository to list of repositories so it looks like this:
    2. repositories {
      jcenter()
      mavenLocal()
      maven { url 'https://mifos.jfrog.io/mifos/libs-snapshot/' }
      }
    3. In list of plugins add plugin:

      id "com.jfrog.artifactory" version "4.9.5"

    4. In publishing → publications → projectnamePublification
      replace
        version project.version 
      with: 
        version project.findProperty('externalVersion') ?: project.version


    5. Underheath publishing block add instructions for the new plugin:
      artifactory {
      contextUrl = System.getenv("ARTIFACTORY_URL")
      publish {
      repository {
      repoKey = project.findProperty('artifactoryRepoKey')
      username = System.getenv("ARTIFACTORY_USER")
      password = System.getenv("ARTIFACTORY_PASSWORD")
      }

      defaults {
      publications (TODO) // add projectnamePublification here
      }
      }
      }
      artifactoryPublish.dependsOn('clean','publishToMavenLocal')


  • Into shared.gradle (if exists) add 

    task artifactoryPublish {
    group 'all'
    dependsOn gradle.includedBuild('api').task(':artifactoryPublish')
    dependsOn gradle.includedBuild('library').task(':artifactoryPublish')
    dependsOn gradle.includedBuild('test').task(':artifactoryPublish')
    // add other modules
    }
  • Add travis banner to top of README.md (replace reponame with correct value):
    [![Build Status](https://api.travis-ci.com/apache/fineract-cn-reponame.svg?branch=develop)](https://travis-ci.com/apache/fineract-cn-reponame)
  • Add travis.sh (copy-paste from other project that is already included)
  • Add .travis.yml - travis-ci.com looks for this file

    language: java
    sudo: false
    jdk:
    - openjdk8
    install: true
    script: "./travis.sh"
    env:
    global:
        - BUILD_SNAPSHOTS_BRANCH=travis  
    - ARTIFACTORY_URL=https://mifos.jfrog.io/mifos
    - ARTIFACTORY_USER=travis-ci1
    - secure: "see below chapter Encrypt Artifactory password"

Encrypt Artifactory password


You need command line travis client.

travis encrypt --com -r apache/fineract-cn-reponame ARTIFACTORY_PASSWORD=enter-password-here

copy the encrypted secure value to .travis.yml

Verify

  • If you push to "develop" branch the code is uploaded to https://mifos.jfrog.io/mifos/libs-snapshot-local/org/apache/fineract/cn/<projectname>/0.1.0-BUILD-SNAPSHOT/<projectname>-0.1.0-BUILD-SNAPSHOT.jar
  • If you push to any other branch, for example to branch "myfeature" then the code is uploaded to https://mifos.jfrog.io/mifos/libs-snapshot-local/org/apache/fineract/cn/<projectname>/myfeature-SNAPSHOT/<projectname>-myfeature-SNAPSHOT.pom
  • If you create a realease in Github (out of any branch), and name it let's say "1.2.0.0" then travis builds the code and uploads to https://mifos.jfrog.io/mifos/libs-release-local/org/apache/fineract/cn/<projectname>/1.2.0.0/<projectname>-1.2.0.0.jar

Design principles

  • travis.sh file should not hold any project-specific configuration (should be the same in every repo)

JFrog Artifactory configuration

  • Common Maven repository configuration is used - this means:
    • Snapshots are uploaded to "libs-snaptshots-local" and releases to "libs-release-local"
    • There are two virutal repositories libs-snapshots (includes libs-snapshots-local) and libs-release (includes libs-release-local)
  • Remote repositories are deleted (as we don't want the reposiotry to be a proxy for JCentral)
  • A user "travis-ci" has been configured who has rights to upload artifacts but it has no UI access
    • the password for this user is encrypted with travis public keys (travis creates a public key for each individual reposiotry) and set into .travis.yml
  • Anonymous access has been enabled for anyone to download the artifacts
  • No labels