/
Bamboo CI/CD(부분 빌드)

Bamboo CI/CD(부분 빌드)



1. 사전 확인

1.1. 구현 환경

Virtual Machine

Oracle VM Virtual Box 6.0

OS

CentOS 7

JAVA

  1. 8

Bamboo

  1. 9.2

Bitbucket

  1. 4.2

Maven

  1. 5.4

Apache Tomcat

  1. 5.43

1.2. 가상 머신 사양

메모리

2 GB

프로세서

1 개

용량

8 GB

  • Bamboo server, Bitbucket server, Build server, Deploy server

  • 총 네 개의 가상 머신을 이용하였으며, 사양은 모두 동일합니다.

1.3. Remote agent 준비

각 빌드와 배포 서버를 위하여 Remote agent가 2개 필요합니다.

1.3.1 agent capabilities

 

 

1.4. Repository 준비 및 연결

 

1.4.1. BItbucket Repository

  • Bitbucket Repository 준비하기를 참고하여 Repository를 생성합니다.

 

1.4.2. Bamboo Linked Repository

  • Linked Repository 추가하기를 참고하여, 생성된 Bitbucket의 Repository를 Bamboo와 연결합니다.

 

 

2. 빌드

2.1. 빌드 프로젝트 생성

  • 빌드 프로젝트 생성하기를 참고하여 위와 같이 빌드 프로젝트를 생성합니다.

 

2.2. 빌드 플랜 구성

2.2.1. 빌드 디렉토리 구성

${bamboo.agentWorkingDirectory} : bamboo agent working directory + build + build.xml : ant build script + pom.xml : maven build script + target + temp : 빌드 대상 + src + exSjt : 테스트를 위한 프로젝트 ~/nexus + classes + lib : project library

2.2.2. Task 구성

  • 플랜의 Tasks는 위와 같이 구성되어 있습니다.

  1. Source Code Checkout

    • Repository를 checkout 합니다.

    • 빌드 디렉토리 구성상, repository를 src 밑에 내려받으므로 Checkout Directorysrc로 설정합니다.

     

  2. Script

    • 빌드 디렉토리를 구성합니다.

     

  3. Maven 3.x

    • Maven을 이용하여 설정된 대로 빌드를 수행합니다.

    • 빌드 디렉토리 구성상, pom.xml이 build 디렉토리 밑에 존재하므로 Working subdirectory를 위와 같이 설정하였습니다.

    • The build will produce test results는 반드시 체크를 해제합니다.

      • 테스트를 수행하지 않으므로 에러가 발생합니다.

 

Pom.xml & Build.xml

