使用Azure DevOps 进行 docker .net core 自动部署
下载代理
代理服务器池的作用用于CI也可以用于CD
主要用于编译打包
部署的话使用部署池
当前下载到本地了
https://vstsagentpackage.azureedge.net/agent/2.188.4/vsts-agent-linux-x64-2.188.4.tar.gz
创建代理文件夹
mkdir myagent && cd myagent
sudo curl -OL https://vstsagentpackage.azureedge.net/agent/2.188.4/vsts-agent-linux-x64-2.188.4.tar.gz
解压
tar zxvf vsts-agent-linux-x64-2.188.4.tar.gz
配置代理 - 在目录 ~/myagent
下
./config.sh
这里可能会出现一些错误提示:Must not run with sudo
具体的解决方案请参考https://github.com/microsoft/azure-pipelines-agent/pull/1713/commits/15a5beea684fa35172d661f3253b93e210409fbb
注意:代理服务器是基于.NET CORE3.1编写,所以需要相应的运行环境,如果没有,请运行如下命令:
./bin/installdependencies.sh to install
当前的解决方案
修改 config.sh文件
if [ $user_id -eq 0 ]; then
echo "Must not run with sudo"
exit 1
fi
为
if [ $user_id -eq 0 ] && [ "${ALLOW_RUNASROOT:-default_value}" == "default_value" ]; then
echo "Must not run with sudo"
exit 1
fi
运行
./config.sh
或者
export ALLOW_RUNASROOT=1; ./config.sh --unattended
创建自己的访问令牌 (PAT) 进行身份验证
我当前的Azure DevOps网址为:https://机构.visualstudio.com/
在Azure DevOps中找到 User Setting
->Personal Access Tokens
User Setting
在右上角头像旁边
Create a new personal access token
Scopes选择Full access
当前token请妥善保存 在配置代理的时候需要使用
配置代理
Enter (Y/N) Accept the Team Explorer Everywhere license agreement now? (press enter for N) > y
>> Connect:
Enter server URL > https://dev.azure.com/机构名称
Enter authentication type (press enter for PAT) >
Enter personal access token > ****************************************************
Connecting to server ...
>> Register Agent:
Enter agent pool (press enter for default) > QSPool
Enter agent name (press enter for iz2ze5jl9wtbhfev2i9kqjz) >
Scanning for tool capabilities.
Connecting to the server.
Enter replace? (Y/N) (press enter for N) > y
Successfully replaced the agent
Testing agent connection.
Enter work folder (press enter for _work) >
2021-07-14 03:18:32Z: Settings Saved.
-
输入【Y】接受Team Explorer Everywhere许可协议;
-
输入服务器URL,即项目的Azure的地址;
我的Azure网站为
https://机构.visualstudio.com/
这里我输入https://dev.azure.com/机构名称
才正确 -
输入身份验证类型,这里直接回车,选择默认的PAT;
-
输入个人访问令牌,即PAT;
-
连接服务器成功后,输入创建好的代理池;
-
默认代理名称,也可以进行修改;
-
因为我之前已经创建过了,所以是否替换的选择选择了【Y】;
-
输入工作文件夹,直接回车,选择默认的【_work】;
然后运行启动命令:
./run.sh
如果出现Must not run interactively with sudo
也需要修改run.sh
文件
if [ $user_id -eq 0 -a -z "$AGENT_ALLOW_RUNASROOT" ]; then
echo "Must not run with sudo"
exit 1
fi
改为
if [ $user_id -eq 0 ] && [ "${ALLOW_RUNASROOT:-default_value}" == "default_value" ]; then
echo "Must not run with sudo"
exit 1
fi
采用服务的形式运行代理服务器
上面我们的代理服务器虽然上线了,但是在linux中是主线程的形式,退出就关闭了..
我们需要修改为服务的形式来运行.
运行命令安装服务:
sudo ./svc.sh install
启动服务:
sudo ./svc.sh start
查看服务状态:
sudo ./svc.sh status
停止服务:
sudo ./svc.sh stop
更新环境变量(当你有其他插件安装或者更新时)
./env.sh
sudo ./svc.sh stop
sudo ./svc.sh start
查看代理是否成功部署
在Azure DevOps网站中又下角设置找到
Agent pools
-> 代理名称->Agents
查看是否Online
创建CI持续集成管道
创建私有Docker Registry
首先需要到持续集成的服务器上 安装Docker Registry来获取我们的docker image
拉取registry镜像
docker pull registry:2.7.0
registry 2.7以上删除了包 apache2-utils
创建票据文件夹
mkdir -p ~/auth ~/auth/registry && cd ~/auth/registry
创建htpasswd
myuser :账号
mypassword:密码
docker run --entrypoint htpasswd registry:2.7.0 -Bbn myuser mypassword > htpasswd
创建文件夹
mkdir -p ~/data/registry
现在,我必须将我的凭据添加到注册表中。在这里,我将在容器中安装auth目录:
docker run -d -p 8081:5000 --restart=unless-stopped --name registry-auth \
-v /root/auth/registry:/auth \
-v /data/registry:/var/lib/registry \
-e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
registry
然后通过nginx代理配置https
配置后的地址为https://xxx:8081/v2
创建Service connections(服务连接)
在Azure DevOps网站中又下角设置找到
Service conntections
->New service connection
->选中Docker Registry点击下一步-> 选择others
https://index.docker.io/v2/ 配置的镜像代理 需要配置成https
Docker ID :myuser
Docker Password: mypassword
添写Service connection name点击保存
创建持续集成管道
找到Pipelines菜单->New pipeline
Connect :Azure Repos Git
Select:选择一个项目
//配置管道 选择 docker
Configure:docker
Yaml配置
# Docker
# Build a Docker image
# https://docs.microsoft.com/azure/devops/pipelines/languages/docker
trigger:
- master
resources:
- repo: self
variables:
tag: '$(Build.BuildId)'
stages:
- stage: Build
displayName: Build image
jobs:
- job: Build
displayName: Build
pool: QSPool
steps:
- task: Docker@2
inputs:
containerRegistry: 'QSDockerRegistry'
repository: 'qs.api'
command: 'buildAndPush'
Dockerfile: '**/Dockerfile'
安装git
-
安装 WANDisco 仓库包
yum install http://opensource.wandisco.com/centos/7/git/x86_64/wandisco-git-release-7-2.noarch.rpm
-
安装 Git
yum -y install git
-
版本验证
git version
安装aspnet:5.0失败
docker pull mcr.microsoft.com/dotnet/aspnet:5.0
Error response from daemon: Head https://mcr.microsoft.com/v2/dotnet/aspnet/manifests/5.0: read tcp 172.17.85.195:49560->13.75.34.156:443: read: connection reset by peer
该问题出现的原因是因为我们无法访问mcr.microsoft.com的镜像 需要更换一个可以访问的镜像源地址
拉取国内服务器上的镜像
加速的本质是因为我将镜像推送到了国内的服务器,目前在以下服务器均存在镜像:
阿里云:registry.cn-hangzhou.aliyuncs.com/newbe36524
腾讯云:ccr.ccs.tencentyun.com/mcr_newbe36524
docker pull registry.cn-hangzhou.aliyuncs.com/newbe36524/aspnet:5.0