使用Gitlab-Runner docker模式
说明:runner服务器需要安装docker服务
。
使用docker安装gitlab-runner
docker run -d --name gitlab-runner --restart always \ -v /srv/gitlab-runner/config:/etc/gitlab-runner \ -v /var/run/docker.sock:/var/run/docker.sock \ gitlab/gitlab-runner:latest
Gitlab-runner 注册
docker exec gitlab-runner gitlab-runner register -n \ --url http://192.168.88.3/ \ --registration-token JBsEnXPs7zEuLQj91aC5 \ --tag-list runInDk \ --executor docker \ --docker-image docker \ --docker-volumes /root/.m2:/root/.m2 \ --docker-volumes /root/.npm:/root/.npm \ --docker-volumes /var/run/docker.sock:/var/run/docker.sock \ --description "runInDk"
说明:
1. executor,使用docker。 2. 通过docker-image指定一个docker镜像。这里使用的是docker:latest。 3. 通过docker-volumns挂载本地目录: 挂载docker.sock是为了docker:latest镜像操控runner服务器的docker服务; 挂载.m2文件夹,是为了避免maven每次编译项目时都重新下载jar包。(后面.gitlab-ci.yml文件中使用了maven镜像)
gitlab-ci.yml示例(maven)
stages: - package - build - deploy my_package: image: maven:3.6.0-jdk-8-alpine stage: package script: - mvn clean package -DskipTests - cp Dockerfile target/Dockerfile cache: key: ${CI_PIPELINE_ID} paths: - target/ only: - master tags: - lvTest my_build: stage: build cache: key: ${CI_PIPELINE_ID} paths: - target/ script: - cd target - docker build -t 192.168.88.4:5000/${CI_PROJECT_NAME}:${CI_PIPELINE_ID} . - docker push 192.168.88.4:5000/${CI_PROJECT_NAME}:${CI_PIPELINE_ID} tags: - lvTest my_deploy: stage: deploy script: - docker stop lxwtest && docker rm lxwtest - docker run -d -p 8888:8080 --restart=always --name=lxwtest 192.168.88.4:5000/${CI_PROJECT_NAME}:${CI_PIPELINE_ID} tags: - lvTest
说明:
有两点特殊的配置需要说明。 1. image,启用docker模式后,在任务中可以使用docker镜像作为工具。指定镜像后,该任务的所有命令都是在该镜像内进行。 2. cache,runner提供的缓存功能。该功能可以将任务1生成的文件缓存起来,任务2直接将缓存文件下载到工作路径使用。 其中key指定一个唯一标识,创建和使用缓存时,提供key识别。缓存可以跨任务、甚至pipline使用。 paths,指定要缓存的文件路径。是一个数组,可以指定多个。
vue项目ci文件示例
stages: - package - build - deploy my_package: image: 192.168.100.150/tools/node-git:10-alpine stage: package script: - npm install --registry=https://registry.npm.taobao.org - npm run build:prod - cp Dockerfile dist/Dockerfile cache: key: ${CI_PIPELINE_ID} paths: - dist/ only: - master tags: - runInDk my_build: stage: build cache: key: ${CI_PIPELINE_ID} paths: - dist/ script: - cd dist - docker build -t 192.168.88.4:5000/${CI_PROJECT_NAME}:${CI_PIPELINE_ID} . - docker push 192.168.88.4:5000/${CI_PROJECT_NAME}:${CI_PIPELINE_ID} tags: - runInDk my_deploy: stage: deploy script: - docker stop ${CI_PROJECT_NAME} && docker rm ${CI_PROJECT_NAME} - docker run -d -p 8080:80 --restart=always --name=${CI_PROJECT_NAME} 192.168.88.4:5000/${CI_PROJECT_NAME}:${CI_PIPELINE_ID} tags: - runInDk