在Docker中自建AppVeyor并构建GitHub项目
AppVeyor是一个持续集成的托管平台,它可以对GitHub等开源的项目提供免费支持,也可以通过自建方式,对私有库进行CI/CD流程,它支持Windows、Linux、MacOS系统,官网在这。
AppVeyor是用.net core编写的,所以对.net 项目的支持很友好,但它也支持不同语言的项目,像python、ruby、golang、C++等。我用来构建net core和golang的项目,体验都还不错。
如果你在github上的项目是开源的,那么你可以在官网上免费使用AppVeyor的服务,如果是私有的项目,也可以通过自建服务的方式,对项目进行持续的集成,这样每次提交代码到github后,都能自动的触发构建流程(注意,这需要你的服务能从公网访问)。
接下来简单介绍在Docker中运行AppVeyor服务并持续集成私有项目的方式,如果不想使用Docker,直接在官网下载安装包的方式也是可以的,选择对应的系统版本就可以了,使用方式没有不同。
编写Dockerfile
以构建.net core的项目为例,AppVeyor构建项目时需要有.net 的SDK,故我们使用.net 的镜像,同理,如果需要编译其他语言的环境,那么可以在Dockerfile中预先安装好相关的SDK。
#使用 .net 6.0的环境 FROM mcr.microsoft.com/dotnet/sdk:6.0-focal # 设置源 RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list RUN apt update # 安装 git 等环境 RUN apt install libcap2-bin git ssh -y RUN apt install wget -y # 下载 AppVeyor RUN wget https://www.appveyor.com/downloads/appveyor/appveyor-server.deb -O appveyor-server.deb # 安装 AppVeyor 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构建镜像,我将镜像名称命名为appveyor:1.0,打开命令行工具切换到Dockerfile的目录下,执行命令
docker build -t appveyor:1.0 .
编辑 docker-compose.yml
我的习惯是将docker命令编写成docker-compose.yml文件,好处是不用记docker命令。
version: "3.4" services: appveyor: image: appveyor:1.0 # 使用构建好的镜像 restart: always ports: - "12300:80" #暴露端口 privileged: true user: "root" network_mode: bridge volumes: - {yourdata}:/var/opt/appveyor/server #将目录映射到服务器,保留容器的文件 - {yourserver}:/etc/opt/appveyor/server #将目录映射到服务器,保留容器的文件
启动容器
将命令行工具切换到docker-compose.yml文件的目录下,执行命令
docker-compose up
打开 http://localhost:12300,就能看到AppVeyor的服务界面了。

第一次登陆需要设置初始账号,接着便是修改 Application public URL。路径是 System -> System settings

这个设置是为了自动关联github 项目的webhooks。
到此,AppVeyor已经算是跑起来了。
获取 github Personal access tokens
要获取个人仓库的项目,可以通过Personal access tokens的方式访问,点击 github 右上角用户图标 settings ->Developer settings -> Personal access tokens -> Generate new token,在这里创建访问仓库的token,token可以设置有效时间,我这里设置了永不过期

设置AppVeyor Account
在 AppVeyor网站中,设置github的token,路径是 Account -> Authorizations ,选择 github,并输入 上一步的gitihub中的 access token。点击确认,稍等一会儿后便看到个人仓库下的项目了。
创建项目并设置appveyor.yml
接下来是创建仓库和项目,我们以 asp.net core 默认的web项目为例,创建之后并在项目的目录下新增 appveyor.yml文件。

AppVeyor构建项目有两种方式,一种是在AppVeyor网站中配置,这种方式可能随着你的网站数据丢失而需要重新配置。一种便是通过文件设置,在仓库的根目录中添加appveyor.yml,当AppVeyor构建项目,如果根目录有appveyor.yml,便会优先使用文件的方式。文件的参数配置可以参考这里
以下是我的AppVeyor.yml配置,它只做两个步骤,1.构建项目,2.执行单元测试
version: 1.0.{build} configuration: Release build: project: WebApplication1.sln verbosity: minimal test_script: - ps: dotnet test "XUnitTestProject1/XUnitTestProject1.csproj" --configuration Release--no-build
这里的build执行的是MSBuild 命令,对于其他语言的项目,也可以改成 build_script,执行相应的构建命令,例如
version: 1.0.{build} configuration: Release
build_script:
- ps: dotnet build "Webapplication/WebApplication1.csproj"
test_script: - ps: dotnet test "XUnitTestProject1/XUnitTestProject1.csproj" --configuration Release--no-build
AppVeyor构建管道
AppVeyor的构建步骤一共有14步,每一步都可以执行自定义的脚本,这也是它为什么能支持多种语言项目的原因,我们只需要安装相应的构建环境,就能在自定义脚本中执行相应的命令。引用官方说明,它的步骤如图

项目自动化构建
在编写完appveyor.yml文件后,便能提交代码到仓库了。然后在AppVeyor服务中添加项目。路径是 Project -> new project ,选择 github,如果已经添加好 access token ,这时便能看到自己账号下的所有仓库了,选择刚刚提交的项目就可以了。

点击进去,点击 New Build 或者 Re-Build Command,就会执行构建操作了

如果任何一个步骤失败,都会构建失败,项目显示红色,绿色才是构建成功。
如果希望每次提交代码都执行构建,可以查看github上的webhooks 设置正确没有,路径是 github->{你的项目} -> Settings -> Webhooks。在右边便能看到,如果这个地址不是公网的地址,可以把它改成公网访问你的AppVeyor的地址。这样每次提交代码,github便会通知你的AppVeyor构建项目。

同时,AppVeyor还支持 github的 badges图标,可以让github 的 readme.md 文件显示构建结构,路径在Project -> Settings -> Badges 中,只需要把相应的Url拷贝到项目的 readme.md 中就可以了。注意地址需要是公网地址。

结尾
我们可以看到,AppVeyor构建项目的方式还是很灵活的,不管是在windows,linux,还是容器中,只需要安装相应的编译环境,并在appveyor.yml中配置脚本就可以了,例如,我们可以在Dockerfile中把npm也装上,这样就能使用npm命令编译前端项目了。在docker中运行可以保持构建环境的干净,避免各种未知环境的干扰。然而,当我们需要支持的语言越来越多,那需要安装的sdk也会越来越多,难以保证编译环境的干净。针对这种情况,AppVeyor还支持使用独立的容器来构建项目,这将在下一篇文章《自建AppVeyor并使用容器进行CI/CD构建》中描述。
浙公网安备 33010602011771号