自建AppVeyor并使用容器进行CI/CD构建

  在上一篇文章《在Docker中自建AppVeyor并构建GitHub项目》中,描写了如何在Docker中使用AppVeyor。简单说来,就是在镜像中安装好AppVeyor,以及所需的编译环境。这里唯一的问题就是,如果需要编译多种语言,那么镜像中就需要安装多种编译环境,如.net core、Node.js、golang等,不同的语言可能还有不同的版本,如.net core 就有1.0~7.0那么多,很难说这么多环境会不会互相引起冲突。幸好,AppVeyor还有一种使用Docker进行项目构建的方式,通过指定cloud_type 为 docker,在容器中构建项目,如此一来,便可以针对不同环境使用不同的镜像来构建项目,令构建环境更干净。

  重新构建AppVeyor镜像

 


  首先,我们先构建一个只安装了AppVeyor的镜像。如果使用上一篇文章中的Dockerfile,那么可以忽略这一步。

# FROM mcr.microsoft.com/dotnet/sdk:6.0 不使用.net的镜像了
FROM ubuntu:focal    # 改成用ubuntu的
ENV DEBIAN_FRONTEND=noninteractive

RUN  sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list
RUN apt update \
    && apt install -y wget tzdata
 
run wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
run dpkg -i packages-microsoft-prod.deb
run rm packages-microsoft-prod.deb
# 安装必要的工具,特别时 powershell 命令行 appveyor.yml中使用sh脚本的话,也可以不安装powsershell RUN apt update \
&& apt install -y libcap2-bin ssh git powershell RUN wget https://www.appveyor.com/downloads/appveyor/appveyor-server.deb -O appveyor-server.deb run dpkg -i appveyor-server.deb run rm appveyor-server.deb WORKDIR /opt/appveyor/server EXPOSE 80 443 VOLUME [ "/etc/opt/appveyor/server" ] VOLUME [ "/var/opt/appveyor/server" ] ENTRYPOINT [ "./appveyor-server" ]

编辑完Dockerfile后,用命令将镜像构建出来

docker build -t appveyor:1.1 .

 

Docker-compose.yml


编辑 docker-compose.yml,这一步需要把docker.io 映射到容器中,便于Appveyor调用docker命令。

version: "3.4"

services:
  appveyor: 
    image: appveyor:1.1 #上一步构建好的镜像
    restart: always 
    ports:
      - "12300:80"  
    privileged: true 
    user: "root"
    volumes: 
      - /appveyordata:/var/opt/appveyor/server  # 这里可以与上一篇文章的设置相同
      - /appesttings:/etc/opt/appveyor/server   # 这里可以与上一篇文章的设置相同
- /var/run/docker.sock:/var/run/docker.sock # 注意,这里是必须的
- /usr/bin/docker:/usr/bin/docker # 注意,这里是必须的

接下来使用命令 docker-compose up 将容器跑起来

构建Appveyor-build-image的 Dockerfile

 


 

针对不同的语言,我们可以构建不同的镜像,基础的镜像需要使用 AppVeyor构建好的(可以在这里选择),然后安装对应语言SDK。我以.net core 6.0,ubuntu20.04的 环境为例,使用appveyor/build-image:minimal-ubuntu-20.04 作为基础

FROM appveyor/build-image:minimal-ubuntu-20.04   
user root
RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
 
run cat /etc/hosts
RUN apt-get update
run apt-get install -y wget
run wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
run dpkg -i packages-microsoft-prod.deb
run rm packages-microsoft-prod.deb
run apt-get update \
    && apt-get install -y dotnet-sdk-6.0  #安装 6.0 SDK

接下来使用 docker build 命令构建镜像,镜像名称为 appveyor/build-image:net6.0

docker build -t appveyor/build-image:net6.0 .

这一步执行完后,所需的环境就准备好了,接下来是配置AppVeyor。

配置AppVeyor


 

打开浏览器,进入到刚才启动的AppVeyor网站中,依次打开 System -> Build environment,点击Add Image,输入Name 和选择Os Type,点击Add

 

 

 接下来换到 Build clouds页签,我们看到有 Docker和Process 两个列表,Process其实就是我们默认的构建环境。

 

 

 接着点击Docker ,在Images下面填写 AppVeyor image name 和 Docker image。AppVeyor image name填写上一步中的名字,Docker image填写我们在 构建Appveyor-build-image的 Dockerfile  一节中构建好的镜像名称,我这里是appveyor/build-image:net6.0

 

 

 如此,环境便配好了。

配置appveyor.yml

 


接着我们编辑项目中的appveyor.yml。

version: 1.0.{build}  

  build_cloud:    #这里选择构建的类型
  - Docker

  image: net6.0   # 这里选择构建的镜像

  configuration: Release 

build:
  project: WebApplication1.sln
  verbosity: minimal

test_script:
- ps: dotnet test "XUnitTestProject1/XUnitTestProject1.csproj" --configuration Release--no-build

可以看到,除了多了 build_cloud 参数,其他都是一样的。提交代码到仓库。我们看到AppVeyor收到更新后启动了一个构建任务

 

 

 

 在构建的过程中,我们执行 docker ps 命令,可以看到有一个构建的容器运行了起来,并在构建结束后自动销毁。  

 结语


 

通过使用cloud_type = docker的方式,可以有效利用docker容器环境隔离的特性,为不同的项目使用不同的环境进行构建和用例测试,可以更好的模拟程序的运行环境。同时,在deploy步骤中,AppVeyor还能在测试通过后执行指定的发布脚本,令部署也能做到自动化,网上有很多相关的文章,这里也不再说明,等需要的时候再进行补充好了。

 

posted @ 2023-03-19 23:46  富贵东坡  阅读(319)  评论(0)    收藏  举报