diff --git a/Dockerfile b/Dockerfile index 54aabd355baf1fc0a88b7b006d73c19a1be08ae5..0e0671f1478531ddf21f801fd70e6d7c2cfc7e97 100644 --- a/Dockerfile +++ b/Dockerfile @@ -11,18 +11,23 @@ LABEL maintainer="Max Reinheimer <max@reinheimer.dev>" \ description="A GitLab runner image with openstack custom executor." \ io.k8s.description="A GitLab runner image with openstack custom executor." -COPY cleanup.py env.py config.sh prepare.py run.py requirements.txt /data/ -COPY entrypoint.sh /usr/bin/entrypoint +COPY requirements.txt /data/ + +WORKDIR /data RUN apt-get update && apt-get -y install curl dumb-init gcc libffi-dev && \ curl -L --output /usr/bin/gitlab-runner "${GITLAB_RUNNER_URL}" && \ pip3 install -r /data/requirements.txt && \ - chmod +x /data/* /usr/bin/entrypoint /usr/bin/gitlab-runner && \ + chmod +x /usr/bin/gitlab-runner && \ useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash && \ apt-get remove -y gcc curl && apt autoremove -y && apt-get clean +COPY cleanup.py env.py config.sh prepare.py run.py /data/ +COPY entrypoint.sh /usr/bin/entrypoint + +RUN chmod +x /data/* /usr/bin/entrypoint + USER gitlab-runner -WORKDIR /data ENTRYPOINT ["dumb-init", "--"] CMD ["entrypoint"] diff --git a/entrypoint.sh b/entrypoint.sh index 9fba9a8bce0ab08a50d781eadbfefc078b5277e4..bff9d067c992747a790f610a20faae7857ed3b62 100644 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -1,6 +1,6 @@ #!/bin/bash -trap cleanup SIGTERM +trap cleanup SIGTERM SIGINT cleanup() { gitlab-runner unregister --all-runners diff --git a/env.py b/env.py index 487f8880336a0d355e9ec174e474d15ad7bfabc5..bc34c6bf834e92e39aca9cb4b1edbfaa9d2ed18c 100644 --- a/env.py +++ b/env.py @@ -9,7 +9,8 @@ KEY_PAIR_NAME = os.getenv("CUSTOM_ENV_KEY_PAIR_NAME") or os.getenv("KEY_PAIR_NAM SECURITY_GROUPS = os.getenv("CUSTOM_ENV_SECURITY_GROUPS") or os.getenv("SECURITY_GROUPS") USERNAME = os.getenv("CUSTOM_ENV_USERNAME") or os.getenv("USERNAME") PRIVATE_KEY_PATH = f"{os.getenv('HOME')}/priv_key" -SSH_TIMEOUT = os.getenv("CUSTOM_ENV_SSH_TIMEOUT") or os.getenv("SSH_TIMEOUT") or "30" - +SSH_TIMEOUT = os.getenv("CUSTOM_ENV_SSH_TIMEOUT") or os.getenv("SSH_TIMEOUT") or "20" +FLOATING_IP_NETWORK = os.getenv("FLOATING_IP_NETWORK") or "public" +SSH_IP_VERSION = os.getenv("SSH_IP_VERSION") or "4" BUILD_FAILURE_EXIT_CODE = os.getenv("BUILD_FAILURE_EXIT_CODE") SYSTEM_FAILURE_EXIT_CODE = os.getenv("SYSTEM_FAILURE_EXIT_CODE") diff --git a/prepare.py b/prepare.py index 23885c2ba60340fbaff1b41f2cf2933ea9692477..ec2e3bd7d8db2d99dd7fe871e255619e38e79d43 100644 --- a/prepare.py +++ b/prepare.py @@ -26,13 +26,22 @@ def provision_server( security_groups=[{"name": group} for group in env.SECURITY_GROUPS.split()], networks=[{"uuid": network.id}], ) - return conn.compute.wait_for_server(server, wait=600) + server = conn.compute.wait_for_server(server, wait=600) + + if env.SSH_IP_VERSION == "4": + ips = conn.available_floating_ip(network=env.FLOATING_IP_NETWORK, server=server) + conn.compute.add_floating_ip_to_server(server, ips.floating_ip_address, fixed_address=None) + + return server def get_server_ip( conn: openstack.connection.Connection, server: openstack.compute.v2.server.Server ) -> str: - return list(conn.compute.server_ips(server))[0].address + if env.SSH_IP_VERSION == "4": + return list(conn.compute.server_ips(server))[2].address + else: + return list(conn.compute.server_ips(server))[0].address def check_ssh(ip: str) -> None: diff --git a/run.py b/run.py index 7a4ba7bfb9007550df54669734822e70cc774231..b82221f14ba3ca5cb16f6f1cc122feefda566ea5 100644 --- a/run.py +++ b/run.py @@ -9,7 +9,10 @@ import env def get_server_ip(conn: openstack.connection.Connection) -> str: server = list(conn.compute.servers(name=env.VM_NAME, status="ACTIVE"))[0] - return list(conn.compute.server_ips(server))[0].address + if env.SSH_IP_VERSION == "4": + return list(conn.compute.server_ips(server))[2].address + else: + return list(conn.compute.server_ips(server))[0].address def execute_script_on_server(ssh: paramiko.client.SSHClient, script_path: str) -> int: