使用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
posted @ 2022-08-26 11:13  青杉  阅读(258)  评论(0编辑  收藏  举报