【技术博客】Coding平台的Spring项目持续集成部署 | week9

Coding平台的Spring项目持续集成部署

开始本来只想通过docker进行部署,不过发现实际使用时coding的docker推送经常遇到问题,猜测是因为docker镜像太大的缘故,因此研究了直接源码部署的方法。

1.Docker部署

配置Docker文件

首先在自己的spring项目仓库根目录下创建一个Dockerfile,以下面代码为例,需要配置自己想要的端口号:

# java 环境
FROM java:8u111

# 定义工作目录
WORKDIR /app
# 把项目中的所有东西复制到工作目录(app)下面
COPY . .
# 把打包好的文件 赋值到app下面 方便操作
ADD target/*.jar /app/app.jar
# 改变容器的时区
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone
#端口号
EXPOSE 8090
ENTRYPOINT ["java","-jar","/app/app.jar"]

创建构建计划

然后先进入包含了Spring代码仓库的已有项目,先选择创建计划,选择Java + Spring + Docker模板创建。

配置构建过程

进行如下修改,选择对应仓库,指定编译和单元测试的命令。

单元测试命令使用mvn test即可

docker、ssh配置

之后注意一定要使用rsa密钥

可以参考以下命令

ssh-keygen -m PEM -t ed25519 -C "邮箱"

注意生成了密钥后将公钥放到服务器的 .ssh 下的 authorized_keys 中!!

之后将私钥配置到登陆凭据中。

docker选择或者新建一个制品库,进入制品库,点开一个docker选择操作指引,生成个人令牌,并将里面的这个命令

docker login -u xx.com -p <PASSWORD> xx-docker.pkg.coding.net

里的参数配置到构建计划的环境变量中,具体来说就是-u后的,-p后的password,以及最后的*.net这几个字符串和三个环境变量对应即可

具体来说这里其实是和Jenkinsfile中的以下代码对应

sshCommand(
    remote: remoteConfig,
    command: "docker login -u ${CODING_DOCKER_REG_USERNAME} -p ${CODING_DOCKER_REG_PASSWORD} ${CODING_DOCKER_REG_HOST}",
    sudo: true,
)

Spring端口配置与触发构建部署设置

将以下的8090:8090换成自己的端口即可

sshCommand(
    remote: remoteConfig,
    command: "docker run -d -p 8090:8090 --name java-spring-app ${DOCKER_IMAGE_URL}",
    sudo: true,
)

然后开始构建就好了

最后设置成特定规则触发集成就好

验证

我们的项目内置了swagger文档,因此直接打开 http://8.141.168.151:8090/doc.html 就可以查看接口文档了,大功告成!

2.源码拉取部署

之前的coding Docker部署有时候会有一些小问题,且耗时长,因此研究了另一种部署方式。

配置java环境

oracle源码安装

sudo mkdir /usr/lib/jvm
sudo tar -zxvf jdk-8u311-linux-x64.tar.gz -C /usr/lib/jvm
sudo vim ~/.bashrc
#末尾加入以下内容
#set oracle jdk environment
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_311  ## 这里要注意目录要换成自己解压的jdk 目录
export JRE_HOME=${JAVA_HOME}/jre  
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib  
export PATH=${JAVA_HOME}/bin:$PATH  
source ~/.bashrc #让变量生效
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.8.0_311/bin/java 300 #系统注册
java -version #检查安装情况
sudo update-alternatives –config java #多个java版本切换

openjdk安装

sudo apt-get update
sudo apt-get install openjdk-8-jdk
java -version

安装maven

sudo apt-get install maven
sudo chmod 777 /usr/share/maven/conf/settings.xml
sudo vi /usr/share/maven/conf/settings.xml
#mirrors标签处加入以下内容
<mirror>
    <id>aliyunmaven</id>
    <mirrorOf>*</mirrorOf>
    <name>阿里云公共仓库</name>
    <url>https://maven.aliyun.com/repository/public</url>
</mirror>

打包

mvn clean install package
mvn spring-boot:run #服务器调试

自动部署

cd umeta-backend
git pull
nohup mvn spring-boot:run & #这样的方式不好操作
kill -9 $(ps -ef|grep spring|grep -v grep|awk '{print $2}') #关闭进程

官方推荐打包jar进行部署

cd umeta-backend
git pull
kill -9 $(ps -ef|grep umeta-backend.jar|grep -v grep|awk '{print $2}') #先关闭之前的进程
mvn clean install package
cp target/umeta-backend-0.0.1-SNAPSHOT.jar ../umeta-backend.jar
cd ..
nohup java -jar umeta-backend.jar --spring.profiles.active=prod > backendoutput.log 2>&1 & #后面这样写不仅可以正常退出,还可以将标准错误 2 重定向到标准输出 &1 ,标准输出 &1 再被重定向输入到 runoob.log 文件中。
echo "部署完毕!!"

持续集成

最后的Jenkinsfile可以这样写

配置好REMOTE_HOST REMOTE_SSH_PORT REMOTE_CRED REMOTE_USER_NAME 这几个ssh登录需要的内容即可

pipeline {
  agent any
  stages {
    stage('服务器打包测试') {
      steps {
        script {
          def remoteConfig = [:]
          remoteConfig.name = "my-Aliyun-server"
          remoteConfig.host = "${REMOTE_HOST}"
          remoteConfig.port = "${REMOTE_SSH_PORT}".toInteger()
          remoteConfig.allowAnyHosts = true

          withCredentials([
            sshUserPrivateKey(
              credentialsId: "${REMOTE_CRED}",
              keyFileVariable: "privateKeyFilePath"
            )
          ]) {
            // SSH 登陆用户名
            remoteConfig.user = "${REMOTE_USER_NAME}"
            // SSH 私钥文件地址
            remoteConfig.identityFile = privateKeyFilePath

            sshCommand(
              remote: remoteConfig,
              command: "sh buildbackend.sh",
              sudo: true,
            )
          }
        }

      }
    }
    stage('服务器部署') {
      steps {
        script {
          def remoteConfig = [:]
          remoteConfig.name = "my-Aliyun-server"
          remoteConfig.host = "${REMOTE_HOST}"
          remoteConfig.port = "${REMOTE_SSH_PORT}".toInteger()
          remoteConfig.allowAnyHosts = true

          withCredentials([
            sshUserPrivateKey(
              credentialsId: "${REMOTE_CRED}",
              keyFileVariable: "privateKeyFilePath"
            )
          ]) {
            // SSH 登陆用户名
            remoteConfig.user = "${REMOTE_USER_NAME}"
            // SSH 私钥文件地址
            remoteConfig.identityFile = privateKeyFilePath
            sshCommand(
              remote: remoteConfig,
              command: "nohup java -jar umeta-backend.jar --spring.profiles.active=prod > backendoutput.log 2>&1 &",
              sudo: true,
            )
            echo "部署成功,请到 http://${REMOTE_HOST}:8090/doc.html 预览效果"
          }
        }

      }
    }
  }
}
posted @ 2022-04-29 23:36  头发茂盛队  阅读(512)  评论(0编辑  收藏  举报