Administrator
发布于 2024-11-05 / 9 阅读
0

gitea+drone(单体版) cicd 流程

1.安装gitea、drone并测试连通性(参考其他章节)

2.脚本流程

.drone.yml文件(.drone.yml 文件中,可以定义构建步骤、环境变量、触发条件、部署目标等信息,以指导 Drone 如何执行构建和部署任务。.drone.yml 文件通常存储在代码仓库的根目录下,当代码仓库中的代码发生变化时,Drone 将会读取 .drone.yml 文件并执行其中定义的流水线操作。)

kind: pipeline
type: docker
name: demo
platform:
  os: linux
  arch: arm64
  #指定平台及操作系统 及架构   linux查看架构命令:uname -m


steps: #步骤列表
  - name: build-jar # 流水线名称
    image: maven:3.8.5-openjdk-11 # 定义创建容器的Docker镜像,maven:3.8.5-openjdk-8用于对java进行打包使用
    volumes: # 将容器内目录挂载到宿主机,仓库需要开启Trusted设置
      - name: maven-cache  #挂载了一个名为maven-cache的目录到容器内的/root/.m2目录,用于缓存Maven下载的依赖。
        path: /root/.m2 # 将maven下载依赖的目录挂载出来,防止重复下载
      - name: maven-build  #挂载了一个名为maven-build的目录到容器内的/app/build目录,用于存放应用打包好的Jar文件和执行脚本。
        path: /app/build # 将应用打包好的Jar和执行脚本挂载出来.
    commands: # 定义在Docker容器中执行的shell命令
      - sed -i 's/$DRONE_COMMIT_BRANCH/'"$DRONE_COMMIT_BRANCH"'/' start.sh  #替换start.sh文件中的$DRONE_COMMIT_BRANCH变量为实际的DRONE_COMMIT_BRANCH值。
      - bash maven.sh  #执行了一个名为maven.sh的shell脚本,用于执行Maven构建操作。
      - ls #列出当前目录下的文件和目录

  - name: build-docker # 制作docker镜像
    image: docker # 使用官方docker镜像
    volumes: # 将容器内目录挂载到宿主机.
      - name: docker
        path: /var/run/docker.sock # 挂载宿主机的docker
      - name: maven-build
        path: /app/build # 将应用打包好的Jar和执行脚本挂载出来
    commands: # 定义在Docker容器中执行的shell命令.
      - ls
      - sed -i 's/$DRONE_COMMIT_BRANCH/'"$DRONE_COMMIT_BRANCH"'/' start.sh
      - sed -i 's/$DRONE_COMMIT_BRANCH/'"$DRONE_COMMIT_BRANCH"'/' Dockerfile
      - sed -i 's/$DRONE_COMMIT_BRANCH/'"$DRONE_COMMIT_BRANCH"'/' .dockerignore
      # docker登录,不能在脚本中登录,并且不能使用docker login -u -p
      - chmod +x docker.sh
      - sh docker.sh


volumes:
  - name: maven-build  #挂载点的名称
    host:   #挂载点的主机配置,指定了挂载到宿主机上的路径
      path: /home/build/demo   #指定了将容器内的目录挂载到宿主机上的/home/build/demo
  - name: maven-cache
    host:
      path: /home/data/maven/cache
  - name: docker
    host:
      path: /var/run/docker.sock
# 定义触发条件
trigger:
  branch:  #指定了在哪些分支上触发流水线
    - master  #只有当代码提交到master分支时才会触发流水线
    - demo
  event:   #事件配置,指定了触发流水线的事件类型
    - push  #只有当有代码推送(push)操作时才会触发流水线

DockerFile 文件解释

#Dockerfile描述了如何构建一个Docker镜像

