Skip to content

Commit

Permalink
Patch 1.0.1 Release (#340)
Browse files Browse the repository at this point in the history
* Fix issue in reboot/restart flow and race condition in D2C messaging util (#242)

* - Fix an issue for image-based update scenario where the device doesn't reboot after the new image is installed.
- Add ADUC_D2C_Message_Type_Device_Properties to avoid a race condition.

* Update steps_handler.cpp

* Update steps_handler.cpp

* Update workflow_utils.c

Remove comment

* Address PR feedback

* Update how-to-build-agent-code.md

* Manually integrate PR #58

Co-authored-by: Pierrick Arsenault <pierrick.arsenault@stello.ca>

* revert clang-format.sh to avoid issues when pipe in staged content

* Disable clangformat in precommit hook due to cross ver compat

* Fix install-deps issue when --work-folder used on ubuntu 20.04

* Cleanup sandbox on start of deployment processing (#247)

* Added README section for Azure CLI (#254)

* Merge 'develop' into 'main' (#243) (#262) (#264)

Fix issue in reboot/restart flow and race condition in D2C messaging util (#242)

- Fix an issue for image-based update scenario where the device doesn't reboot after the new image is installed.
- Add ADUC_D2C_Message_Type_Device_Properties to avoid a race condition.


Note | These changes passed e2e verification internally.

Co-authored-by: Nox-MSFT <55153324+Nox-MSFT@users.noreply.github.com>

Co-authored-by: Nox-MSFT <55153324+Nox-MSFT@users.noreply.github.com>

* Use 'bool' instead of '_Bool' (#268)

* sort paths before asserting in systemutils_forEachDir tests (#265)

* sort paths before asserting in systemutils_forEachDir tests

* Revamp test to fully utilize test fixture instance and have bare minimum test code

* clang-format

* Remove stale debug trace from main() (#257)

* Fix many memory leaks and reenable UT (#283)

* fix memleak in workflow_get_workfolder

* Fix leak of hash array in workflow_get_update_file

* remove unused include in steps_handler

* clang-format steps_handler

* Remove unused include in file_test_utils

* memleak, use workflow_free in AutoWorkflowHandle

* split autoopendir impl, throw on opendir failure

* make findFilesInDir iterative,  guard non-dir arg

* uncomment source_update_cache_utils unit tests

* Fix many memleaks (valgrind) in MoveToUpdateCache

* Remove curl dependency in https_proxy_utils (Bug 42504722) (#282)

* Remove curl dependency in https_proxy_utils

* PR comments

* Remove mallocAndStrcpy_s header

* Update encoded test

* log result.ResultCode instead of result on nested edge startup failure (#280)

* remove do dep  packages

* fix install_aduc_deps

* Handle errors when download handler plugin symbol missing (#284)

* Make DH Factory LoadDownloadHandler noexcept
* Make DH Plugin noexcept
* throw plugin exception, extract DH extmgr helper
* Fix  ProcessDownloadHandlerExtensibility docs
* Add missing Log_Error for caught PluginException
* create erc for each dh export and rmv catch in ADUC_DownloadHandlerPlugin_OnUpdateWorkflowCompleted

* Bug 42442896: zlog - incorrect threadproc signature (#287)

* Removed log message for retrieving connection information from connection string (#292)

* Updated doxygen version (#289)

* Updated doxygen version

* Changed product name to reflect documentation and removed pre-version

* Changed install-deps to clean up after itself (#295)

* Updated install-deps to remove old files and cleanup after itself

* Fixed script errors

* one line fix (#297)

* use helper for recursive mkdir (#301)

* Try to reconnect to IoT Hub on bad credential or expired SAS token (when using AIS) (#298)

* Fix undefined references error in adu-shell (#305)

* Took Jeff's suggestion for removing the pthread_cancel calls (#302)

* Turn d2c_messaging unit tests into functional tests and skipped by default. (#306)

* use TestCaseFixture ptr, not void ptr (#308)

* fix zlog file handle leak (#310)

* fix zlog file handle leak

* set ret=1 upfront and ret 1 when RunAsDesiredUser returns false

* rmv last ret=1 straggler

* CP: Fix up issues with d2c_messaging.  Working on WIOT. Needs to be brought to develop. (#314)

Co-authored-by: Jeff Miller <jeffmill@microsoft.com>

* Fix build pipeline by fixing cpp-tidy errors (#313)

* Fix deadlock in zlog flush deinit (#315)

* Fix deadlock in zlog finish flush

* rmv flush thread

* use zlog_flush_buffer and init zlog_last_flushed to 0

* Fix regression in ADUC_Logging_Init to allow agent to start (#317)

* Update cached workfolder when processing replacement workflow (#322)

Fixes issue where replacement workflow processing uses the previous workflow's workfolder sandbox that was in the property cache.

* Update README.md (#294)

* Moved the output of catch from cout to cerr for all CATCH_CONFIG_RUNNER unit tests (#323)

* Mark test case "30 retries - httpStatus 401" as functional - takes 30s to run (#325)

Co-authored-by: Jeff Miller <jeffmill@microsoft.com>

* cherry-pick from wiot-s1 feature branch: GetConnectionInfoFromConnectionString crashes on failure. (#324) (#326)

Co-authored-by: Jeff Miller <jeffmill@microsoft.com>

* Fix overwrite of contract maj ver in downloaders and comp enumerator (#327)

* fix contract majVer overwrite with minVer in content downloaders and content enumerator

* fix contract comparison logic

* Fixes the E2E Pipeline so all tests pass and scenarios are run (#329)

* Removing the cppcheck and clang-tidy to see if that is what is causing the pipeline builds to fail

* Making linking changes to see if that fixes the build error

* Adding debug lines

* Added timeout failures

* Added call to set device name when configuring agent through config file - fixes diagnostics

* Removed output of the connection string during test

* Added input params checks to ConnectionStringUtils_IsNestedEdge to prevent test failures (#330)

* Added input params check to prevent bad access

* Changed null check to IsNullOrEmpty()

* Upgraded patch version (#331)

* Fix bug in swupdate-handler v2 example (#333)

* Solving merge conflicts main to develop (#338)

* Merge 'develop' into 'main' (#243)

Fix issue in reboot/restart flow and race condition in D2C messaging util (#242)

- Fix an issue for image-based update scenario where the device doesn't reboot after the new image is installed.
- Add ADUC_D2C_Message_Type_Device_Properties to avoid a race condition.


Note | These changes passed e2e verification internally.

* Update issue templates

* Update issue templates

* Update issue templates

Co-authored-by: Nox-MSFT <55153324+Nox-MSFT@users.noreply.github.com>
Co-authored-by: Esha Shah <92388818+eshashah-msft@users.noreply.github.com>

Co-authored-by: Nox-MSFT <55153324+Nox-MSFT@users.noreply.github.com>
Co-authored-by: Takashi Matsuoka <matsujirushi@live.jp>
Co-authored-by: jw-msft <84477130+jw-msft@users.noreply.github.com>
Co-authored-by: Pierrick Arsenault <pierrick.arsenault@stello.ca>
Co-authored-by: Andrew Brown <59940770+andrewbrownmsft@users.noreply.github.com>
Co-authored-by: Jeff Miller <jeffmill@microsoft.com>
Co-authored-by: Shiyi Peng <shiyipeng@microsoft.com>
Co-authored-by: shiyi-peng <71347127+shiyi-peng@users.noreply.github.com>
Co-authored-by: Esha Shah <92388818+eshashah-msft@users.noreply.github.com>
  • Loading branch information
10 people committed Jan 14, 2023
1 parent eb29f3c commit 79ce3ba
Show file tree
Hide file tree
Showing 141 changed files with 3,546 additions and 1,859 deletions.
2 changes: 1 addition & 1 deletion CMakeLists.txt
Expand Up @@ -47,7 +47,7 @@ set_cache_with_env_or_default (

set_cache_with_env_or_default (
ADUC_VERSION_PATCH
"0"
"1"
STRING
"The patch part of the semantic version")

Expand Down
133 changes: 66 additions & 67 deletions azurepipelines/build/templates/adu-docker-build-steps.yml
Expand Up @@ -2,77 +2,76 @@
# Consume this steps template in one or more jobs by passing in parameter values.

parameters:
- name: targetOs # example: ubuntu1804
type: string
- name: targetArch # example: amd64
type: string
- name: targetOs # example: ubuntu1804
type: string
- name: targetArch # example: amd64
type: string

steps:
- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0
displayName: "Component Detection"
inputs:
sourceScanPath: src

- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0
displayName: "Component Detection"
inputs:
sourceScanPath: src
- task: Docker@2
displayName: Login to ACR
inputs:
command: login
containerRegistry: aduccontainerregistry
repository: ${{parameters.targetOs}}-${{parameters.targetArch}}

- task: Docker@2
displayName: Login to ACR
inputs:
command: login
containerRegistry: aduccontainerregistry
repository: ${{parameters.targetOs}}-${{parameters.targetArch}}
- task: Docker@2
displayName: Pull latest build image
inputs:
command: pull
containerRegistry: aduccontainerregistry
arguments: "aduccontainerregistry.azurecr.io/${{parameters.targetOs}}-${{parameters.targetArch}}:latest"

- task: Docker@2
displayName: Pull latest build image
inputs:
command: pull
containerRegistry: aduccontainerregistry
arguments: "aduccontainerregistry.azurecr.io/${{parameters.targetOs}}-${{parameters.targetArch}}:latest"
- bash: |
echo "Running whoami"
whoami
echo "Register QEMU"
sudo docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
echo "Listing running containers"
sudo docker ps -a
echo "Listing current images"
sudo docker images
displayName: "Prebuild"
condition: always()
- bash: |
sudo docker run -d -t --rm -v $(Build.SourcesDirectory):/iot-hub-device-update -v ~/.gitconfig:/etc/.gitconfig --name ARMcontainer aduccontainerregistry.azurecr.io/${{parameters.targetOs}}-${{parameters.targetArch}}:latest bash
displayName: "Run docker container"
- bash: |
sudo docker exec -w /iot-hub-device-update ARMcontainer scripts/build.sh --clean --build-unit-tests --type MinSizeRel --platform-layer linux --log-lib zlog --build-packages --out-dir out-${{parameters.targetOs}}-${{parameters.targetArch}}
displayName: "Build Client, Unit Tests and Packages: linux-MinSizeRel"
- bash: |
cp out-${{parameters.targetOs}}-${{parameters.targetArch}}/*.deb $(Build.ArtifactStagingDirectory)
cp out-${{parameters.targetOs}}-${{parameters.targetArch}}/src/agent/out-${{parameters.targetOs}}-${{parameters.targetArch}}/bin/AducIotAgent $(Build.ArtifactStagingDirectory)/AducIotAgent
displayName: "Stage build artifacts (Deb package, agent and docs)"
condition: ne(variables['Build.Reason'], 'PullRequest')
- bash: |
sudo docker exec -w /iot-hub-device-update/out-${{parameters.targetOs}}-${{parameters.targetArch}} ARMcontainer ctest --repeat until-pass:10 --force-new-ctest-process -T test -V --output-on-failure
displayName: "Run Unit Tests: linux-MinSizeRel"
- task: PublishTestResults@2
displayName: "Publish Unit Test Results: linux-MinSizeRel"
condition: succeededOrFailed() # Run this task even if tests fail.
inputs:
testResultsFormat: cTest
testResultsFiles: "Testing/**/*.xml"
searchFolder: out-${{parameters.targetOs}}-${{parameters.targetArch}}
failTaskOnFailedTests: true
publishRunAttachments: false # Attachments are not supported for CTest

- bash: |
echo "Running whoami"
whoami
echo "Register QEMU"
sudo docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
echo "Listing running containers"
sudo docker ps -a
echo "Listing current images"
sudo docker images
displayName: "Prebuild"
condition: always()
- bash: |
sudo docker run -d -t --rm -v $(Build.SourcesDirectory):/iot-hub-device-update -v ~/.gitconfig:/etc/.gitconfig --name ARMcontainer aduccontainerregistry.azurecr.io/${{parameters.targetOs}}-${{parameters.targetArch}}:latest bash
displayName: "Run docker container"
- bash: |
sudo docker exec -w /iot-hub-device-update ARMcontainer scripts/build.sh --clean --build-unit-tests --type MinSizeRel --platform-layer linux --log-lib zlog --build-packages --static-analysis clang-tidy,cppcheck --out-dir out-${{parameters.targetOs}}-${{parameters.targetArch}}
displayName: "Build Client, Unit Tests and Packages: linux-MinSizeRel"
- bash: |
cp out-${{parameters.targetOs}}-${{parameters.targetArch}}/*.deb $(Build.ArtifactStagingDirectory)
cp out-${{parameters.targetOs}}-${{parameters.targetArch}}/src/agent/out-${{parameters.targetOs}}-${{parameters.targetArch}}/bin/AducIotAgent $(Build.ArtifactStagingDirectory)/AducIotAgent
displayName: "Stage build artifacts (Deb package, agent and docs)"
condition: ne(variables['Build.Reason'], 'PullRequest')
- bash: |
sudo docker exec -w /iot-hub-device-update/out-${{parameters.targetOs}}-${{parameters.targetArch}} ARMcontainer ctest --repeat until-pass:10 --force-new-ctest-process -T test -V --output-on-failure
displayName: "Run Unit Tests: linux-MinSizeRel"
- task: PublishTestResults@2
displayName: "Publish Unit Test Results: linux-MinSizeRel"
condition: succeededOrFailed() # Run this task even if tests fail.
inputs:
testResultsFormat: cTest
testResultsFiles: "Testing/**/*.xml"
searchFolder: out-${{parameters.targetOs}}-${{parameters.targetArch}}
failTaskOnFailedTests: true
publishRunAttachments: false # Attachments are not supported for CTest
- task: PublishPipelineArtifact@0
displayName: "Publish Pipeline Artifacts"
inputs:
artifactName: "adu-client-${{parameters.targetOs}}-${{parameters.targetArch}}"
targetPath: "$(Build.ArtifactStagingDirectory)"

- task: PublishPipelineArtifact@0
displayName: "Publish Pipeline Artifacts"
inputs:
artifactName: "adu-client-${{parameters.targetOs}}-${{parameters.targetArch}}"
targetPath: "$(Build.ArtifactStagingDirectory)"

# Stop the running container at the end of the build job
# Remove output directory to prevent persisting across build jobs
- bash: |
sudo docker stop ARMcontainer
sudo rm -rf out-${{parameters.targetOs}}-${{parameters.targetArch}}
displayName: "Postbuild"
condition: always()
# Stop the running container at the end of the build job
# Remove output directory to prevent persisting across build jobs
- bash: |
sudo docker stop ARMcontainer
sudo rm -rf out-${{parameters.targetOs}}-${{parameters.targetArch}}
displayName: "Postbuild"
condition: always()
166 changes: 83 additions & 83 deletions azurepipelines/build/templates/adu-native-build-steps.yml
Expand Up @@ -2,99 +2,99 @@
# Consume this steps template in one or more jobs by passing in parameter values.

parameters:
- name: targetOs # example: ubuntu1804
type: string
- name: targetArch # example: amd64
type: string
- name: targetOs # example: ubuntu1804
type: string
- name: targetArch # example: amd64
type: string

steps:
- ${{ if eq(parameters.targetArch, 'amd64') }}:
- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0
displayName: "Component Detection"
inputs:
sourceScanPath: src
- ${{ if eq(parameters.targetArch, 'amd64') }}:
- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0
displayName: "Component Detection"
inputs:
sourceScanPath: src

- task: Bash@3
displayName: "Install ADUC dependencies"
inputs:
targetType: "filePath"
filePath: $(Build.SourcesDirectory)/scripts/install-deps.sh
arguments: --install-all-deps
- task: Bash@3
displayName: "Install ADUC dependencies"
inputs:
targetType: "filePath"
filePath: $(Build.SourcesDirectory)/scripts/install-deps.sh
arguments: --install-all-deps

- task: Bash@3
displayName: "Build Client, Unit Tests and Packages: linux-MinSizeRel"
inputs:
targetType: "filePath"
filePath: $(Build.SourcesDirectory)/scripts/build.sh
arguments: "--clean --type MinSizeRel --platform-layer linux --log-lib zlog --build-packages --build-unit-tests --static-analysis clang-tidy,cppcheck --out-dir $(Build.BinariesDirectory)"
- task: Bash@3
displayName: "Build Client, Unit Tests and Packages: linux-MinSizeRel"
inputs:
targetType: "filePath"
filePath: $(Build.SourcesDirectory)/scripts/build.sh
arguments: "--clean --type MinSizeRel --platform-layer linux --log-lib zlog --build-packages --build-unit-tests --out-dir $(Build.BinariesDirectory)"

- bash: |
cp $(Build.BinariesDirectory)/*.deb $(Build.ArtifactStagingDirectory)
cp $(Build.BinariesDirectory)/bin/AducIotAgent $(Build.ArtifactStagingDirectory)/AducIotAgent
displayName: "Stage build artifacts (Deb package, agent and docs)"
condition: ne(variables['Build.Reason'], 'PullRequest')
- bash: |
cp $(Build.BinariesDirectory)/*.deb $(Build.ArtifactStagingDirectory)
cp $(Build.BinariesDirectory)/bin/AducIotAgent $(Build.ArtifactStagingDirectory)/AducIotAgent
displayName: "Stage build artifacts (Deb package, agent and docs)"
condition: ne(variables['Build.Reason'], 'PullRequest')
# Run all unit tests.
- bash: |
ctest --repeat until-pass:5 --timeout 300 --force-new-ctest-process -T test -V --output-on-failure
exit $?
displayName: "Run Unit Tests: linux-MinSizeRel"
workingDirectory: $(Build.BinariesDirectory)
# Run all unit tests.
- bash: |
ctest --repeat until-pass:5 --timeout 300 --force-new-ctest-process -T test -V --output-on-failure
exit $?
displayName: "Run Unit Tests: linux-MinSizeRel"
workingDirectory: $(Build.BinariesDirectory)
- task: PublishTestResults@2
displayName: "Publish Unit Test Results: linux-MinSizeRel"
condition: succeededOrFailed() # Run this task even if tests fail.
inputs:
testResultsFormat: cTest
testResultsFiles: "Testing/**/*.xml"
searchFolder: $(Build.BinariesDirectory)
failTaskOnFailedTests: true
publishRunAttachments: false # Attachments are not supported for CTest
- task: PublishTestResults@2
displayName: "Publish Unit Test Results: linux-MinSizeRel"
condition: succeededOrFailed() # Run this task even if tests fail.
inputs:
testResultsFormat: cTest
testResultsFiles: "Testing/**/*.xml"
searchFolder: $(Build.BinariesDirectory)
failTaskOnFailedTests: true
publishRunAttachments: false # Attachments are not supported for CTest

- task: Bash@3
displayName: "Build Client and Unit Tests: linux-Debug"
inputs:
targetType: "filePath"
filePath: $(Build.SourcesDirectory)/scripts/build.sh
arguments: "--clean --build-unit-tests --platform-layer linux --log-lib zlog --static-analysis clang-tidy,cppcheck --out-dir $(Build.BinariesDirectory)"
- task: Bash@3
displayName: "Build Client and Unit Tests: linux-Debug"
inputs:
targetType: "filePath"
filePath: $(Build.SourcesDirectory)/scripts/build.sh
arguments: "--clean --build-unit-tests --platform-layer linux --log-lib zlog --static-analysis clang-tidy,cppcheck --out-dir $(Build.BinariesDirectory)"

# Run all unit tests.
- bash: |
ctest --repeat until-pass:5 --timeout 300 --force-new-ctest-process -T test -V --output-on-failure
exit $?
displayName: "Run Unit Tests: linux-Debug"
workingDirectory: $(Build.BinariesDirectory)
# Run all unit tests.
- bash: |
ctest --repeat until-pass:5 --timeout 300 --force-new-ctest-process -T test -V --output-on-failure
exit $?
displayName: "Run Unit Tests: linux-Debug"
workingDirectory: $(Build.BinariesDirectory)
- task: PublishTestResults@2
displayName: "Publish Unit Test Results: linux-Debug"
condition: succeededOrFailed() # Run this task even if tests fail.
inputs:
testResultsFormat: cTest
testResultsFiles: "Testing/**/*.xml"
searchFolder: $(Build.BinariesDirectory)
failTaskOnFailedTests: true
publishRunAttachments: false # Attachments are not supported for CTest
- task: PublishTestResults@2
displayName: "Publish Unit Test Results: linux-Debug"
condition: succeededOrFailed() # Run this task even if tests fail.
inputs:
testResultsFormat: cTest
testResultsFiles: "Testing/**/*.xml"
searchFolder: $(Build.BinariesDirectory)
failTaskOnFailedTests: true
publishRunAttachments: false # Attachments are not supported for CTest

- task: PublishPipelineArtifact@0
displayName: "Publish Pipeline Artifacts"
inputs:
artifactName: "adu-client-${{parameters.targetOs}}-${{parameters.targetArch}}"
targetPath: "$(Build.ArtifactStagingDirectory)"
- task: PublishPipelineArtifact@0
displayName: "Publish Pipeline Artifacts"
inputs:
artifactName: "adu-client-${{parameters.targetOs}}-${{parameters.targetArch}}"
targetPath: "$(Build.ArtifactStagingDirectory)"

# Ignore SC2164: Use 'cd ... || exit' or 'cd ... || return' in case cd fails.
# We usually want to return an error code from a specific, previous command
# even if popd, pushd, or cd fails.
# Ignore SC2209: Use var=$(command) to assign output (or quote to assign string).
# We use 'ret=return' or 'ret=exit' to support dot sourcing.
- ${{ if eq(parameters.targetArch, 'amd64') }}:
- bash: |
/tmp/deviceupdate-shellcheck --shell=bash $(find -name "*.sh" | grep -v -e '^\.\/out')
exit $?
displayName: "Run ShellCheck"
# Ignore SC2164: Use 'cd ... || exit' or 'cd ... || return' in case cd fails.
# We usually want to return an error code from a specific, previous command
# even if popd, pushd, or cd fails.
# Ignore SC2209: Use var=$(command) to assign output (or quote to assign string).
# We use 'ret=return' or 'ret=exit' to support dot sourcing.
- ${{ if eq(parameters.targetArch, 'amd64') }}:
- bash: |
/tmp/deviceupdate-shellcheck --shell=bash $(find -name "*.sh" | grep -v -e '^\.\/out')
exit $?
displayName: "Run ShellCheck"
- ${{ if eq(parameters.targetArch, 'amd64') }}:
- task: ComponentGovernanceComponentDetection@0
inputs:
scanType: "Register"
verbosity: "Verbose"
alertWarningLevel: "High"
- ${{ if eq(parameters.targetArch, 'amd64') }}:
- task: ComponentGovernanceComponentDetection@0
inputs:
scanType: "Register"
verbosity: "Verbose"
alertWarningLevel: "High"
Expand Up @@ -31,7 +31,7 @@ def main():

if (len(connectionString) == 0):
print_error("Failed to create the device in the IotHub")
exit(1)
sys.exit(1)

#
# Create the du-config.json JSON Object
Expand Down
Expand Up @@ -68,6 +68,7 @@ def test_diagnostics(self):
# device status represent Log upload status, operatin status represent background operation status
#
diagnosticJsonStatus = DiagnosticLogCollectionStatusResponse()

for i in range(0, diagnostics_operation_status_retries):
time.sleep(5)
diagnosticJsonStatus = self.duTestHelper.GetDiagnosticsLogCollectionStatus(self.operationId)
Expand Down
Expand Up @@ -34,7 +34,7 @@ def main():

if (len(connectionString) == 0):
print_error("Failed to create the device in the IotHub")
exit(1)
sys.exit(1)

#
# Create the du-config.json JSON Object
Expand Down
Expand Up @@ -34,7 +34,7 @@ def main():

if (len(connectionString) == 0):
print_error("Failed to create the device in the IotHub")
exit(1)
sys.exit(1)

#
# Create the du-config.json JSON Object
Expand Down
Expand Up @@ -37,7 +37,6 @@ def main():
print_error("Failed to create the device in the IotHub")
sys.exit(1)


#
# Create the du-config.json JSON Object
#
Expand Down
4 changes: 2 additions & 2 deletions docs/agent-reference/how-to-build-agent-code.md
Expand Up @@ -25,7 +25,7 @@ to connect to IoT Hub and call Azure IoT Plug and Play APIs.

The [Delivery Optimization
SDK](https://github.com/microsoft/do-client)
SDK provides a robust way for the client to download an update.
provides a robust way for the client to download an update.

## Building the Device Update Agent for Linux

Expand All @@ -49,7 +49,7 @@ To install all dependencies run:
To install only the dependencies necessary for the agent:

```shell
./scripts/install-deps.sh --install-aduc-deps --install-packages
./scripts/install-deps.sh --install-aduc-deps --install-packages --install-do
```

`install-deps.sh` also provides several options for installing individual
Expand Down

0 comments on commit 79ce3ba

Please sign in to comment.