I had to play little bit with code coverage to fill data to sonar.
Here is simple settings
- download this generated maven repo
- fill sonar properties in pom.xml file
mvn clean compile install sonar:sonar
This creates jacoco.exe file with results in html.
It is always preferred to use https instead of http (specially when using passwords and so on…)
We have switched our SonarQube (tool for Continuous Inspection of code quality) to use https for security reasons. Anyway I have noticed that Jenkins stop sending new quality codes to our sonar. When I have checked the logs I have seen this stacktrace:
Exception in thread "main" java.lang.IllegalStateException: Fail to request server version at org.sonar.runner.Bootstrapper.getServerVersion(Bootstrapper.java:73) at org.sonar.runner.Runner.checkSonarVersion(Runner.java:220) at org.sonar.runner.Runner.execute(Runner.java:150) at org.sonar.runner.Main.execute(Main.java:84) at org.sonar.runner.Main.main(Main.java:56) Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:150) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1584) at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:174) at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:168) at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:848) at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:106) at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:495) at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:433) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:877) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1089) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1116) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1100) at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:402) at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:166) at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:951) at java.net.URLConnection.getContent(URLConnection.java:682) at sun.net.www.protocol.https.HttpsURLConnectionImpl.getContent(HttpsURLConnectionImpl.java:406) at org.sonar.runner.Bootstrapper.remoteContent(Bootstrapper.java:125) at org.sonar.runner.Bootstrapper.getServerVersion(Bootstrapper.java:71) ... 4 more
So here you can see that Jenkins has problem to “handshake” ssl certificate.
follow these steps:
Add Trusted Keystore
Run “InstallCert.java” on server (where you run your https service). something like java InstallCert localhost:443 -> press “1” when asked. It will add your “localhost” as a trusted keystore, and generate a file named “jssecacerts“.
[user@sonar ~]$ java InstallCert localhost:443 Loading KeyStore /usr/java/jdk1.6.0_37/jre/lib/security/cacerts... Opening connection to localhost:443... Starting SSL handshake.. Server sent 1 certificate(s): 1 Subject CN=Unknown, OU=Unknown, O=Vendavo, L=Unknown, ST=Czech republic, C=CZ Enter certificate to add to trusted keystore or 'q' to quit:  1 Added certificate to keystore 'jssecacerts' using alias 'localhost-1'
I have removed most of the parts but the main parts are here:
a) press 1 when assked – you agree to add certificate for this domain into keystore
b) it created jssecacerts file
Verify Trusted Keystore
Run same command again 🙂 (this is full export – removed hashed data)
[mchowaniok@sonar ~]$ java InstallCert sonar.vmcz.vendavo.com:443 Loading KeyStore jssecacerts... Opening connection to sonar.vmcz.vendavo.com:443... Starting SSL handshake... No errors, certificate is already trusted Server sent 1 certificate(s): 1 Subject CN=Unknown, OU=Unknown, O=Vendavo, L=Unknown, ST=Czech republic, C=CZ Issuer CN=Unknown, OU=Unknown, O=Vendavo, L=Unknown, ST=Czech republic, C=CZ sha1 md5 Enter certificate to add to trusted keystore or 'q' to quit:  q KeyStore not changed
copy jssecacerts file into java/jre/lib/security folder (I had to done it under sudo )
[user@sonar ~]$ sudo cp jssecacerts /usr/java/default/jre/lib/security/
verify it 🙂 in my case, run Jenkins job and verify data are uploaded to Sonar.
After I have lost several years of my pictures I started to use Google Picasa – to get unlimited space you have to agree that your pictures have to have specific pixel size.
Few month back – yahoo, specifically Flickr – changed few “key” settings – specifically size for your pictures – now you get 1TB.
So I was thinking to use Flickr as second backup place and pictures can keep their original size – they don’t need to be shrinked.
What needs to be done:
- have account on Flickr
- change default privacy settings for your account
- change privacy settings for search engines (I want to hide them from search engines)
- now upload your pictures 🙂
- If you got your pictures in Picasa, use picasa2flickr addon and sent your pictures to Flickr directly from Picasa
In my previous post about exceeding my limits I have mentioned 2 trips from several I did in 2013. I would like to share lessons I learnt specially for development. You will see that there is not much difference in mistakes in software development as well in mistakes in diving or reaching top of mountains.
Let’s share some problems we have encounter:
During descent from Mount Blanc we (group of 3 people) decided we are not going to be tight together anymore, as it give us more freedom and we don’t have wait on each other. On the way back one of my friend felt over the cliff and by miracle was lucky to not fall down in gulf. We can’t say same about his DLSr camera. We have lost our best pictures from ascent and top of Mount Blanc, anyway my friend is still with us enjoys life like never before.
During my so far most deep dive, we swum almost all time against current and we have spent more air than we thought. On the way up, we had to use extra safety air bottles we left in case of emergency, because we run out of air in our bottles.
These things I don’t share with everyone usually, because instead of learning lessons from my mistakes it scares them to actually not do anything.
And how it connects with development ?
- If possible do pair programming and TDD – best exercise can be learnt on coderetreat
- Never ever in name of “freedom, not enough time, not enough budget,…” write code without tests – tests are your safety “rope” which holds your code together and can saves you life
- Always count on unexpected events (have extra hours, budget, resource hidden which you can pull on when needed) – this is like having extra safety bottles with air in water
- Did you notice that both situation happened after “reaching goal” on the way back ? – Finishing your software and putting into production is our main goal, but be ready to expect the “real” problems when real users starts using it
- Good preparation is the key for success – be tough on yourself – think about the most worst cases and expect even worse situations
These are just few things – happy new year 2014 and be ready to exceed your limits in next coming year.
Year 2013 was great year where I had opportunity to exceed my limits above but as well at bottom 🙂
Ascent on Mount Blanc 4810 m
Preparations started about 6months ahead. It was tough, what ever I thought it takes in reality it was at least 2x harder. But it is worth it.
When you get there, you are full emotions – happiness, completely tired, feeling freezing cold and at same time enjoying shining sun on your face.
Your biggest enemy is weather and your physical condition. Here are few tips:
- you can book bed in cottage no earlier than 30 days before ascent. Booking starts at 7:00am and usually ends at 7:10 am – So many people wants to book at same time.
- To fight against weather good tip is to book whole week (every day) – when it gets closer, and you have better idea about weather for given days, you start cancelling your bookings
- To fight against physical condition, high altitude sickness ,…. – there was one thing I was telling to myself for 2 days. One more step , One more step. It doesn’t matter how long it takes, but you will get there.
Descent to -52m in ocean
I love to dive. Very soon I figure out that normal diving is “not enough” for me 🙂 In 2013 I have spent week on safari in Egypt. Everyday up to 4 dives. Last day I asked my friends I wanted to go down, deeper then usual 30m. I have to say, that my friends are technical divers (sometimes they do over -100m dives). So I did -52m in Egypt. 52m is not much, anyway when you so deep it takes you almost half hour to get properly in surface – that’s why maximum for non technical divers is recommended around -20m
It was very good year with many good things and few bad things as well, but these 2 shows that you can do always more than you thought. With good preparation you can manage many things, you can overcome fear, achieve more.
About month ago I decided that we should have session of CodeRetreat also in Ostrava. On December 14th there is Global Code Retreat Day, so I started to look whether we can make it in that short time and what is needed.
I had one condition – I can prepare everything, but I want to be participant during all sessions. So I have asked my friend Daniel Kolman to join us as CodeRetreat Master.
And what are my feelings ? It was great time, spent with great people, doing great things (learning how to code better and learning from others). I would like to point out 2 sessions:
- do session, where you can’t talk – basically you write test and hand over your keyboard to your pair body to write code. That was strange to program without communication
- write test with implementation inside the test (no object class, just the implementation) -> continue with other test with implementation inside that test. If you start having duplications extrat them into separate method and continue with other tests and when it make sense extrat it into separate class. => that was really interesting how hard was it for me to stop thinking about classes objects and concentrate only on implementation inside of tests.
Here is quick intro to CodeRetreat:
- consists of 6 sessions where you write code for Game of Life and after each session you delete your code and start from scratch again
- you do always pair programing
- you concentrate on quality of code and not just to “make it working” – that’s why you delete your code, as it is not important how much you have done, but rather how good you have done it
- each session concetrate on different tasks – concetrate on good naming of your method and fields, every method can have maximum of 4 lines, TDD (starts with test which fails and then implementation which confirms that test will pass), pair programing – do ping -pong coding (one write test, mate writes implementation) ….
- you have very good options to learn new languages – in our case we had (java, groovy, clojure, scala, php, C#,…)
here are few pictures from Ostrava CodeRetreat
Big thanks goes to Daniel Kolman and others who helped us with it.
Next task I wanted to do is to create jenkins on openshift and be able to build projects from github or bitbucket. It sounds simple, but you will face quite a lot of issues. So let’s do it:
Create Jenkins gear
- this creates gear called “jenkins” using jenkins-1 application and includes ssh wrapper “git-ssh” which helps you to overcome ssh obstacles (openshift forbids to write into .ssh folder) – as you will see we will have to solve this problem several times later as well
Set jenkins slave
jenkins needs other linux machines (called slaves) to use them for building, anyway we don’t have so much free gears, so we will use jenkins itself for it.
Manage Jenkins -> Configure System -> # of executors = 1 Labels = put here anything
Generate ssh key
Add public key (id_rsa.pub) to github & bitbucket
search github/ bitbucket how to do it 🙂
Add new Jenkins Job
- in begining I mentioned that home folder is not writeable, so we are encountering several problems, like ssh can’t write into .ssh , maven can’t write into .m2 folder and so on. The only solution is to point all applications into writeable folder which is $OPENSHIFT_DATA_DIR
- Because of the problem above, you can’t use standard maven jobs but you have to use “Build a free-style software project”
- Source Code Management: git: your git url (i.e. firstname.lastname@example.org:majecek/testtest.git)
- Build: (add Execute shell): enter:
- this creates setings.xml file and when runing maven commands – you have to specify where is the settings file
- check this site for more info
- next step is to add hooks in github/bitbucket – so after push in repo they will trigger jenkins to create new build – again check it in github/bitbucke or this site
Feed Sonar with data from Jenkins
This was quite a problem. I have to admit that I didn’t finish it, but found solution. Here is another problem, sonar and specially it’s mysql runs on different gear and openshift by default don’t allow any connection between gears nor from outside.
- install Sonar plugin into jenkins, add URL & jdbc url and all info needed
- I had to add into Sonar Aditional properties: -DSONAR_USER_HOME=$OPENSHIFT_DATA_DIR
- this is again, because sonar can’t write into home directory, so you have to point to writeable folder
Now you will face problem, that jenkins can’t connect to MYSQL DB – as said above, this is because gears can’t communicate to each other. There are 2 solutions:
- set up SONAR as scaled application – scalled applications can communicate to each other
- setup ssh port forwarding between applications
You can read more here.