From 8df196e6c9167dd50e0af1624b06eccfb4371602 Mon Sep 17 00:00:00 2001 From: lguohan Date: Sun, 14 Feb 2021 10:58:31 -0800 Subject: [PATCH] [ci]: add vstest (#795) Signed-off-by: Guohan Lu --- .../build-docker-sonic-vs-template.yml | 81 ++++++++++++++++ .azure-pipelines/build-swss-template.yml | 97 +++++++++++++++++++ .azure-pipelines/build-template.yml | 6 +- .azure-pipelines/build_and_install_module.sh | 87 +++++++++++++++++ .azure-pipelines/docker-sonic-vs/Dockerfile | 16 +++ .../test-docker-sonic-vs-template.yml | 75 ++++++++++++++ azure-pipelines.yml | 42 ++++++++ 7 files changed, 401 insertions(+), 3 deletions(-) create mode 100644 .azure-pipelines/build-docker-sonic-vs-template.yml create mode 100644 .azure-pipelines/build-swss-template.yml create mode 100755 .azure-pipelines/build_and_install_module.sh create mode 100644 .azure-pipelines/docker-sonic-vs/Dockerfile create mode 100644 .azure-pipelines/test-docker-sonic-vs-template.yml diff --git a/.azure-pipelines/build-docker-sonic-vs-template.yml b/.azure-pipelines/build-docker-sonic-vs-template.yml new file mode 100644 index 000000000000..e751694c8e81 --- /dev/null +++ b/.azure-pipelines/build-docker-sonic-vs-template.yml @@ -0,0 +1,81 @@ +parameters: +- name: arch + type: string + values: + - amd64 + - armhf + - arm64 + default: amd64 + +- name: timeout + type: number + default: 60 + +- name: swss_artifact_name + type: string + +- name: sairedis_artifact_name + type: string + +- name: swss_common_artifact_name + type: string + +- name: artifact_name + type: string + +jobs: +- job: + displayName: ${{ parameters.arch }} + timeoutInMinutes: ${{ parameters.timeout }} + + pool: + vmImage: 'ubuntu-20.04' + + steps: + - task: DownloadPipelineArtifact@2 + inputs: + source: specific + project: build + pipeline: 9 + artifact: ${{ parameters.swss_common_artifact_name }} + runVersion: 'latestFromBranch' + runBranch: 'refs/heads/master' + displayName: "Download sonic swss common deb packages" + - task: DownloadPipelineArtifact@2 + inputs: + artifact: ${{ parameters.sairedis_artifact_name }} + displayName: "Download sonic sairedis deb packages" + - task: DownloadPipelineArtifact@2 + inputs: + artifact: ${{ parameters.swss_artifact_name }} + displayName: "Download sonic swss artifact" + - task: DownloadPipelineArtifact@2 + inputs: + source: specific + project: build + pipeline: 1 + artifact: sonic-buildimage.vs + runVersion: 'latestFromBranch' + runBranch: 'refs/heads/master' + displayName: "Download sonic buildimage" + - script: | + echo $(Build.DefinitionName).$(Build.BuildNumber) + + docker load < ../target/docker-sonic-vs.gz + + mkdir -p .azure-pipelines/docker-sonic-vs/debs + + cp -v ../*.deb .azure-pipelines/docker-sonic-vs/debs + + pushd .azure-pipelines + + docker build --no-cache -t docker-sonic-vs:$(Build.DefinitionName).$(Build.BuildNumber) docker-sonic-vs + + popd + + docker save docker-sonic-vs:$(Build.DefinitionName).$(Build.BuildNumber) | gzip -c > $(Build.ArtifactStagingDirectory)/docker-sonic-vs.gz + displayName: "Build sonic-docker-vs" + + - publish: $(Build.ArtifactStagingDirectory)/ + artifact: ${{ parameters.artifact_name }} + displayName: "Archive sonic docker vs image" diff --git a/.azure-pipelines/build-swss-template.yml b/.azure-pipelines/build-swss-template.yml new file mode 100644 index 000000000000..9a0098c43dbe --- /dev/null +++ b/.azure-pipelines/build-swss-template.yml @@ -0,0 +1,97 @@ +parameters: +- name: arch + type: string + values: + - amd64 + - armhf + - arm64 + default: amd64 + +- name: pool + type: string + values: + - sonicbld + - default + default: default + +- name: timeout + type: number + default: 60 + +- name: sonic_slave + type: string + +- name: sairedis_artifact_name + type: string + +- name: swss_common_artifact_name + type: string + +- name: artifact_name + type: string + +jobs: +- job: + displayName: ${{ parameters.arch }} + timeoutInMinutes: ${{ parameters.timeout }} + + pool: + ${{ if ne(parameters.pool, 'default') }}: + name: ${{ parameters.pool }} + ${{ if eq(parameters.pool, 'default') }}: + vmImage: 'ubuntu-20.04' + + container: + image: sonicdev-microsoft.azurecr.io:443/${{ parameters.sonic_slave }}:latest + + steps: + - script: | + sudo apt-get install -y libhiredis0.14 libhiredis-dev + sudo apt-get install -y libzmq5 libzmq3-dev + sudo apt-get install -qq -y \ + libhiredis-dev \ + libnl-3-dev \ + libnl-genl-3-dev \ + libnl-route-3-dev \ + libnl-nf-3-dev \ + swig3.0 + sudo apt-get install -y libdbus-1-3 + sudo apt-get install -y libteam-dev \ + libteam5 \ + libteamdctl0 + displayName: "Install dependencies" + - task: DownloadPipelineArtifact@2 + inputs: + source: specific + project: build + pipeline: 9 + artifact: ${{ parameters.swss_common_artifact_name }} + runVersion: 'latestFromBranch' + runBranch: 'refs/heads/master' + displayName: "Download sonic swss common deb packages" + - task: DownloadPipelineArtifact@2 + inputs: + artifact: ${{ parameters.sairedis_artifact_name }} + displayName: "Download sonic sairedis deb packages" + - script: | + sudo dpkg -i libswsscommon_1.0.0_${{ parameters.arch }}.deb + sudo dpkg -i libswsscommon-dev_1.0.0_${{ parameters.arch }}.deb + sudo dpkg -i libsaivs_*.deb + sudo dpkg -i libsaivs-dev_*.deb + sudo dpkg -i libsairedis_*.deb + sudo dpkg -i libsairedis-dev_*.deb + sudo dpkg -i libsaimetadata_*.deb + sudo dpkg -i libsaimetadata-dev_*.deb + sudo dpkg -i syncd-vs_*.deb + workingDirectory: $(Pipeline.Workspace) + displayName: "Install sonic swss common and sairedis" + - checkout: sonic-swss + path: s + submodules: true + - script: | + ./autogen.sh + dpkg-buildpackage -us -uc -b -j$(nproc) && cp ../*.deb . + displayName: "Compile sonic swss" + - publish: $(System.DefaultWorkingDirectory)/ + artifact: ${{ parameters.artifact_name }} + displayName: "Archive swss debian packages" diff --git a/.azure-pipelines/build-template.yml b/.azure-pipelines/build-template.yml index fca262783701..e4a179679658 100644 --- a/.azure-pipelines/build-template.yml +++ b/.azure-pipelines/build-template.yml @@ -83,13 +83,13 @@ jobs: source: specific project: build pipeline: 9 - artifacts: ${{ parameters.swss_common_artifact_name }} + artifact: ${{ parameters.swss_common_artifact_name }} runVersion: 'latestFromBranch' runBranch: 'refs/heads/master' displayName: "Download sonic swss common deb packages" - script: | - sudo dpkg -i ${{ parameters.swss_common_artifact_name }}/libswsscommon_1.0.0_${{ parameters.arch }}.deb - sudo dpkg -i ${{ parameters.swss_common_artifact_name }}/libswsscommon-dev_1.0.0_${{ parameters.arch }}.deb + sudo dpkg -i libswsscommon_1.0.0_${{ parameters.arch }}.deb + sudo dpkg -i libswsscommon-dev_1.0.0_${{ parameters.arch }}.deb workingDirectory: $(Pipeline.Workspace) displayName: "Install sonic swss Common" - checkout: self diff --git a/.azure-pipelines/build_and_install_module.sh b/.azure-pipelines/build_and_install_module.sh new file mode 100755 index 000000000000..4bd026cb5259 --- /dev/null +++ b/.azure-pipelines/build_and_install_module.sh @@ -0,0 +1,87 @@ +#!/bin/bash +# +# build and install team/vrf driver +# + +set -e + +source /etc/os-release + +function build_and_install_kmodule() +{ + if sudo modprobe team 2>/dev/null && sudo modprobe vrf 2>/dev/null && sudo modprobe macsec 2>/dev/null; then + echo "The module team, vrf and macsec exist." + return + fi + + [ -z "$WORKDIR" ] && WORKDIR=$(mktemp -d) + cd $WORKDIR + + KERNEL_RELEASE=$(uname -r) + KERNEL_MAINVERSION=$(echo $KERNEL_RELEASE | cut -d- -f1) + EXTRAVERSION=$(echo $KERNEL_RELEASE | cut -d- -f2) + LOCALVERSION=$(echo $KERNEL_RELEASE | cut -d- -f3) + VERSION=$(echo $KERNEL_MAINVERSION | cut -d. -f1) + PATCHLEVEL=$(echo $KERNEL_MAINVERSION | cut -d. -f2) + SUBLEVEL=$(echo $KERNEL_MAINVERSION | cut -d. -f3) + + # Install the required debian packages to build the kernel modules + apt-get install -y build-essential linux-headers-${KERNEL_RELEASE} autoconf pkg-config fakeroot + apt-get install -y flex bison libssl-dev libelf-dev + apt-get install -y libnl-route-3-200 libnl-route-3-dev libnl-cli-3-200 libnl-cli-3-dev libnl-3-dev + + # Add the apt source mirrors and download the linux image source code + cp /etc/apt/sources.list /etc/apt/sources.list.bk + sed -i "s/^# deb-src/deb-src/g" /etc/apt/sources.list + apt-get update + apt-get source linux-image-unsigned-$(uname -r) > source.log + + # Recover the original apt sources list + cp /etc/apt/sources.list.bk /etc/apt/sources.list + apt-get update + + # Build the Linux kernel module drivers/net/team and vrf + cd $(find . -maxdepth 1 -type d | grep -v "^.$") + make allmodconfig + mv .config .config.bk + cp /boot/config-$(uname -r) .config + grep NET_TEAM .config.bk >> .config + echo CONFIG_NET_VRF=m >> .config + echo CONFIG_MACSEC=m >> .config + make VERSION=$VERSION PATCHLEVEL=$PATCHLEVEL SUBLEVEL=$SUBLEVEL EXTRAVERSION=-${EXTRAVERSION} LOCALVERSION=-${LOCALVERSION} modules_prepare + make M=drivers/net/team + mv drivers/net/Makefile drivers/net/Makefile.bak + echo 'obj-$(CONFIG_NET_VRF) += vrf.o' > drivers/net/Makefile + echo 'obj-$(CONFIG_MACSEC) += macsec.o' >> drivers/net/Makefile + make M=drivers/net + + # Install the module + TEAM_DIR=$(echo /lib/modules/$(uname -r)/kernel/net/team) + NET_DIR=$(echo /lib/modules/$(uname -r)/kernel/net) + if [ ! -e "$TEAM_DIR/team.ko" ]; then + mkdir -p $TEAM_DIR + cp drivers/net/team/*.ko $TEAM_DIR/ + modinfo $TEAM_DIR/team.ko + depmod + modprobe team + fi + if [ ! -e "$NET_DIR/vrf.ko" ]; then + mkdir -p $NET_DIR + cp drivers/net/vrf.ko $NET_DIR/ + modinfo $NET_DIR/vrf.ko + depmod + modprobe vrf + fi + if [ ! -e "$NET_DIR/macsec.ko" ]; then + mkdir -p $NET_DIR + cp drivers/net/macsec.ko $NET_DIR/ + modinfo $NET_DIR/macsec.ko + depmod + modprobe macsec + fi + + cd /tmp + rm -rf $WORKDIR +} + +build_and_install_kmodule diff --git a/.azure-pipelines/docker-sonic-vs/Dockerfile b/.azure-pipelines/docker-sonic-vs/Dockerfile new file mode 100644 index 000000000000..f2bfb425b945 --- /dev/null +++ b/.azure-pipelines/docker-sonic-vs/Dockerfile @@ -0,0 +1,16 @@ +FROM docker-sonic-vs + +ARG docker_container_name + +ADD ["debs", "/debs"] + +RUN dpkg -i /debs/libswsscommon_1.0.0_amd64.deb +RUN dpkg -i /debs/python-swsscommon_1.0.0_amd64.deb +RUN dpkg -i /debs/python3-swsscommon_1.0.0_amd64.deb + +RUN dpkg -i /debs/libsaimetadata_1.0.0_amd64.deb +RUN dpkg -i /debs/libsairedis_1.0.0_amd64.deb +RUN dpkg -i /debs/libsaivs_1.0.0_amd64.deb +RUN dpkg -i /debs/syncd-vs_1.0.0_amd64.deb + +RUN dpkg -i /debs/swss_1.0.0_amd64.deb diff --git a/.azure-pipelines/test-docker-sonic-vs-template.yml b/.azure-pipelines/test-docker-sonic-vs-template.yml new file mode 100644 index 000000000000..b0a22c86c931 --- /dev/null +++ b/.azure-pipelines/test-docker-sonic-vs-template.yml @@ -0,0 +1,75 @@ +parameters: +- name: timeout + type: number + default: 180 + +- name: log_artifact_name + type: string + +jobs: +- job: + displayName: vstest + timeoutInMinutes: ${{ parameters.timeout }} + + pool: + vmImage: 'ubuntu-20.04' + + steps: + - task: DownloadPipelineArtifact@2 + inputs: + artifact: docker-sonic-vs + displayName: "Download docker sonic vs image" + + - task: DownloadPipelineArtifact@2 + inputs: + source: specific + project: build + pipeline: 9 + artifact: sonic-swss-common.amd64.ubuntu20_04 + runVersion: 'latestFromBranch' + runBranch: 'refs/heads/master' + displayName: "Download sonic swss common deb packages" + + - checkout: self + displayName: "Checkout sonic-sairedis" + - checkout: sonic-swss + displayName: "Checkout sonic-swss" + + - script: | + set -x + sudo sonic-sairedis/.azure-pipelines/build_and_install_module.sh + + sudo apt-get install -y libhiredis0.14 + sudo dpkg -i --force-confask,confnew ../libswsscommon_1.0.0_amd64.deb || apt-get install -f + sudo dpkg -i ../python3-swsscommon_1.0.0_amd64.deb + + # install packages for vs test + sudo apt-get install -y net-tools bridge-utils vlan + sudo apt-get install -y python3-pip + sudo pip3 install pytest==4.6.2 attrs==19.1.0 exabgp==4.0.10 distro==1.5.0 docker==4.4.1 redis==3.3.4 flaky==3.7.0 + displayName: "Install dependencies" + + - script: | + set -x + sudo docker load -i ../docker-sonic-vs.gz + docker ps + ip netns list + pushd sonic-swss/tests + sudo py.test -v --force-flaky --junitxml=tr.xml --imgname=docker-sonic-vs:$(Build.DefinitionName).$(Build.BuildNumber) + displayName: "Run vs tests" + + - task: PublishTestResults@2 + inputs: + testResultsFiles: '**/tr.xml' + testRunTitle: vstest + condition: always() + + - script: | + cp -r sonic-swss/tests/log $(Build.ArtifactStagingDirectory)/ + displayName: "Collect logs" + condition: always() + + - publish: $(Build.ArtifactStagingDirectory)/ + artifact: ${{ parameters.log_artifact_name }}@$(System.JobAttempt) + displayName: "Publish logs" + condition: always() diff --git a/azure-pipelines.yml b/azure-pipelines.yml index e5ed7ad266be..a786b099771a 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -8,6 +8,13 @@ trigger: include: - "*" +resources: + repositories: + - repository: sonic-swss + type: github + name: Azure/sonic-swss + endpoint: build + stages: - stage: Build @@ -21,6 +28,10 @@ stages: syslog_artifact_name: sonic-sairedis.syslog run_unit_test: true +- stage: BuildArm + dependsOn: Build + condition: succeeded('Build') + jobs: - template: .azure-pipelines/build-template.yml parameters: arch: armhf @@ -40,3 +51,34 @@ stages: swss_common_artifact_name: sonic-swss-common.arm64 artifact_name: sonic-sairedis.arm64 syslog_artifact_name: sonic-sairedis.syslog.arm64 + +- stage: BuildSwss + dependsOn: Build + condition: succeeded('Build') + jobs: + - template: .azure-pipelines/build-swss-template.yml + parameters: + arch: amd64 + sonic_slave: sonic-slave-buster + swss_common_artifact_name: sonic-swss-common + sairedis_artifact_name: sonic-sairedis + artifact_name: sonic-swss + +- stage: BuildDocker + dependsOn: BuildSwss + condition: succeeded('BuildSwss') + jobs: + - template: .azure-pipelines/build-docker-sonic-vs-template.yml + parameters: + swss_common_artifact_name: sonic-swss-common + sairedis_artifact_name: sonic-sairedis + swss_artifact_name: sonic-swss + artifact_name: docker-sonic-vs + +- stage: Test + dependsOn: BuildDocker + condition: succeeded('BuildDocker') + jobs: + - template: .azure-pipelines/test-docker-sonic-vs-template.yml + parameters: + log_artifact_name: log