构建发布流程

构建发布流程

标签: devops  

jenkins SVC插件 workspace插件 MAVEN插件 未使用pipline

maven clean install -DskipTests -U

tag=ci$BUILD_NUMBER
registry=10.4.31.153

cat > Dockerfile <<!
FROM openjdk:8-alpine
LABEL maintainer=tq02ksu@gmail.com
# https://spring.io/guides/topicals/spring-boot-docker/

WORKDIR /app
RUN mkdir -p lib bin log; \
    { echo '#!/bin/sh' && echo 'exec java \${JAVA_OPTS} -jar lib/app.jar \${@}'; } > bin/run.sh; \
    chmod 755 bin/run.sh
COPY xk-cloud-tm-basic-service/target/*.jar lib/app.jar

EXPOSE 8080
ENTRYPOINT bin/run.sh

!

docker build --compress --no-cache -t $registry/$JOB_NAME:$tag . && \
 docker push $registry/$JOB_NAME:$tag
0. 通用
0.1 指导思想
为了使应用程序具有较强的健壮性和冗错性,降低部署和维护成本,应用12要素宣言很好的总结了如何设计应用。

一份代码,多份部署。开发环境,测试环境,预发布环境(一般连接生产数据库),生产环境。
配置与代码严格分离,判断标准是基准代码是否可以立刻开源,而不用担心会暴露任何敏感的信息。
严格分离构建和运行。这要求不可以直接修改运行状态的代码。
进程:以一个或多个无状态的进程运行应用。对于“session粘性”要求的应用可以把共享数据放在redis中或者强制单节点运行。
进程启动终止的最大化健壮性:快速启动,接收到 SIGTERM 信号后优雅终止。
开发环境与线上环境等价。
日志做为事件流。
0.2 边界
Kubernetes对于无状态应用的部署,非常方便灵活,因此对于无状态应用,可以部署在kubernetes集群中;另外有状态应用(如mysql等依赖文件系统的应用)可以部署在kubernetes集群之外,通过服务Endpoints引入到集群中。

常见依赖服务的建议如下:

应用	部署方式	原因
mysql	物理机部署	有状态应用,依赖文件系统。
activemq	k8s集群部署	一般不会依赖activemq长期存储数据,可以选择集群维护,如果依赖数据的持久化,需要物理机部署
redis	k8s集群部署	只用做缓存使用时可k8s集群部署,如果需要长期保存数据,需要物理机部署
ice服务	物理机部署	依赖ice框架较复杂,迁移到k8s成本较高。相关服务较少,物理机部署更合适
0.3 套餐选择和JVM参数
对于一般java应用,生产,线上环境可以先择(s)配额是0.5core,1Gmem,限制为1核2G的配置。

对于开发,测试,演示,stage环境和资源有限的私有化部署环境,推荐再小一号的(xs)号。启动时间稍长。但是占用资源非常小。

JVM参数为:

# XS套餐 limitMem80Percent=800M, requestMem40Percent=400M
# S套餐 limitMem80Percent=1600M, requestMem40Percent=800M
JAVA_OPTS=-server -Xms{{limitMem80Percent}} -Xmx{{limitMem80Percent}} -Xmn{{requestMem40Percent}} \
           -XX:SurvivorRatio=4 -Xss320K -XX:+UseConcMarkSweepGC \
           -XX:+PrintGC -verbose:gc -Xloggc:log/gc.log -XX:+PrintGCDetails \
           -XX:+PrintGCDateStamps -XX:+ExplicitGCInvokesConcurrent
0.4 日志
1. SpringBoot应用
1.1 配置
通过环境变量设定使用的profile.实现跨应用配置复用。如

# docker优先级高于common
SPRING_PROFILES_ACTIVE=common,docker
可以配置一个通用配置,挂载到/app/config/application-common.yml目录上实现多个应用共享。

应用特有的配置放在/app/config/application-docker.yml目标上,这个优化级会高于common的。

详细的SpringBoot 配置加载过程见Externalized Configuration

1.2 健康检查
springboot提供actuator组件做健康检查,因此项目中需要引入相关依赖 spring-boot-starter-actuator.

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
同时为了安全,单独配置健康检查的端口(全部应用可以共用)

# spring boot 1.x.x
management:
  port: 8081
# spring boot 2.x.x
management:
  server:
    port: 8081
在安全配置中排除“/health"的安全较验,如

public class WebSecurityConfig extends WebSecurityConfigurarAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().antMatchers("/health").permitAll();
    }
}

「真诚赞赏,手留余香」

Uwei

请我喝杯咖啡?

使用微信扫描二维码完成支付

相关文章