{"id":16358585,"url":"https://github.com/rcarmo/azure-pipelines-multiarch-docker","last_synced_at":"2025-03-23T01:32:01.204Z","repository":{"id":138320734,"uuid":"193235308","full_name":"rcarmo/azure-pipelines-multiarch-docker","owner":"rcarmo","description":"A reference example on how to build multi-arch Linux images using Azure Pipelines","archived":false,"fork":false,"pushed_at":"2019-06-22T18:42:52.000Z","size":71,"stargazers_count":17,"open_issues_count":1,"forks_count":6,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-18T16:22:37.098Z","etag":null,"topics":["amd64","arm32v7","arm64v8","azure","devops","docker","pipelines","zsh"],"latest_commit_sha":null,"homepage":null,"language":"Makefile","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rcarmo.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-06-22T13:09:52.000Z","updated_at":"2025-01-08T05:40:24.000Z","dependencies_parsed_at":null,"dependency_job_id":"19d8a61a-0a8f-42a7-814a-0dd49d6323c4","html_url":"https://github.com/rcarmo/azure-pipelines-multiarch-docker","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rcarmo%2Fazure-pipelines-multiarch-docker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rcarmo%2Fazure-pipelines-multiarch-docker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rcarmo%2Fazure-pipelines-multiarch-docker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rcarmo%2Fazure-pipelines-multiarch-docker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rcarmo","download_url":"https://codeload.github.com/rcarmo/azure-pipelines-multiarch-docker/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245044041,"owners_count":20551876,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["amd64","arm32v7","arm64v8","azure","devops","docker","pipelines","zsh"],"created_at":"2024-10-11T02:06:09.160Z","updated_at":"2025-03-23T01:32:01.194Z","avatar_url":"https://github.com/rcarmo.png","language":"Makefile","funding_links":[],"categories":[],"sub_categories":[],"readme":"# azure-pipelines-multiarch-docker\n\n[![Docker Stars](https://img.shields.io/docker/stars/insightful/ubuntu-gambit.svg)](https://hub.docker.com/r/insightful/ubuntu-gambit)\n[![Docker Pulls](https://img.shields.io/docker/pulls/insightful/ubuntu-gambit.svg)](https://hub.docker.com/r/insightful/ubuntu-gambit)\n[![](https://images.microbadger.com/badges/image/insightful/ubuntu-gambit.svg)](https://microbadger.com/images/insightful/ubuntu-gambit \"Get your own image badge on microbadger.com\")\n[![](https://images.microbadger.com/badges/version/insightful/ubuntu-gambit.svg)](https://microbadger.com/images/insightful/ubuntu-gambit \"Get your own version badge on microbadger.com\")\n[![Build Status](https://dev.azure.com/ruicarmo/insightfulsystems/_apis/build/status/rcarmo.azure-pipelines-multiarch-docker?branchName=master)](https://dev.azure.com/ruicarmo/insightfulsystems/_build/latest?definitionId=5\u0026branchName=master)\n\nThis is a shim/template repo for an Azure DevOps pipeline to build multi-architecture images:\n\n## Pipeline Structure\n\nAt the Azure Pipelines level, this creates:\n\n![stages](https://github.com/rcarmo/azure-pipelines-multiarch-docker/blob/master/img/stages.png?raw=true)\n\n* One independent stage for each CPU architecture\n* A \"wrap-up\" stage that runs after all the others that builds and publishes the Docker manifest file\n\n## Why?\n\nBecause I needed a simple, re-usable example of how to build multi-architecture images (in, this case, Linux for several different CPU architectures) that I could both re-use and share with customers.\n\n## How?\n\nImages are created atop a local base (in this case Ubuntu) with a corresponding `qemu-user-static` binary embedded, which allows most CI systems to build ARM images atop an `amd64` CPU.\n\nThe sample `src/Dockerfile` only installs `zsh` into that image, but the intent is that you can build this up from there.\n\n## Internals\n\nMost of the image generation logic (including embedding QEMU and building the final manifest that allows for automatic discovery of architecture-specific tags) lives inside the `Makefile`.\n\nThis is done because:\n\n* Having a `Makefile` allows for easy local testing\n* It also allows for easy movement between different CI systems\n* The actual architecture tagging (and mapping between different styles of architecture references) can be maintained inside the `Makefile`\n* Encapsulating that logic makes the CI YAML files considerably more readable\n\n## Projects Using This\n\n* [`insightful/alpine-node`](https://github.com/insightfulsystems/alpine-node)\n* [`insightful/ubuntu-gambit`](https://github.com/insightfulsystems/ubuntu-gambit)\n* [`insightful/ubuntu-gerbil`](https://github.com/insightfulsystems/ubuntu-gerbil)\n\n## Caveats\n\n* This does not cover multi-OS (Linux/Windows) images--the principles are the same, but that needs to split on the CI side to allow for different stages inside different VM agents.\n* This only uses Docker Hub (and requires `DOCKER_USERNAME` and `DOCKER_PASSWORD` to be set as private global variables for the pipeline--I recommend using linked variables at the organization level).\n* This does _not_ use the built-in Docker actions in Azure Pipelines (because they do not _yet_ support the experimental mode settings that are still required, as of June 2019, to build manifests).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frcarmo%2Fazure-pipelines-multiarch-docker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frcarmo%2Fazure-pipelines-multiarch-docker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frcarmo%2Fazure-pipelines-multiarch-docker/lists"}