FROM registry.cn-chengdu.aliyuncs.com/claywang/zulu-openjdk:11.0.22-jdk
#指定了基础镜像,从指定的镜像构建新的镜像。
VOLUME /tmp
#在镜像中创建一个挂载点/tmp,用于存储临时文件
RUN mkdir -p /home/gary
#在镜像中创建一个目录/home/gary
RUN useradd -b /home -m -s /bin/bash gary
#创建一个名为gary的用户,并指定其家目录为/home/gary,shell为/bin/bash
RUN chmod a+xr -R /home/gary && chown gary:gary -R /home/clay
#修改/home/gary目录的权限为可执行和可读,将/home/clay目录的所有权赋予gary用户
USER gary
#切换用户为gary
WORKDIR /home/gary
#设置工作目录为/home/gary
COPY ./start.sh /home/gary/
#将本地的start.sh文件复制到镜像中的/home/gary/目录
ADD ./demo /home/gary/demo.jar
#将本地的demo目录复制到镜像中的/home/gary/demo.jar文件
RUN mkdir -p /home/gary/logs && touch /home/gary/logs/spring.log
#创建一个名为logs的目录,并创建一个名为spring.log的空文件
ENV REF_NAME dev
#设置环境变量REF_NAME的值为dev
EXPOSE 8080
#声明容器将监听8080端口
CMD bash /home/gary/start.sh $REF_NAME && echo "start logging..." && : > /home/gary/logs/spring.log && tail -F -n 500 /home/gary/logs/spring.log
#在容器启动时执行的命令,依次执行start.sh脚本,输出日志信息,清空spring.log文件并实时查看最后500行日志。

Dockerfile 文件(Dockerfile 是在构建 Docker 镜像时执行的。Dockerfile 是一个文本文件,其中包含了一系列指令,用于描述如何构建 Docker 镜像。当执行 docker build 命令时,Docker 将会读取 Dockerfile 中的指令,并按照指令的顺序逐步构建镜像。每个指令都会在一个临时的容器中执行,并生成一个新的镜像层。最终,所有指令执行完成后,将会生成一个完整的 Docker 镜像。)

FROM  azul/zulu-openjdk:11.0.22-jdk
VOLUME /tmp
RUN mkdir -p /home/gary
RUN useradd -b /home -m -s /bin/bash gary
RUN chmod a+xr -R /home/gary && chown gary:gary -R /home/gary
USER gary
WORKDIR /home/gary
COPY ./start.sh /home/gary/
ADD ./demo /home/gary/demo.jar
RUN mkdir -p /home/gary/logs && touch /home/gary/logs/spring.log
ENV REF_NAME dev
EXPOSE 8080
CMD bash /home/gary/start.sh $REF_NAME && echo "start logging..." && : > /home/gary/logs/spring.log && tail -F -n 500 /home/gary/logs/spring.log

maven.sh 文件

#!/bin/bash


#cp common/common-log/src/main/resources/logback-dev.xml admin/admin-bizsrc/main/resources
#cp common/common-log/src/main/resources/logback-pro.xml admin/admin-biz/src/main/resources
#将两个不同的logback配置文件复制到指定的目录中
echo "****************************************************************************"
ls "${path}"/src/src/main/resources
#${path}是一个变量,表示路径的根目录。通过使用ls命令,可以查看该目录下的内容。
mvn clean package -DskipTests=true # 应用打包命令
# clean: 表示在构建之前先清理项目,删除之前生成的文件。
# package: 表示打包项目,将项目编译、打包成可执行的jar或war文件。
# -DskipTests=true: 表示跳过运行测试,不执行项目中的测试用例。
ls
echo "****************************************************************************"
find /drone/src/target -type d
echo "****************************************************************************"
ls /drone/src/src/main/resources
ls /drone/src/target
cp /drone/src/target/demo.jar demo # 将打包好的jar文件复制到指定目录 将demo/demo/target/demo.jar文件复制到当前目录下的demo目录中
# demo/demo/target/demo.jar: 表示源文件路径,即要复制的文件路径。
# demo: 表示目标路径,即要将文件复制到的目录路径。


