使用gitlab构建基于docker的持续集成(三)

时间:2023-03-10 02:58:28
使用gitlab构建基于docker的持续集成(三)

使用gitlab构建基于docker的持续集成(三)

gitlab
docker
aspnetcore
持续集成

构建发布思路:

1.构建单元测试镜像,上传镜像仓库。

2.拉取测试镜像,执行单元测试。

3.构建发布镜像,上传镜像仓库。

4.使用docker-compose编排发布镜像和数据库镜像,打包发布,我把项目也发布到了gitlab.luna.cn服务器

aspnetcore 下的dockerfile编写

使用gitlab构建基于docker的持续集成(三)

dockerfile的编写,参考了dotnet官方的例子,是用分层配置,这样只要写一个dockerfile就可以了。

FROM microsoft/dotnet:2.0-sdk AS build
WORKDIR /app # copy csproj and restore as distinct layers
COPY *.sln .
COPY User.Api/*.csproj ./User.Api/
COPY User.Api.UnitTest/*.csproj ./User.Api.UnitTest/
RUN dotnet restore # copy everything else and build app
COPY . .
WORKDIR /app//User.Api
RUN dotnet build FROM build AS testrunner
WORKDIR /app/User.Api.UnitTest
ENTRYPOINT ["dotnet", "test", "--logger:trx"] FROM build AS publish
WORKDIR /app/User.Api
RUN dotnet publish -c Release -o out FROM microsoft/aspnetcore:2.0 AS runtime
WORKDIR /app
ENV ASPNETCORE_URLS http://+:80
EXPOSE 80
COPY --from=publish /app/User.Api/out ./
ENTRYPOINT ["dotnet", "User.Api.dll"]

发布docker-compose

version: '3'

services:
user.api:
image: gitlab.luna.cn/lunaselene/findbook.first/master:release
container_name: user.api
ports:
- '8080:80'
links:
- mysql-bate
mysql-bate:
image: 'mysql/mysql-server:5.7'
restart: always
container_name: mysql-bate
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/config/my.cnf:/etc/my.cnf
- ./mysql/init:/docker-entrypoint-initdb.d/
ports:
- '3306'

gitlab-ci.yml的编写

使用gitlab构建基于docker的持续集成(三)

安装构建思路,对应的yml文件如下

image: tico/docker
variables:
CONTAINER_TEST_IMAGE: $CI_REGISTRY_IMAGE/$CI_COMMIT_REF_NAME:test
CONTAINER_RELEASE_IMAGE: $CI_REGISTRY_IMAGE/$CI_COMMIT_REF_NAME:release
DOCKER_DRIVER: overlay2 before_script:
- docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
#下面是登录远程服务器的设置sshkey操作
# 其中私有变量$SSH_PRIVATE_KEY 是远程服务器的ssh私匙
# 我使用的部署gitlab的服务器所以url是gitlab.luna.cn
- eval $(ssh-agent -s)
- ssh-add <(echo "$SSH_PRIVATE_KEY")
- mkdir -p ~/.ssh
- chmod 700 ~/.ssh
- ssh-keyscan gitlab.luna.cn > ~/.ssh/known_hosts
- chmod 644 ~/.ssh/known_hosts
- ssh -T root@gitlab.luna.cn
stages:
- build
- test
- release
- deploy build:
stage: build
script:
- docker build --target testrunner --pull -t $CONTAINER_TEST_IMAGE .
- docker push $CONTAINER_TEST_IMAGE test:
stage: test
script:
- docker pull $CONTAINER_TEST_IMAGE
- docker run $CONTAINER_TEST_IMAGE
- docker rm $(docker ps -q -l) release:
stage: release
script:
- docker build --target runtime --pull -t $CONTAINER_RELEASE_IMAGE .
- docker push $CONTAINER_RELEASE_IMAGE
only:
- master deploy:
stage: deploy
script:
- scp -r mysql root@gitlab.luna.cn:/root/deploy
- scp docker-compose.yml root@gitlab.luna.cn:/root/deploy
- ssh root@gitlab.luna.cn "docker-compose --f /root/deploy/docker-compose.yml up -d --force-recreate "
- echo "Deploy to staging server"
only:
- master

一些参数的解释

image

代表要使用的基础docker镜像,一切构建都是在这个镜像下完成,也就是一个大环境,后面的命令必须要能在这个环境下能执行。

我指定这个是一个自带docker环境的镜像,它的信息可以到docker hub上查看。

variables

自定义变量,后面跟的是自定义的变量,$CI_REGISTRY_IMAGE等变量是gitlab-runner自带的变量。

before_script

前置脚本,也就是每个stages运行之前都会执行的命令。

stages

定义CI每个步骤,这个步骤是一个执行完才执行下一个的,上一个失败,全部失败。

关于远程发布ssh的补充

由于要全自动化发布,必须实现runner所在服务器和远程发布主机的无密登录。

ssh无密码登录,分为单向和双向,这里用单向的就可以了。

因为使用的是docker in docker 的方式运行runner,所以秘钥通过gitlab的环境变量进行传递。

1.远程主机生成ssh秘钥。

ssh-keygen -t rsa

命令输完一直回车到完成为止。

2.远程主机中把公钥设置到authorized_keys。

cd /root/.ssh
cat id_rsa.pub > authorized_keys

3.把私钥设置成环境变量。

使用gitlab构建基于docker的持续集成(三)

4.gitlab-ci.yml中给运行的容器设置runner私钥。

  #下面是登录远程服务器的设置sshkey操作
# 其中私有变量$SSH_PRIVATE_KEY 是远程服务器的ssh私匙
# 我使用的部署gitlab的服务器所以url是gitlab.luna.cn
- eval $(ssh-agent -s)
- ssh-add <(echo "$SSH_PRIVATE_KEY")
- mkdir -p ~/.ssh
- chmod 700 ~/.ssh
- ssh-keyscan gitlab.luna.cn > ~/.ssh/known_hosts
- chmod 644 ~/.ssh/known_hosts
- ssh -T root@gitlab.luna.cn

这样远程服务器的连接就设置完成了。

提交测试

使用gitlab构建基于docker的持续集成(三)
使用gitlab构建基于docker的持续集成(三)
使用gitlab构建基于docker的持续集成(三)
使用gitlab构建基于docker的持续集成(三)
使用gitlab构建基于docker的持续集成(三)
使用gitlab构建基于docker的持续集成(三)
使用gitlab构建基于docker的持续集成(三)