Commit 306081c8 authored by linruibiao's avatar linruibiao

接口编写

parent 2c8a60b4
#
# 注意:1、arm64和amd64的镜像是有区别的,许多镜像默认是amd64内核,
# 所以一般情况下不需要为amd64内核担心,若需要arm64内核先去https://hub.docker.com/寻找镜像
# 2、改动完成可以去gitlab CI LINT验证文件格式
# 3、如果需要新增分支,直接在env目录下增加一个环境文件,配置所需参数,不要轻易改动此文件
#
# 因为Runner执行器设置为docker, 所以这里需要指定docker的版本,不指定也行,默认会用注册runner时指定的版本。若job存在image会覆盖
#image: docker:stable
#自定义全局变量
variables:
#指定maven仓库路径
MAVEN_OPTS: "-Dmaven.repo.local=/.m2"
#docker buildx 内核
CI_BUILD_ARCHS: "linux/arm64"
#maven镜像
CI_MAVEN_IMAGE: "swr.cn-south-1.myhuaweicloud.com/build-needs/arm64v8/maven:3.6-jdk-8-nexus"
#自己做的镜像,里面结合了jdk maven docker buildx
CI_BUILD_PUSH_IMAGE: "swr.cn-south-1.myhuaweicloud.com/build-needs/arm64v8/dockerbuildx:maven3.6-jdk8"
#集成了ssh
CI_DEPLOY_IMAGE: "linuxkit/sshd:666b4a1a323140aa1f332826164afba506abf597"
#执行阶段定义
stages:
- maven test
- docker build and push
- deploy
maven test:
image: ${CI_MAVEN_IMAGE}
stage: maven test
script:
#maven打包
- mvn $MAVEN_OPTS clean test
#标签指定runner
tags:
- slm-bi_java
#只允许哪些分支
only:
# web说明:手动创建一个流水线任务,逻辑结合了上面的MANUAL_ENV变量
# 如果你要手动执行一个标签流水线任务,一定要新增MANUAL_ENV变量指定环境
# ps:分支也可指定变量,分支默认会加载ci_env,所以可以不指定。但是ci_env下不存在的分支一定要指定
- web
#不允许失败
allow_failure: false
docker build and push:
image: ${CI_BUILD_PUSH_IMAGE}
stage: docker build and push
before_script:
- source ./ci_env/.base.env
- >
if [ ! -n "${MANUAL_ENV}" ]; then
source ./ci_env/.${CI_COMMIT_REF_NAME}.env;
else source ./ci_env/.${MANUAL_ENV}.env;
fi
script:
#打包jar
#- mvn $MAVEN_OPTS clean install -Dmaven.test.skip=true -Dspring.profiles.active=$SPRING_ACTIVE_PROFILE
- mvn $MAVEN_OPTS clean package -U -P$SPRING_ACTIVE_PROFILE -Dmaven.test.skip=true
#这个脚本的目的是清除上一个镜像
- sh ./ci_env/sh/build.sh $DOCKER_REPO${CI_COMMIT_REF_NAME}
#docker登录远程镜像仓库
- docker login -u $DOCKER_USER -p $DOCKER_PASSWORD swr.cn-south-1.myhuaweicloud.com
- echo docker buildx build --build-arg APP_NAME="$APP_NAME" --build-arg JAVA_OPTS="$JAVA_OPTS$SPRING_ACTIVE_PROFILE" --platform $CI_BUILD_ARCHS -t $DOCKER_REPO$SPRING_ACTIVE_PROFILE .
#改动此处必须了解build和buildx,buildx的作用是指定系统内核build镜像,但是注意DockerFile中的镜像必须和指定的内核匹配,不然会build失败
- docker buildx build --build-arg APP_NAME="$APP_NAME" --build-arg JAVA_OPTS="$JAVA_OPTS$SPRING_ACTIVE_PROFILE" --platform $CI_BUILD_ARCHS -t $DOCKER_REPO$SPRING_ACTIVE_PROFILE .
#上传镜像,注意,若第一次上传会消耗较长时间,若是第二次上传因为docker images的原理,只会替换和上次镜像不同的卷(一般是上层的卷),
#push 的时候不是push一个文件,而是分成了多个卷从下层往上层依次push
- docker push $DOCKER_REPO$SPRING_ACTIVE_PROFILE
#push完之后继续清除
- sh ./ci_env/sh/build.sh $DOCKER_REPO$SPRING_ACTIVE_PROFILE
tags:
- slm-bi_java
only:
- web
allow_failure: false
deploy:
image: ${CI_DEPLOY_IMAGE}
stage: deploy
before_script:
- source ./ci_env/.base.env
- >
if [ ! -n "${MANUAL_ENV}" ]; then
source ./ci_env/.${CI_COMMIT_REF_NAME}.env;
else source ./ci_env/.${MANUAL_ENV}.env;
fi
#初始化配置ssh-agent,由于镜像集成了,不会选择安装
- 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
#开启ssh-agent
- eval $(ssh-agent -s)
#若报错信息invalid format,代表ssh key配置有误,挖坑2小时
- ssh-add <(echo "$SERVER_SSH_KEY")
- mkdir -p ~/.ssh
- echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config
script:
#远程登录并执行命令,执行shell脚本,因为stop和rm的时候如果容器不存在是会报错的,在任意命令发生报错都会造成部署失败,可优化日志
- echo 远程指令 root@$SERVER_IP "sh /opt/docker-command/rm-app.sh $APP_NAME $DOCKER_REPO$SPRING_ACTIVE_PROFILE >>/opt/docker-command/rm-app.log; $SSH_COMMAND $HOSTS $DOCKER_REPO$SPRING_ACTIVE_PROFILE;"
- ssh root@$SERVER_IP "sh /opt/docker-command/rm-app.sh $APP_NAME $DOCKER_REPO$SPRING_ACTIVE_PROFILE >>/opt/docker-command/rm-app.log; $SSH_COMMAND $HOSTS $DOCKER_REPO$SPRING_ACTIVE_PROFILE;"
tags:
- slm-bi_java
only:
- web
allow_failure: false
\ No newline at end of file
#镜像支持wkhtmltopdf0.12.6 ffmpeg4.2.4 jdk8
FROM swr.cn-south-1.myhuaweicloud.com/build-needs/arm64v8/wkhtmltopdf-ffmpeg-jdk8:latest
#挂载目录,这个目录会挂载到宿主机,路径是docker指定的,可以使用inspect查看
VOLUME /tmp
#复制,注意如果目标指定是目录,会自动解压,不想解压可以用COPY
ADD target/*.jar app.jar
#对外暴露接口参考,并非指定
EXPOSE 2022
#ARG用于builld --build-arg 赋值,多个ARG对应多个--build-arg
ARG APP_NAME
ARG JAVA_OPTS
#ENV用于容器,目前在镜像中已经指定,容器启动无需设置,但是可以修改
#总结:ARG只存在于镜像,但是ENV会在镜像和容器中都存在
ENV APP_NAME $APP_NAME
ENV JAVA_OPTS $JAVA_OPTS
#语言环境,解决相互调用出现中文乱码
ENV LANG C.UTF-8
#RUN可以使用ARG和ENV,RUN命令是在镜像构建的时候运行
RUN mkdir -p /opt/java-tmp/$APP_NAME/ && \
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
echo 'Asia/Shanghai' >/etc/timezone
#注意因为要传递参数,ENTRYPOINT要选择shell模式,而非exec模式
#ENTRYPOINT和CMD因为其是在容器启动的时候执行,所以无法加载ARG,但是可以拿到ENV,所以ARG和ENV一般都是配合使用
ENTRYPOINT java -server $JAVA_OPTS -jar /app.jar
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment