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

gitlab
docker
aspnetcore
持续集成

构建发布思路:

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

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

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

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

aspnetcore 下的dockerfile编写

 

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的编写

 

安装构建思路,对应的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.把私钥设置成环境变量。



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

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

提交测试

 
 
 
 
 
 
 

最新文章

  1. Android学习十一:高德地图使用
  2. Oracle 11g新特性
  3. 关于sublime text2
  4. hive中同列多行数据组合的方法以及array to string要点(行转列)
  5. java中的File类
  6. Jersey MVC
  7. php面向对象(一) 初窥
  8. Java实现HTML代码生成PDF文档
  9. Redis学习手册
  10. Java基础知识强化之集合框架笔记34:List练习之集合的嵌套遍历
  11. debian网易163更新服务器 源
  12. 初探ExtJS(2)
  13. 新秀发挥云17号:RHEL改变以太网地址克隆虚拟机后,
  14. MVC和MVP设计模式
  15. PeopleSoft OLE Automation error in Workbooks.Open: ObjectDoMethod: Microsoft Excel 不能访问文件
  16. servlet之小demo(四)
  17. 蓝桥杯_算法训练_Torry的困惑(基本型)
  18. Pandas 基础(12) - Stack 和 Unstack
  19. Swift MD5加密
  20. 实训五(Cocos2dx-3.x 打包apk再理解)

热门文章

  1. OsgEarth开发笔记(三):Osg3.6.3+OsgEarth3.1+vs2019x64开发环境搭建(下)
  2. Codeforces Global Round 11【ABCD】
  3. 【uva 1515】Pool construction(图论--网络流最小割 模型题)
  4. Codeforces Round #665 (Div. 2) D - Maximum Distributed Tree dfs贡献记录
  5. CodeForces - 1140C
  6. 力扣992.K个不同整数的子数组-C语言实现
  7. Nestjs入门学习教程
  8. 在kubernetes集群里集成Apollo配置中心(1)之交付Apollo-adminservice至Kubernetes集群
  9. Bootstrap导航组件
  10. 2019牛客多校第二场E MAZE(线段树 + 矩阵)题解