mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-31 07:03:55 +00:00 
			
		
		
		
	Move from docker manifest command to buildx with platforms (#4320)
This commit is contained in:
		
							
								
								
									
										88
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										88
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
								
							| @@ -30,6 +30,10 @@ jobs: | |||||||
|             TAG=$(cat esphome/const.py | sed -n -E "s/^__version__\s+=\s+\"(.+)\"$/\1/p") |             TAG=$(cat esphome/const.py | sed -n -E "s/^__version__\s+=\s+\"(.+)\"$/\1/p") | ||||||
|             today="$(date --utc '+%Y%m%d')" |             today="$(date --utc '+%Y%m%d')" | ||||||
|             TAG="${TAG}${today}" |             TAG="${TAG}${today}" | ||||||
|  |             BRANCH=${GITHUB_REF#refs/heads/} | ||||||
|  |             if [[ "$BRANCH" != "dev" ]]; then | ||||||
|  |               TAG="${TAG}-${BRANCH}" | ||||||
|  |             fi | ||||||
|           fi |           fi | ||||||
|           echo "tag=${TAG}" >> $GITHUB_OUTPUT |           echo "tag=${TAG}" >> $GITHUB_OUTPUT | ||||||
|         # yamllint enable rule:line-length |         # yamllint enable rule:line-length | ||||||
| @@ -57,7 +61,7 @@ jobs: | |||||||
|         run: twine upload dist/* |         run: twine upload dist/* | ||||||
|  |  | ||||||
|   deploy-docker: |   deploy-docker: | ||||||
|     name: Build and publish docker containers |     name: Build and publish ESPHome ${{ matrix.image.title}} | ||||||
|     if: github.repository == 'esphome/esphome' |     if: github.repository == 'esphome/esphome' | ||||||
|     permissions: |     permissions: | ||||||
|       contents: read |       contents: read | ||||||
| @@ -66,8 +70,19 @@ jobs: | |||||||
|     needs: [init] |     needs: [init] | ||||||
|     strategy: |     strategy: | ||||||
|       matrix: |       matrix: | ||||||
|         arch: [amd64, armv7, aarch64] |         image: | ||||||
|         build_type: ["ha-addon", "docker", "lint"] |           - title: "ha-addon" | ||||||
|  |             suffix: "hassio" | ||||||
|  |             target: "hassio" | ||||||
|  |             baseimg: "hassio" | ||||||
|  |           - title: "docker" | ||||||
|  |             suffix: "" | ||||||
|  |             target: "docker" | ||||||
|  |             baseimg: "docker" | ||||||
|  |           - title: "lint" | ||||||
|  |             suffix: "lint" | ||||||
|  |             target: "lint" | ||||||
|  |             baseimg: "docker" | ||||||
|     steps: |     steps: | ||||||
|       - uses: actions/checkout@v3 |       - uses: actions/checkout@v3 | ||||||
|       - name: Set up Python |       - name: Set up Python | ||||||
| @@ -92,54 +107,29 @@ jobs: | |||||||
|           username: ${{ github.actor }} |           username: ${{ github.actor }} | ||||||
|           password: ${{ secrets.GITHUB_TOKEN }} |           password: ${{ secrets.GITHUB_TOKEN }} | ||||||
|  |  | ||||||
|  |       - name: Generate short tags | ||||||
|  |         id: tags | ||||||
|  |         run: | | ||||||
|  |           docker/generate_tags.py \ | ||||||
|  |             --tag "${{ needs.init.outputs.tag }}" \ | ||||||
|  |             --suffix "${{ matrix.image.suffix }}" | ||||||
|  |  | ||||||
|       - name: Build and push |       - name: Build and push | ||||||
|         run: | |         uses: docker/build-push-action@v3 | ||||||
|           docker/build.py \ |  | ||||||
|             --tag "${{ needs.init.outputs.tag }}" \ |  | ||||||
|             --arch "${{ matrix.arch }}" \ |  | ||||||
|             --build-type "${{ matrix.build_type }}" \ |  | ||||||
|             build \ |  | ||||||
|             --push |  | ||||||
|  |  | ||||||
|   deploy-docker-manifest: |  | ||||||
|     if: github.repository == 'esphome/esphome' |  | ||||||
|     permissions: |  | ||||||
|       contents: read |  | ||||||
|       packages: write |  | ||||||
|     runs-on: ubuntu-latest |  | ||||||
|     needs: [init, deploy-docker] |  | ||||||
|     strategy: |  | ||||||
|       matrix: |  | ||||||
|         build_type: ["ha-addon", "docker", "lint"] |  | ||||||
|     steps: |  | ||||||
|       - uses: actions/checkout@v3 |  | ||||||
|       - name: Set up Python |  | ||||||
|         uses: actions/setup-python@v4 |  | ||||||
|         with: |         with: | ||||||
|           python-version: "3.9" |           context: . | ||||||
|       - name: Enable experimental manifest support |           file: ./docker/Dockerfile | ||||||
|         run: | |           platforms: linux/amd64,linux/arm/v7,linux/arm64 | ||||||
|           mkdir -p ~/.docker |           target: ${{ matrix.image.target }} | ||||||
|           echo "{\"experimental\": \"enabled\"}" > ~/.docker/config.json |           push: true | ||||||
|  |           # yamllint disable rule:line-length | ||||||
|       - name: Log in to docker hub |           cache-from: type=registry,ref=ghcr.io/${{ steps.tags.output.image }}:cache-${{ steps.tags.outputs.channel }} | ||||||
|         uses: docker/login-action@v2 |           cache-to: type=registry,ref=ghcr.io/${{ steps.tags.output.image }}:cache-${{ steps.tags.outputs.channel }},mode=max | ||||||
|         with: |           # yamllint enable rule:line-length | ||||||
|           username: ${{ secrets.DOCKER_USER }} |           tags: ${{ steps.tags.outputs.tags }} | ||||||
|           password: ${{ secrets.DOCKER_PASSWORD }} |           build-args: | | ||||||
|       - name: Log in to the GitHub container registry |             BASEIMGTYPE=${{ matrix.image.baseimg }} | ||||||
|         uses: docker/login-action@v2 |             BUILD_VERSION=${{ needs.init.outputs.tag }} | ||||||
|         with: |  | ||||||
|           registry: ghcr.io |  | ||||||
|           username: ${{ github.actor }} |  | ||||||
|           password: ${{ secrets.GITHUB_TOKEN }} |  | ||||||
|  |  | ||||||
|       - name: Run manifest |  | ||||||
|         run: | |  | ||||||
|           docker/build.py \ |  | ||||||
|             --tag "${{ needs.init.outputs.tag }}" \ |  | ||||||
|             --build-type "${{ matrix.build_type }}" \ |  | ||||||
|             manifest |  | ||||||
|  |  | ||||||
|   deploy-ha-addon-repo: |   deploy-ha-addon-repo: | ||||||
|     if: github.repository == 'esphome/esphome' && github.event_name == 'release' |     if: github.repository == 'esphome/esphome' && github.event_name == 'release' | ||||||
|   | |||||||
							
								
								
									
										68
									
								
								docker/generate_tags.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										68
									
								
								docker/generate_tags.py
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,68 @@ | |||||||
|  | #!/usr/bin/env python3 | ||||||
|  | import re | ||||||
|  | import os | ||||||
|  | import argparse | ||||||
|  | import json | ||||||
|  |  | ||||||
|  | CHANNEL_DEV = "dev" | ||||||
|  | CHANNEL_BETA = "beta" | ||||||
|  | CHANNEL_RELEASE = "release" | ||||||
|  |  | ||||||
|  | parser = argparse.ArgumentParser() | ||||||
|  | parser.add_argument( | ||||||
|  |     "--tag", | ||||||
|  |     type=str, | ||||||
|  |     required=True, | ||||||
|  |     help="The main docker tag to push to. If a version number also adds latest and/or beta tag", | ||||||
|  | ) | ||||||
|  | parser.add_argument( | ||||||
|  |     "--suffix", | ||||||
|  |     type=str, | ||||||
|  |     required=True, | ||||||
|  |     help="The suffix of the tag.", | ||||||
|  | ) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def main(): | ||||||
|  |     args = parser.parse_args() | ||||||
|  |  | ||||||
|  |     # detect channel from tag | ||||||
|  |     match = re.match(r"^(\d+\.\d+)(?:\.\d+)?(b\d+)?$", args.tag) | ||||||
|  |     major_minor_version = None | ||||||
|  |     if match is None: | ||||||
|  |         channel = CHANNEL_DEV | ||||||
|  |     elif match.group(2) is None: | ||||||
|  |         major_minor_version = match.group(1) | ||||||
|  |         channel = CHANNEL_RELEASE | ||||||
|  |     else: | ||||||
|  |         channel = CHANNEL_BETA | ||||||
|  |  | ||||||
|  |     tags_to_push = [args.tag] | ||||||
|  |     if channel == CHANNEL_DEV: | ||||||
|  |         tags_to_push.append("dev") | ||||||
|  |     elif channel == CHANNEL_BETA: | ||||||
|  |         tags_to_push.append("beta") | ||||||
|  |     elif channel == CHANNEL_RELEASE: | ||||||
|  |         # Additionally push to beta | ||||||
|  |         tags_to_push.append("beta") | ||||||
|  |         tags_to_push.append("latest") | ||||||
|  |  | ||||||
|  |         if major_minor_version: | ||||||
|  |             tags_to_push.append("stable") | ||||||
|  |             tags_to_push.append(major_minor_version) | ||||||
|  |  | ||||||
|  |     suffix = f"-{args.suffix}" if args.suffix else "" | ||||||
|  |  | ||||||
|  |     with open(os.environ["GITHUB_OUTPUT"], "w") as f: | ||||||
|  |         print(f"channel={channel}", file=f) | ||||||
|  |         print(f"image=esphome/esphome{suffix}", file=f) | ||||||
|  |         full_tags = [] | ||||||
|  |  | ||||||
|  |         for tag in tags_to_push: | ||||||
|  |             full_tags += [f"ghcr.io/esphome/esphome{suffix}:{tag}"] | ||||||
|  |             full_tags += [f"esphome/esphome{suffix}:{tag}"] | ||||||
|  |         print(f"tags={','.join(full_tags)}", file=f) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | if __name__ == "__main__": | ||||||
|  |     main() | ||||||
		Reference in New Issue
	
	Block a user