前言
本文用一个flask项目作为示例,但任何类型项目的部署过程都与其类似,关键就在于Dockerfile和azure-piplines.yml这两个文件,读者需要根据自己的项目进行改动。
零. 项目准备
首先要有一个Flask项目,项目结构如下
MLflow-dashboard-restapi/
│
├── app.py
└── ......
(这里的app.py是接口文件,需要gunicorn使其在后台运行,否则pipline会卡住)
然后根目录下创建以下文件,注释的地方需要修改
a.requirements.txt
pandas
numpy
pmdarima
statsmodels
mlflow
matplotlib
scikit-learn
hyperopt
requests
#以上根据自己的项目所需的依赖修改
flask
gunicorn
b.Dockerfile(无后缀)
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . .
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "app:app"]
一. 新建 DockerHub 仓库
- DockerHub 官网注册账号并登录,记好username和password。
- 创建一个新的repository,记好Repositor Name。
二. Azure DevOps Docker Connection
- 登录到 Azure DevOps。
- Project Settings -> Service connections -> New service connection -> Docker Registry。
- 选择 Docker Hub,输入 DockerHub 账号和密码,Name自定,其他默认,点击Save。
三. 新建一个 agent 池
- 导航到 Azure DevOps -> Project Settings -> Agent pools -> Add pool。
- 创建一个新的 agent 池,Pool type选self-hosted,Name自定,其他默认。
四. 创建 azure-pipelines.yml
在项目根目录下创建 azure-pipelines.yml
文件,内容如下,注释的地方需要修改:
trigger:
- main
variables:
#根据自己的Azure service connection修改
dockerHubConnection: 'API_dockerhub'
#根据自己的Dockerhub修改
imageName: '<your dockerhub username>/<your dockerhub repo>'
pool:
#根据自己的agent修改
name: pipline1
demands:
- Agent.Version -gtVersion 2.182.1
steps:
- script: |
sudo apt-get update
sudo apt-get install -y python3 python3-pip
displayName: 'Install Python'
- script: |
python3 -m pip install --upgrade pip
pip3 install -r requirements.txt
displayName: 'Install dependencies'
- task: Docker@2
inputs:
containerRegistry: $(dockerHubConnection)
repository: $(imageName)
command: buildAndPush
Dockerfile: '$(Build.SourcesDirectory)/Dockerfile'
tags: |
latest
- script: |
docker ps -q | xargs -r docker stop
docker ps -a -q | xargs -r docker rm
displayName: 'Stop Existing Docker Containers'
- script: |
docker run -d -p 8000:8000 $(imageName):latest
displayName: 'Run Docker Container'
五. Azure 虚拟机
- 登录 Azure 门户Microsoft Azure。
- 创建一个新的虚拟机,选择合适的配置(可默认)和区域(我是East Asia),其他默认。
3.确保打开 8000 端口的入站规则(网络->填加入站规则)。
4.连接虚拟机
5.虚拟机会自动连接ssh
如果没有自动连接就输入命令:az ssh vm --resource-group DevOps1_group --vm-name DevOps1 --subscription ccb6b571-ebba-4942-affc-a32ffe56d00e
六. 虚拟机配置Docker
虚拟机中执行以下命令安装并登录docker:
sudo apt-get update
sudo apt-get install -y python3 python3-pip docker.io
sudo usermod -aG docker $USER
sudo newgrp docker
docker login
(注:这里还要根据自己的项目安装配置,如mysql,java等)
七. 虚拟机中配置代理并持续运行
- 在 Azure DevOps 中,导航到 Project Settings -> Agent pools,选择刚刚建好的agent pool,然后点击
New agent
。 - 点击下载链接
3.虚拟机中下载和配置代理
mkdir myagent && cd myagent
curl -O <刚复制的链接>
tar zxvf vsts-agent-linux-x64-2.182.1.tar.gz
./config.sh
4.持续运行代理,这里和官网步骤不一样
sudo ./svc.sh install
sudo ./svc.sh start
创建一个服务文件:
sudo nano /etc/systemd/system/vsts.agent.<YourProjectName>.<AgentPoolName>.service
#这里<YourProjectName>和<AgentPoolName>自己修改
在文件中添加以下内容,注释处根据自己项目修改:
[Unit]
Description=Azure Pipelines Agent (<YourProjectName>.<AgentPoolName>) #改
After=network.target
[Service]
ExecStart=/home/e1221771/myagent/runsvc.sh #改
User=<username> #这里可以输入命令whoami查询username
WorkingDirectory=/home/e1221771/myagent #改
KillMode=process
KillSignal=SIGTERM
TimeoutStopSec=5min
[Install]
WantedBy=multi-user.target
保存并退出,然后执行以下命令以使服务生效并启动,记得改命令:
sudo systemctl daemon-reload
sudo systemctl enable vsts.agent.<YourProjectName>.<AgentPoolName>.service #改
sudo systemctl start vsts.agent.<YourProjectName>.<AgentPoolName>.service #改
八. 提交上传项目,创建新的pipline并运行
先把本地项目push到Azure repo上,然后左侧导航栏pipline->New pipline,根据步骤链接到repo中的项目,并且选择azure-pipline.yml文件,最后run pipline。
此后每次在本地修改代码后直接输入下面3行命令就可以自动出发pipline并完成自动化部署了
git add .
git commit -m "devops"
git push
pipline成功运行
postman接口测试成功(红框处改成虚拟机的公共ip)
九. 重启虚拟机后需要做的
sudo systemctl start vsts.agent.<YourProjectName>.<AgentPoolName>.service #改
docker login