Bamboo Üzerinde Spring Boot Uygulamasının Derlenmesi

Kerem Yaldız
Kod Gemisi
Published in
4 min readJun 12, 2018

--

Bu yazıda Bamboo üzerinde örnek bir Spring Boot projesi continuous integration sürecine sokulacaktır.

Anlatımda Git, Maven ve Spring Boot hakkında giriş seviyesinde bilgi sahibi olunduğu varsayılmaktadır.

Neden Bamboo?

Neden basit bir şekilde kendimiz derlemeyip, Bamboo gibi bir servis kullanıyoruz?

Bu sorunun çok güzel bir cevabı var, Continuous Integration.

Continuous Integration

Continuous integration, geliştiricilerin kodlarını günde birkaç kez ortak bir depoda birleştirmelerini gerektiren bir geliştirme yöntemidir. Diğer bir deyişle yazılım geliştirme sürecinin, belirli bir rutin içinde uygulamanın çalışacağı ortamlar için her kod değişikliğinde ortamlara uygunluğunun denenmesi ve test edilmesidir. Bu sistem sayesinde hatalar erken tespit edilir ve hatalara erken müdehale edilmesi sağlanır.

Artılar:

  • Otomatik testler sayesinde production’a giden bug miktarı azalır.
  • Bütün entegrasyon sorunları erken çözüldüğü için sürüm çıkarmak kolaylaşır.
  • Ufak değişikliklerin bile etkisi hemen fark edilir, bir sorunla karşılaşıldığı anda düzeltilmesi kolaylaşır.
  • Sunucular yüzlerce testi saniyeler içinde yapabildiği için test maliyeti azalır.
  • Otomatik testler sayesinde testlerin çalıştırılmasına ayrılacak vakit geliştirmelere yönlendirilir.

Gereksinimler:

  • Her yeni özellik için otomatikleştirilmiş testler yazılması gerekir.
  • Continuous integration sunucusuna ihtiyaç vardır.
  • Geliştiricilerin yaptığı değişikliklerin mümkün olduğunca sık merge edilmesi gerekir.
  • Continuous integration sunucusunun kurulum ve bakımının yapılması gerekir.

Örnek Proje

Bu örnekte Bamboo ve Bitbucket’ın birbirlerine entegre bir şekilde çalıştığı, Bitbucket’a atılacak projenin deposunun Bamboo ile linklendiği ayrıca her iki uygulama tarafında da projelerin düzgün bir şekilde oluşturulduğu kabul edilmiştir.

Spring Boot Projesi Oluşturma

Projenizi oluşturmak istediğiniz dizine geçin ve projeyi oluşturmak için takip eden komutu çalıştırın:

mkdir -p src/main/java/hello

Bu dizinin altında aşağıdaki standart proje yapısını göreceksiniz.

.
└── src
└── main
└── java
└── hello

Bulunduğunuz dizinde pom.xml dosyasını oluşturup içini aşağıdaki gibi doldurun:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>org.springframework</groupId>
<artifactId>gs-rest-service</artifactId>
<version>0.1.0</version>

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.2.RELEASE</version>
</parent>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

<properties>
<java.version>1.8</java.version>
</properties>


<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

<repositories>
<repository>
<id>spring-releases</id>
<url>https://repo.spring.io/libs-release</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-releases</id>
<url>https://repo.spring.io/libs-release</url>
</pluginRepository>
</pluginRepositories>
</project>

pom.xml hakkında detaylı bilgiye bu linkten ulaşabilirsiniz.

src/main/java/hello/ dizininde Greeting.java adıyla bir dosya oluşturup içini aşağıdaki gibi doldurun:

package hello;

public class Greeting {

private final long id;
private final String content;

public Greeting(long id, String content) {
this.id = id;
this.content = content;
}

public long getId() {
return id;
}

public String getContent() {
return content;
}
}

src/main/java/hello/ dizininde GreetingController.java adıyla bir dosya oluşturup içini aşağıdaki gibi doldurun:

package hello;

import java.util.concurrent.atomic.AtomicLong;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class GreetingController {

private static final String template = "Hello, %s!";
private final AtomicLong counter = new AtomicLong();

@RequestMapping("/")
public Greeting greeting(@RequestParam(value="name", defaultValue="World") String name) {
return new Greeting(counter.incrementAndGet(),
String.format(template, name));
}
}

src/main/java/hello/ dizininde Application.java adıyla bir dosya oluşturup içini aşağıdaki gibi doldurun:

package hello;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}

Bu işlemleri gerçekleştirdikten sonra adımların başarılı bir şekilde tamamlandığını doğrulamak için takip eden komutu çalıştırın:

mvn clean package

Eğer işlemler başarılı bir şekilde tamamlandıysa aşağıdakine benzer bir çıktı vermesi beklenmektedir:

-------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] -------------------------------------------------------------
[INFO] Total time: 12.438 s
[INFO] Finished at: 2018-06-11T17:43:05+03:00
[INFO] -------------------------------------------------------------

Programı test etmek için takip eden komutu çalıştırın:

java -jar target/gs-rest-service-0.1.0.jar

Projenin Bitbucket’a Pushlanması

Bitbucket’a pushlanmasına gerek olmayan dosyalar için .gitignore dosyası oluşturup içini aşağıdaki gibi doldurun:

target/
pom.xml.tag
pom.xml.releaseBackup
pom.xml.versionsBackup
pom.xml.next
release.properties
dependency-reduced-pom.xml
buildNumber.properties
.mvn/timing.properties
# Avoid ignoring Maven wrapper jar file (.jar files are usually ignored)
!/.mvn/wrapper/maven-wrapper.jar

Projenin root dizinine geçip, projeyi Bitbucket’a pushlamak için kalın harflerle yazılmış kısmı kendinize uyarlayarak takip eden komutları sırasıyla satır satır çalıştırın:

git init
git add --all
git commit -m "Initial Commit"
git remote add origin ssh://git@dev.domain.com/project/repository.git
git push -u origin master

Bamboo Planının Oluşturulması

  • Üst menü çubuğuna gelip, Create > Create plan butonuna basın.
  • Yapılandırma sayfasında ayrıntıları tamamlayın.
  • Yeni bir depoyu linkleyin veya öncesinde linklenmiş bir depoyu seçip Configure plan butonuna basın.
  • Source Code Checkout task’inde Repository kısmından linklenmiş depoyu seçip Save butonuna basın.
  • Add task butonuna basıp Maven 3.x’i seçin.
  • Goal kısmını clean package yapın.

Projede test kodu yok, eğer sizin de test kodunuz yoksa “The build will produce test results.” ifadesinden tiki kaldırın ve Save butonuna basın.

Planı oluşturmak için Create butonuna basın.

Planın Aktif Edilmesi

Plan details sekmesine geçin. Save butonuna basın.

Sonuç

Deneme amaçlı kaynak kodunuzda programın çalışmasını bozmayacak bir değişiklik yapıp Bitbucket’a pushlayın.

Pushlama işlemi Bamboo planını tetikleyecek ve taskler işletilecektir.

Sonuç olarak Bitbucket’a yapılan her pushlama işlemi Bamboo planını tetikleyecek ve build işlemi gerçekleştirecektir.

Continuous integration sayesinde herhangi bir hata sonucu anlık olarak görülebilecek ve bu sayede hata üzerine eklemeler yapılmadan düzeltilmesi sağlanacaktır. Bunun yanında sık sık yapılan merge işlemi sayesinde geliştiriciler değişikliklere daha kolay uyum sağlayacaktır.

--

--