准备条件:
1,centos,jenkins,docker,docker-compose
ps:jenkins我并没有使用docker,因为某些神奇的问题导致我没办法使用docker命令,所有直接装在了宿主机上,docker使用的是
Docker version 17.05.0-ce,docker容器编排我用的是docker-compose,下面的启动容器命令全都是docker-compose命令
原理:
这里其实利用的是docker的数据卷挂载功能,将宿主机上的源码目录挂在到.netcore 编译容器上,然后使用命令进入编译容器执行编译命令,
完成编译后,生成的项目文件会同步保存在宿主机上,这样就实现了直接在linux环境下编译.net项目,既然在linux能够直接编译了,那么发布就更简单了,发布请看我的另外一篇文章
开始操作:
1,jenkins创建任务,构建一个自由的风格的软件项目
2,配置git源,利用jenkins自动拉取最新代码进行编译
3,配置构建触发器,因为我的源码管理使用的是gogs,所有我的触发器使用的是gogs的webhook,这里可以使用jenkins的轮询功能,定时查找git源,发现有最新提交则开始编译,命令语法是CRON,不知道的可以自行百度,具体如下:
4,创建构建环境,命令如下:
这里的com_corebuild,其实是我已经启动好的微软的官方编译环境docker容器
docker exec -i com_corebuild /bin/bash -c "cd /workspace/YunCai.MarketManage/aspnet-core && dotnet publish -o ../../publish && exit"
cd aspnet-core/publish
docker rm -f yuncaiapi || true
docker rmi yuncaiapi || true
docker build -t yuncaiapi .
dockercs -f ~/yml/docker-compose.yml up -d yuncai
sleep 15s
dockercs -f ~/yml/docker-compose.yml logs yuncai
curl -I localhost:8084
第一行命令就是触发docker容器编译,第二行命令开始则是对编译好的文件执行发布,我用的是docker直接发布的方式
5,容器编排
下面我贴出启动编译容器和构建发布镜像和docker发布的命令和配置,如下:
启动com_corebuild:
corebuild:
container_name: com_corebuild
image: microsoft/aspnetcore-build
restart: "always"
volumes:
- /srv/aspnetcore/build/app:/app(为了保证编译容器能一直挂在后台我事先在宿主机上随便生成了一个demo项目,在容器启动后,运行这个demo,这样编译容器就不会在编译完成后退出了,这里将默认项目的宿主机目录挂载到容器上,在下面使用命令启动容器时,启动demo)
- /var/lib/jenkins/workspace:/workspace
working_dir: "/app"
command: "bash -c 'dotnet demo.dll'"
networks:
- db_network
构建项目发布镜像的Dockfile:
FROM microsoft/aspnetcore
WORKDIR /app
COPY . .
ENTRYPOINT ["dotnet", "YunCai.MarketManage.Web.Host.dll"]
使用项目镜像启动项目容器:
yuncai:
container_name: yuncaiapi
image: yuncaiapi
ports:
- "8084:80"
external_links:
- com_mariadb:mariadb
- redis:redis
- kafka:kafka
volumes:
- /etc/localtime:/etc/localtime
- /srv/aspnetcore/yuncai/wwwroot:/app/wwwroot
- /srv/aspnetcore/yuncai/logs:/app/Logs
restart: "always"
networks:
- db_network