GitLab流水线的实用脚本程序

在使用GitLab CI的流水线(Pipeline)功能时,通常会将流水线划分为项目打包、构建镜像和部署容器等步骤,每个步骤都分别由一个已注册的GitLab Runner执行。各个步骤对应的GitLab Runner,如下所示:

  • 项目打包:package-runner
  • 构建镜像:build-runner
  • 部署容器:deploy-runner

本文将提供一些实用的脚本程序,它们能够帮助GitLab Runner完成上述步骤的任务。

1. package-runner

package-runner负责拉取项目的源码,然后打包成jar包。可以参考《如何制作和使用Maven的Docker镜像》部署package-runner的容器。

package-runner可以使用package.sh脚本来完成项目打包的步骤:

#! /bin/bash

git clone http://10.15.1.248/$1/$2.git "/home/gitlab-runner/git/$2"
mvn clean package -DskipTests -f /home/gitlab-runner/git/$2
mkdir -p /home/gitlab-runner/build/$2
mv /home/gitlab-runner/git/$2/target/$2-0.0.1-SNAPSHOT.jar /home/gitlab-runner/build/$2/app.jar
rm -rf /home/gitlab-runner/git/$2

package.sh脚本存放在package-runner的根目录中,它接收以下几个参数:

  • 项目组名
  • 项目名称

调用示例:

/bin/bash package.sh yangbin demo

2. build-runner

build-runner负责构建项目的Docker镜像,然后将该镜像上传至镜像仓库。可以参考《如何制作和使用DinD的Docker镜像》部署build-runner的容器。

build-runner可以使用build.sh脚本来构建项目的Docker镜像:

#! /bin/bash

cp -a /Dockerfile /home/gitlab-runner/build/$3/
docker build -t $1:$2 -f /home/gitlab-runner/build/$3/Dockerfile /home/gitlab-runner/build/$3/

build.sh脚本存放在build-runner的根目录中,它接收以下几个参数:

  • 镜像名称
  • 镜像标签
  • 项目名称

调用示例:

/bin/bash build.sh demo-image latest demo

build.sh脚本还会用到一个Dockerfile文件:

FROM java

MAINTAINER ghoulich@aliyun.com

COPY app.jar /

CMD java -jar app.jar

同样将Dockerfile文件存放在build-runner的根目录中。

镜像构建完成之后,build-runner还会使用upload.sh脚本来上传新建的镜像:

#! /bin/bash

docker login --username=ghoulich@aliyun.com registry.cn-hangzhou.aliyuncs.com -p example_password
docker tag $2:$3 $1/$2:$3
docker push $1/$2:$3
docker rmi $1/$2:$3
docker rmi $2:$3
rm -rf /home/gitlab-runner/build/$4

同样将upload.sh脚本存放在build-runner的根目录中,它接收以下几个参数:

  • 镜像仓库名称
  • 镜像名称
  • 镜像标签
  • 项目名称

本文将镜像交给阿里云托管,请根据实际情况修改合适的仓库名称和登录密码。调用示例:

/bin/bash upload.sh registry.cn-hangzhou.aliyuncs.com/ghoulich-demo demo-image latest demo

3. deploy-runner

deploy-runner负责部署项目的容器。可以参考《如何制作和使用DinD的Docker镜像》部署build-runner的容器。

deploy-runner可以使用deploy.sh脚本来完成部署容器的步骤:

#! /bin/bash

input_container_name=$1
input_image_name=$3/$4

container_id=$(docker ps | grep ${input_container_name} | awk '{print $1}')
if [ -n "$container_id" ]; then
    docker stop $container_id
fi

container_id=$(docker ps -a | grep ${input_container_name} | awk '{print $1}')
if [ -n "$container_id" ]; then
    docker rm $container_id
fi

image_name=$(docker images | grep ${input_image_name} | awk '{print $1}')
if [ -n "$image_name" ]; then
    docker rmi $3/$4:$5
fi

docker run --detach --name $1 --hostname $1 --publish $2:8080 $3/$4:$5

deploy.sh脚本存放在deploy-runner的根目录中,它接收以下几个参数:

  • 容器名称
  • 需要映射的端口号
  • 镜像仓库名称
  • 镜像名称
  • 镜像标签

调用示例:

/bin/bash deploy.sh demo 8080 registry.cn-hangzhou.aliyuncs.com/ghoulich-demo demo-image latest

将三个步骤的GitLab Runner配置完毕之后,还需要编写.gitlab-ci.yml文件,然后才能自动/手动触发流水线。