自建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还能在测试通过后执行指定的发布脚本,令部署也能做到自动化,网上有很多相关的文章,这里也不再说明,等需要的时候再进行补充好了。
浙公网安备 33010602011771号