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


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


 

 

构建发布思路:

1.构建单元测试镜像,上传镜像仓库。
2.拉取测试镜像,执行单元测试。
3.构建发布镜像,上传镜像仓库。
4.使用docker-compose编排发布镜像和数据库镜像,打包发布,我把项目也发布到了gitlab.luna.cn服务器

aspnetcore 下的dockerfile编写

 

我的aspnetcore目录结构

 

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环境变量的设定

 

安装构建思路,对应的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 

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

提交测试

 

build

 

 

 

test

 

 

 

release

 

 

 

deploy

 

 

 

全部通过

 

 

 

查看发布情况

 

 

 

本地访问查看

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM