mirror of
https://github.com/factoriotools/factorio-docker.git
synced 2024-11-10 04:37:23 +01:00
98d3e475d3
* build and run on arm64 * multiarch docker build * add ARM64 warning to README.md
110 lines
3.3 KiB
Python
Executable File
110 lines
3.3 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
|
|
import os
|
|
import json
|
|
import subprocess
|
|
import shutil
|
|
import sys
|
|
import tempfile
|
|
|
|
|
|
PLATFORMS = [
|
|
"linux/arm64",
|
|
"linux/amd64",
|
|
]
|
|
|
|
|
|
def create_builder(build_dir, builder_name, platform):
|
|
check_exists_command = ["docker", "buildx", "inspect", builder_name]
|
|
if subprocess.run(check_exists_command, stderr=subprocess.DEVNULL).returncode != 0:
|
|
create_command = ["docker", "buildx", "create", "--platform", platform, "--name", builder_name]
|
|
try:
|
|
subprocess.run(create_command, cwd=build_dir, check=True)
|
|
except subprocess.CalledProcessError:
|
|
print("Creating builder failed")
|
|
exit(1)
|
|
|
|
|
|
def build_and_push_multiarch(build_dir, build_args, push):
|
|
builder_name = "factoriotools-multiarch"
|
|
platform=",".join(PLATFORMS)
|
|
create_builder(build_dir, builder_name, platform)
|
|
build_command = ["docker", "buildx", "build", "--platform", platform, "--builder", builder_name] + build_args
|
|
if push:
|
|
build_command.append("--push")
|
|
try:
|
|
subprocess.run(build_command, cwd=build_dir, check=True)
|
|
except subprocess.CalledProcessError:
|
|
print("Build and push of image failed")
|
|
exit(1)
|
|
|
|
|
|
def build_singlearch(build_dir, build_args):
|
|
build_command = ["docker", "build"] + build_args
|
|
try:
|
|
subprocess.run(build_command, cwd=build_dir, check=True)
|
|
except subprocess.CalledProcessError:
|
|
print("Build of image failed")
|
|
exit(1)
|
|
|
|
|
|
def push_singlearch(tags):
|
|
for tag in tags:
|
|
try:
|
|
subprocess.run(["docker", "push", f"factoriotools/factorio:{tag}"],
|
|
check=True)
|
|
except subprocess.CalledProcessError:
|
|
print("Docker push failed")
|
|
exit(1)
|
|
|
|
|
|
def build_and_push(sha256, version, tags, push, multiarch):
|
|
build_dir = tempfile.mktemp()
|
|
shutil.copytree("docker", build_dir)
|
|
build_args = ["--build-arg", f"VERSION={version}", "--build-arg", f"SHA256={sha256}", "."]
|
|
for tag in tags:
|
|
build_args.extend(["-t", f"factoriotools/factorio:{tag}"])
|
|
if multiarch:
|
|
build_and_push_multiarch(build_dir, build_args, push)
|
|
else:
|
|
build_singlearch(build_dir, build_args)
|
|
if push:
|
|
push_singlearch(tags)
|
|
|
|
|
|
def login():
|
|
try:
|
|
username = os.environ["DOCKER_USERNAME"]
|
|
password = os.environ["DOCKER_PASSWORD"]
|
|
subprocess.run(["docker", "login", "-u", username, "-p", password], check=True)
|
|
except KeyError:
|
|
print("Username and password need to be given")
|
|
exit(1)
|
|
except subprocess.CalledProcessError:
|
|
print("Docker login failed")
|
|
exit(1)
|
|
|
|
|
|
def main(push_tags=False, multiarch=False):
|
|
with open(os.path.join(os.path.dirname(__file__), "buildinfo.json")) as file_handle:
|
|
builddata = json.load(file_handle)
|
|
|
|
if push_tags:
|
|
login()
|
|
|
|
for version, buildinfo in builddata.items():
|
|
sha256 = buildinfo["sha256"]
|
|
tags = buildinfo["tags"]
|
|
build_and_push(sha256, version, tags, push_tags, multiarch)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
push_tags = False
|
|
multiarch = False
|
|
for arg in sys.argv[1:]:
|
|
if arg == "--push-tags":
|
|
push_tags = True
|
|
elif arg == "--multiarch":
|
|
multiarch = True
|
|
main(push_tags, multiarch)
|