<?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 https://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.mycompany</groupId> <artifactId>build</artifactId> <name>build</name> <packaging>war</packaging> <version>1.0.0-BUILD-SNAPSHOT</version> <properties> <java-version>1.8</java-version> <org.springframework-version>3.1.1.RELEASE</org.springframework-version> <org.aspectj-version>1.6.10</org.aspectj-version> <org.slf4j-version>1.6.6</org.slf4j-version> <temp.path>${basedir}/temp</temp.path> <project.build.sourceEncoding>utf-8</project.build.sourceEncoding> <!-- Deploy Server Properties --> <deploy.ip>192.168.1.48</deploy.ip> <deploy.was.home>/home/deploy/tomcat</deploy.was.home> <deploy.was.context>${context}</deploy.was.context> <deploy.username>deploy</deploy.username> <deploy.password>deploy</deploy.password> <!-- Nexus Properties --> <nexus.classes>/home/agent/nexus/classes</nexus.classes> <nexus.lib>/home/agent/nexus/lib</nexus.lib> <nexus.username>agent</nexus.username> <nexus.password>agent</nexus.password> </properties> <build> <directory>target</directory> <sourceDirectory>${temp.path}/src/main/java</sourceDirectory> <resources> <resource> <directory>${temp.path}/src/main/resources</directory> </resource> </resources> <plugins> <plugin> <artifactId>maven-eclipse-plugin</artifactId> <version>2.9</version> <configuration> <additionalProjectnatures> <projectnature>org.springframework.ide.eclipse.core.springnature</projectnature> </additionalProjectnatures> <additionalBuildcommands> <buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand> </additionalBuildcommands> <downloadSources>true</downloadSources> <downloadJavadocs>true</downloadJavadocs> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.5.1</version> <executions> <!-- skip compile phase --> <execution> <id>default-compile</id> <phase>none</phase> </execution> </executions> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>1.2.1</version> <configuration> <mainClass>org.test.int1.Main</mainClass> </configuration> </plugin> <plugin> <artifactId>maven-war-plugin</artifactId> <version>2.3</version> <configuration> <warSourceDirectory>${temp.path}/src/main/webapp</warSourceDirectory> <webXml>${temp.path}/src/main/webapp/WEB-INF/web.xml</webXml> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-antrun-plugin</artifactId> <version>1.8</version> <executions> <execution> <id>antrun</id> <phase>compile</phase> <goals> <goal>run</goal> </goals> <configuration> <target> <property name="finalName" value="${project.build.finalName}"/> <ant antfile="${project.basedir}/build.xml"> <target name="compile" /> </ant> </target> </configuration> </execution> </executions> <dependencies> <dependency> <groupId>com.sun</groupId> <artifactId>tools</artifactId> <version>1.8.0</version> <scope>system</scope> <systemPath>${java.home}/../lib/tools.jar</systemPath> </dependency> <dependency> <groupId>org.apache.ant</groupId> <artifactId>ant-jsch</artifactId> <version>1.8.4</version> </dependency> <dependency> <groupId>com.jcraft</groupId> <artifactId>jsch</artifactId> <version>0.1.53</version> </dependency> </dependencies> </plugin> </plugins> </build> </project>
<?xml version="1.0" encoding="UTF-8"?> <project name="MavenAntbuild" basedir="."> <description>Maven &amp; Ant plug-in Test</description> <!-- import ant contrib --> <taskdef resource="net/sf/antcontrib/antlib.xml"> <classpath> <pathelement location="/usr/share/ant/lib/ant-contrib-0.6.jar" /> </classpath> </taskdef> <!-- set classpath --> <path id="classpath"> <fileset dir="${nexus.lib}"> <include name="**/*.jar" /> </fileset> <pathelement path="${nexus.classes}" /> </path> <!-- before compile --> <target name="pre-compile"> <if> <available file="${temp.path}/target/lib" type="dir" /> <then> <copy todir="${nexus.lib}" overwrite="true" force="true" > <fileset dir="${temp.path}/target/lib" includes="**/*.jar" /> </copy> <copy todir="${project.build.directory}/${finalName}/WEB-INF/lib" overwrite="true" force="true"> <fileset dir="${temp.path}/target/lib" includes="**/*.jar" /> </copy> </then> </if> </target> <!-- compile --> <target name="compile" depends="pre-compile"> <mkdir dir="${project.build.directory}/classes" /> <javac destdir="${project.build.directory}/classes" source="${java-version}" target="${java-version}" encoding="UTF-8" verbose="false" debug="true" includeAntRuntime="no"> <src path="${temp.path}/src" /> <classpath refid="classpath" /> </javac> <!-- nexus에 classes sync --> <copy todir="${nexus.classes}" overwrite="true" force="true" > <fileset dir="${temp.path}/../target/classes" includes="**/*.class" /> </copy> </target> </project>

2.2.3. 추가 설정

 

빌드를 수행할 Agent 특정

  • capability를 이용하여 빌드를 수행할 agent를 특정합니다.

 

Artifacts 설정

  • 위와 같이 빌드 디렉토리 구성에 맞게 Artifacts를 설정합니다.

    • Location ( build/target ) : Artifact가 존재하는 위치입니다.

    • Copy pattern( *.war ) : Artifact를 특정할 수 있는 pattern을 설정합니다.

 

3. 배포

3.1. 배포 프로젝트 생성

  • 배포 프로젝트 생성하기를 참고하여 기존에 구성해둔 플랜과 연결된 배포 프로젝트를 생성합니다.

3.2. 배포 환경 구성

  • 배포 환경의 구성 요약은 위와 같습니다.

 

3.2.1. Tasks 구성

  • 배포 환경의 tasks는 위와 같이 구성되어 있습니다.

 

  1. Clean working directory task

    • working directory를 비웁니다.

     

  2. Artifact download

    • Artifact name에 설정된 Artifact를 다운로드합니다.

     

  3. Script

    • 다운로드한 Artifact를 Tomcat에 배포합니다.

 

3.2.2. 추가 설정


배포를 수행할 Agent 특정

  • capability를 이용하여 배포가 수행될 Agent를 특정합니다.

 

Trigger

  • 빌드 수행 후, 자동으로 배포가 수행되도록 Trigger를 설정합니다.

 

변수 설정

  1. Deployment projects > exDeploy > Edit project > Variables 클릭

     

  2. 변수 설정

    • 그림과 같이 변수를 설정합니다.

    • 이렇게 설정된 변수는 ${bamboo.tomcat.context}, ${bamboo.tomcat.home} 같은 식으로 이용할 수 있습니다.

 

4. 결과

4.1. 빌드 및 배포 수행

4.1.1. 빌드 결과

4.1.2. 배포 결과