start.sh 文件(start.sh 脚本通常是在容器启动时执行的。在 Dockerfile 中,可以使用 CMDENTRYPOINT 指令来指定容器启动时要执行的命令或脚本。通常情况下,可以将 start.sh 脚本作为容器的入口点(entrypoint),这样在容器启动时会自动执行 start.sh 脚本。start.sh 脚本可以用来启动应用程序、配置环境变量、执行初始化操作等。)

#!/bin/bash
USER_NAME=`whoami`
#获取当前用户的用户名
if [ "$USER_NAME" = "root" ];then
    echo "----->Root user can not start app.<-----"
    exit 1
fi
#判断当前用户是否为root,如果是则输出提示信息并退出脚本。
cd `dirname $0`
#切换到脚本所在目录
NOW_DIR=`pwd`
#获取当前目录的绝对路径
JAVA_OPTS="-Djava.awt.headless=true -Djava.net.preferIPv4Stack=true "
#设置Java运行参数
JAVA_MEM_OPTS=""
#设置Java内存参数
BITS=`java -version 2>&1 | grep -i 64-bit`
#检查Java版本是否为64位
if [ -n "$BITS" ]; then
    JAVA_MEM_OPTS=" -server -Xms256m -Xmx256m"
else
    JAVA_MEM_OPTS=" -server -Xms256m -Xmx256m"
fi
#如果Java版本为64位,则设置Java内存参数为-server -Xms256m -Xmx256m。 如果Java版本不是64位,则同样设置Java内存参数为-server -Xms256m -Xmx256m。
echo -e "Starting the server ..."

ls

echo "================================="

nohup java -jar $JAVA_OPTS $JAVA_MEM_OPTS demo.jar --spring.profiles.active=pro --server.port=8080 >./logs/spring.log 2>&1 &
#使用nohup命令启动Java应用程序,并将输出重定向到./logs/spring.log文件中
echo -e "Check the logs for more details."

PID=`ps -ef | grep 'java' | grep "demo.jar" | grep -v 'grep' | awk '{print $2}'`
#获取Java进程的PID
echo -e "The PID Is $PID"


.dockerignore 文件(这个文件是一个版本控制的忽略文件,通常命名为.gitignore。它的作用是告诉版本控制系统(如Git)哪些文件或目录不应该被纳入版本控制中。通过在.gitignore文件中列出特定的文件、文件夹或文件类型,可以避免将不必要的文件提交到版本控制系统中,从而保持代码仓库的整洁和可维护性。这样可以避免意外提交敏感信息、临时文件、编译生成的文件等到版本控制系统中,同时也可以提高代码仓库的性能和减少冲突。)

.dockerignore 文件的作用类似于 git 工程中的 .gitignore 。不同的是 .dockerignore 应用于 docker 镜像的构建,它存在于 docker 构建上下文的根目录,用来排除不需要上传到 docker 服务端的文件或目录。

docker 在构建镜像时首先从构建上下文找有没有 .dockerignore 文件,如果有的话则在上传上下文到 docker 服务端时忽略掉 .dockerignore 里面的文件列表。这么做显然带来的好处是:

1.构建镜像时能避免不需要的大文件上传到服务端,从而拖慢构建的速度、网络带宽的消耗;

2.可以避免构建镜像时将一些敏感文件及其他不需要的文件打包到镜像中,从而提高镜像的安全性;

### Java template
# Compiled class file
*.class

# Log file
*.log

# BlueJ files
*.ctxt

# Mobile Tools for Java (J2ME)
.mtj.tmp/

# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar

# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*

### Maven template
target/
pom.xml.tag
pom.xml.releaseBackup
pom.xml.versionsBackup
pom.xml.next
release.properties
dependency-reduced-pom.xml
buildNumber.properties
.mvn/timing.properties
# https://github.com/takari/maven-wrapper#usage-without-binary-jar
.mvn/wrapper/maven-wrapper.jar

### Example user template template
### Example user template

# IntelliJ project files
.idea
*.iml
out
gen


!$DRONE_COMMIT_BRANCH.jar
!start.sh