Blog:使用GOCD部署一个SpringBoot应用

来自WHY42

如何自动部署 springboot 的应用? 首先我们要做的是把GOCD的启动用户`go`加入到`docker`组中,这样就可以免`sudo`来执行docker的命令了

sudo gpasswd -a go docker
sudo /etc/init.d/docker restart
newgrp - docker

我们现在来通过GOCD部署一个eureka的服务端。eureka用作服务发现,包含server端和client端,每个微服务是一个client注册到server上。看看需要哪些包:

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
    compile group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: '1.5.3.RELEASE'
    compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-eureka-server', version: '1.3.1.RELEASE'
}

然后我们的程序写一句话就可以了:

@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
    public static void main(String[] args){
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}

这样启动后就可以访问到eureka的web页面了,我们可以在application.properties中配置一些属性:

server.port=8761
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false

然后来想办法把应用打包到docker中。我们新建一个Dockerfile到src/main/docker中:

FROM oracle/openjdk:8
VOLUME /tmp
ADD eureka-server-1.0-SNAPSHOT.jar app.jar
RUN sh -c 'touch /app.jar'
ENV JAVA_OPTS=""
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]

然后在build.gradle中添加一个构建任务:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.5.2.RELEASE")
        classpath('se.transmode.gradle:gradle-docker:1.2')
    }
}
task buildDocker(type: Docker, dependsOn: build) {
    push = false
    applicationName = jar.baseName
    dockerfile = file('src/main/docker/Dockerfile')
    doFirst {
        copy {
            from jar
            into stageDir
        }
    }
}

这样当我们执行`gradle build buildDocker`命令的时候就会把springboot应用打包成docker镜像了。