【技术博客】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 预览效果"
}
}
}
}
}
}