Java

    平台支持:

    • java 1.8
    • java 11

    默认为 java 1.8

    打包工具

    平台支持:

    • Maven
    • Gradle

    依赖管理

    若使用平台提供的配置文件,则无需改动代码,平台上进行打包时,将自动准备此些文件,并自动填充占位符

    • Maven: settings.xml
    • Gradle: init.gralde

    settings.xml

    init.gradle

    1. def NEXUS_USERNAME = "{{NEXUS_USERNAME}}"
    2. def NEXUS_PASSWORD = "{{NEXUS_PASSWORD}}"
    3. allprojects {
    4. buildscript {
    5. repositories {
    6. maven {
    7. credentials {
    8. password NEXUS_PASSWORD
    9. }
    10. url NEXUS_SERVER
    11. }
    12. }
    13. }
    14. repositories {
    15. maven {
    16. credentials {
    17. username NEXUS_USERNAME
    18. password NEXUS_PASSWORD
    19. }
    20. url NEXUS_SERVER
    21. }
    22. }
    23. }

    使用自定义配置文件

    TODO: 暂未支持

    推送 jar 包到私服

    上传 maven settings.xml 到平台

    进入变量配置页面下

    项目下 应用设置 > 流水线 / 变量配置 > {对应的环境}

    点击新增配置, 然后选择类型为 文件,选择 开启加密,将自己的 settings.xml 上传上去,变量名称定义为 MAVEN_SETTING_FILE

    ::: warning 必须选择加密,因为文件中含有密码等敏感信息 :::

    settings.xml 样例

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
    5. <servers>
    6. <server>
    7. <id>terminus</id>
    8. <username>deployment</username>
    9. <password>******</password>
    10. </server>
    11. </servers>
    12. </settings>

    源代码中 pom.xml 配置推送地址

    对应的项目的 pom 需要如下配置,没有添加就会报错无法推送上去

    1. <distributionManagement>
    2. <repository>
    3. <id>terminus</id> <!-- settings.xml 里配置的 server.id -->
    4. <name>Releases</name>
    5. </repository>
    6. <snapshotRepository>
    7. <id>terminus</id>
    8. <name>Snapshots</name>
    9. <url>http://私服地址/repository/releases</url> <!-- snapshot 私服的地址 -->
    10. </snapshotRepository>
    11. </distributionManagement>

    配置流水线实现 jar 包上传

    • MAVEN_SETTING_FILE 就是上面配置的名称

    若需要自动触发构建,可增加持续集成配置,

    1. on:
    2. push:
    3. branches:
    4. - develop # 持续集成

    注意点

    ::: tip maven 401 错误是账号密码不对

    maven 405 错误可能是私服地址有问题,有些私服地址是不能推送的,比如 public :::

    在平台上配置 nexus 私服密码

    进入变量配置页面下

    项目下 应用设置 > 流水线 / 变量配置 > {对应的环境}

    点击新增配置, 然后选择类型为 ,选择 开启加密,配置以下变量

    • NEXUS_USERNAME
    • NEXUS_PASSWORD

    ::: warning 必须选择加密,因为文件中含有密码等敏感信息 :::

    源代码中 build.gradle 配置推送地址

    对应的项目的 build.gradle 需要如下配置,没有添加就会报错无法推送上去。build.gradle 配置方式

    1. publishing{
    2. ...
    3. repositories {
    4. maven {
    5. // change URLs to point to your repos, e.g. http://my.org/repo
    6. def releasesRepoUrl = "http://私服地址/repository/releases"
    7. def snapshotsRepoUrl = "http://私服地址/repository/snapshots"
    8. url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl
    9. username = System.getenv("NEXUS_USERNAME")
    10. password = System.getenv("NEXUS_PASSWORD")
    11. }
    12. }
    13. }
    14. }

    配置流水线实现 jar 包上传

    1. version: '1.1'
    2. stages:
    3. - stage:
    4. - git-checkout:
    5. alias: git-checkout
    6. params:
    7. depth: 1
    8. - stage:
    9. - java-build:
    10. alias: java-build
    11. version: "1.0"
    12. params:
    13. build_cmd:
    14. - "./gradlew publish"
    15. jdk_version: 8

    ::: tip maven 401 错误是账号密码不对

    maven 405 错误可能是私服地址有问题,有些私服地址是不能推送的,比如 public :::

    接入平台日志

    平台只采集输出到控制台 (console) 的日志,所以需要应用程序将日志导入控制台。

    ::: warning 请勿将日志写入磁盘文件,会导致性能下降或者磁盘资源耗尽等严重问题 :::

    logback 配置

    通过 logback 配置,将日志输出到控制台:

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <configuration scan="true" scanPeriod="30 seconds">
    3. <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    4. <encoder>
    5. <pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSSZZ} [%thread] %-5level %logger{5} - %msg%n</pattern>
    6. </encoder>
    7. </appender>
    8. <root level="DEBUG">
    9. <appender-ref ref="CONSOLE"/>
    10. </root>
    11. </configuration>

    若采用平台提供的运行容器,平台会自动关闭 RollingFileAppender 等非 ConsoleAppender 的 appender,以确保日志不会写入磁盘。请确保配置了 ConsoleAppender,否则会导致无法查看日志。

    接入平台监控

    TODO: 平台的监控能力一句话介绍+监控带来的好处

    无侵入式监控

    采用平台提供的运行容器镜像,则可以实现无侵入式监控。无需做任何代码改动。

    自定义镜像如何接入

    TODO: 手动加载 javaagent

    如何使用监控能力

    TODO: Link to 监控功能

    构建打包

    Java 构建分为两部分:

    1. 通过指明的打包方式和上下文参数,将源代码编译成打包产物
    2. 按照指明的运行环境和版本,选择基础镜像,将 jar 包制作成运行镜像

    ::: tip 这里特指打包产物而非 jar 包,是因为很多场景下编译的结果并非是 jar 包,比如传统的 spring mvc 程序会是 war 包, 而 gradle distribution 产出的是 tar 或者 zip 包,通过解压执行 bin/xxx 来运行 :::

    Spring Boot

    使用 spring boot 技术制作出的 jar 包称之为 fat jar,因为 jar 包中嵌入了除 java 虚拟机以外所有依赖,故此得名。 由于 fat jar 是一个 all-in-one jar 包,所以只需要 java 虚拟机环境就可以直接通过 java -jar app.jar 直接运行。

    pipeline.yml

    1. version: '1.1'
    2. stages:
    3. - stage:
    4. - git-checkout:
    5. - stage:
    6. - java:
    7. params:
    8. build_type: maven
    9. workdir: ${git-checkout}
    10. options: -am -pl user
    11. target: ./user/target/user.jar
    12. container_type: openjdk

    Gradle Distributions Tar/Zip

    TODO

    Tomcat

    TODO

    Gradle

    自带 gradle cache node,默认开启

    TODO: 详细介绍

    例子:

    1. - stage:
    2. - java:
    3. caches:
    4. - path: /root/.m2/repository
    5. params:
    6. build_type: maven
    7. workdir: ${git-checkout}
    8. options: -am -pl user
    9. target: ./user/target/user.jar

    说明

    /root/.m2/repository 目录是 linux 中 maven 本地仓库的地址,缓存过后就可以进行加速构建

    详细 caches 文档

    actions-caches

    部署运行

    openjdk

    Tomcat

    JVM 调优

    平台默认调优

    自定义调优

    JVM 诊断

    Arthas

    arthas安装路径为 /arthas-boot.jar,可以在根目录通过java -jar arthas-boot.jar启动

    通过阅读用户手册,学习使用:

    Greys

    使用平台提供的运行容器,则已安装了 greys。

    Java Dump

    TODO

    平台提供了 VPN 的方式,支持本地远程连接平台上运行的服务,VPN 使用方式参见:TODO

    为开启远程调试,需要添加 JAVA_OPTS 变量配置,配置为:

    JDK 9 or later:

    JDK 5 - 8:

    1. JAVA_OPTS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005

    配置方式在:

    此外,需要使用本地 IDE 进行连接,具体方式:

    先在平台找到要调试的容器 ip,入口

    DevOps 平台 -> 项目 -> 应用 -> 部署中心 -> 部署总览 -> 容器列表

    获取到容器 ip 后,再在 IDE 新建 remote 配置:

    JDK 9 or later:

    JDK 5 - 8:

    Java - 图2

    平台问题排查

    打包慢

    TODO

    TODO