Compare commits
14 commits
Author | SHA1 | Date | |
---|---|---|---|
3bc72f5bb8 | |||
e9fdfdf520 | |||
7fa2a8056d | |||
dfb46d76a5 | |||
39c6b95af8 | |||
0935eae193 | |||
58a1b005e9 | |||
bba684d76e | |||
ec150dde62 | |||
76d4ad16dc | |||
126ae37845 | |||
e9f1915655 | |||
7448333d7c | |||
e8555798e4 |
21 changed files with 153 additions and 33 deletions
|
@ -87,10 +87,3 @@ kotlin-image-publish:
|
||||||
stage: image
|
stage: image
|
||||||
script:
|
script:
|
||||||
- cd infrastructure/kotlin && pyb image publish
|
- cd infrastructure/kotlin && pyb image publish
|
||||||
|
|
||||||
backup-image-publish:
|
|
||||||
<<: *img
|
|
||||||
<<: *tag_only
|
|
||||||
stage: image
|
|
||||||
script:
|
|
||||||
- cd infrastructure/backup && pyb image publish
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
# dda-devops-build
|
# dda-devops-build
|
||||||
|
|
||||||
[![Slack](https://img.shields.io/badge/chat-clojurians-green.svg?style=flat)](https://clojurians.slack.com/messages/#dda-pallet/) | [<img src="https://meissa-gmbh.de/img/community/Mastodon_Logotype.svg" width=20 alt="team@social.meissa-gmbh.de"> team@social.meissa-gmbh.de](https://social.meissa-gmbh.de/@team) | [Website & Blog](https://domaindrivenarchitecture.org)
|
[![Slack](https://img.shields.io/badge/chat-clojurians-green.svg?style=flat)](https://clojurians.slack.com/messages/#dda-pallet/) | [<img src="https://domaindrivenarchitecture.org/img/delta-chat.svg" width=20 alt="DeltaChat"> chat over e-mail](mailto:buero@meissa-gmbh.de?subject=community-chat) | [<img src="https://meissa.de/images/parts/contact/mastodon36_hue9b2464f10b18e134322af482b9c915e_5501_filter_14705073121015236177.png" width=20 alt="M"> meissa@social.meissa-gmbh.de](https://social.meissa-gmbh.de/@meissa) | [Blog](https://domaindrivenarchitecture.org) | [Website](https://meissa.de)
|
||||||
|
|
||||||
|
|
||||||
dda-devops-build integrates all the tools we use to work with clouds & provide some nice functions around.
|
dda-devops-build integrates all the tools we use to work with clouds & provide some nice functions around.
|
||||||
|
|
9
build.py
9
build.py
|
@ -33,7 +33,7 @@ default_task = "dev"
|
||||||
name = "ddadevops"
|
name = "ddadevops"
|
||||||
MODULE = "not-used"
|
MODULE = "not-used"
|
||||||
PROJECT_ROOT_PATH = "."
|
PROJECT_ROOT_PATH = "."
|
||||||
version = "4.12.1"
|
version = "4.13.2-dev"
|
||||||
summary = "tools to support builds combining gopass, terraform, dda-pallet, aws & hetzner-cloud"
|
summary = "tools to support builds combining gopass, terraform, dda-pallet, aws & hetzner-cloud"
|
||||||
description = __doc__
|
description = __doc__
|
||||||
authors = [Author("meissa GmbH", "buero@meissa-gmbh.de")]
|
authors = [Author("meissa GmbH", "buero@meissa-gmbh.de")]
|
||||||
|
@ -97,7 +97,6 @@ def initialize(project):
|
||||||
"mixin_types": ["RELEASE"],
|
"mixin_types": ["RELEASE"],
|
||||||
"release_primary_build_file": "build.py",
|
"release_primary_build_file": "build.py",
|
||||||
"release_secondary_build_files": [
|
"release_secondary_build_files": [
|
||||||
"infrastructure/backup/build.py",
|
|
||||||
"infrastructure/python/build.py",
|
"infrastructure/python/build.py",
|
||||||
"infrastructure/dind/build.py",
|
"infrastructure/dind/build.py",
|
||||||
"infrastructure/ddadevops/build.py",
|
"infrastructure/ddadevops/build.py",
|
||||||
|
@ -141,12 +140,6 @@ def lint(project):
|
||||||
shell=True,
|
shell=True,
|
||||||
check=True,
|
check=True,
|
||||||
)
|
)
|
||||||
run(
|
|
||||||
"pylint -d W0511,R0903,C0301,W0614,C0114,C0115,C0116,similarities,W1203,W0702,W0702,"
|
|
||||||
+ "R0913,R0902,R0914,R1732,R1705,W0707,C0123,W0703,C0103 src/main/python/ddadevops/",
|
|
||||||
shell=True,
|
|
||||||
check=True,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
@task
|
@task
|
||||||
|
|
|
@ -7,7 +7,7 @@ import logging
|
||||||
name = 'dda-backup'
|
name = 'dda-backup'
|
||||||
MODULE = 'NOT_SET'
|
MODULE = 'NOT_SET'
|
||||||
PROJECT_ROOT_PATH = '../..'
|
PROJECT_ROOT_PATH = '../..'
|
||||||
version = "4.12.1"
|
version = "4.12.2-dev"
|
||||||
|
|
||||||
|
|
||||||
@init
|
@init
|
||||||
|
@ -38,6 +38,11 @@ def image(project):
|
||||||
build = get_devops_build(project)
|
build = get_devops_build(project)
|
||||||
build.image()
|
build.image()
|
||||||
|
|
||||||
|
@task
|
||||||
|
def test(project):
|
||||||
|
build = get_devops_build(project)
|
||||||
|
build.test()
|
||||||
|
|
||||||
@task
|
@task
|
||||||
def drun(project):
|
def drun(project):
|
||||||
build = get_devops_build(project)
|
build = get_devops_build(project)
|
||||||
|
|
|
@ -42,6 +42,7 @@ function backup-fs-from-directory() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Das tut so nicht!
|
||||||
function restore-directory() {
|
function restore-directory() {
|
||||||
local directory="$1"; shift
|
local directory="$1"; shift
|
||||||
local snapshot_id="${1:-latest}"; shift
|
local snapshot_id="${1:-latest}"; shift
|
||||||
|
|
7
infrastructure/backup/test/Dockerfile
Normal file
7
infrastructure/backup/test/Dockerfile
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
FROM dda-backup:latest
|
||||||
|
|
||||||
|
# install it
|
||||||
|
RUN apt update && apt install -qqy openjdk-17-jre-headless
|
||||||
|
ADD resources /tmp/
|
||||||
|
RUN rm -rf /root/.m2
|
||||||
|
RUN /tmp/install-test.bb
|
4
infrastructure/backup/test/resources/bb.edn
Normal file
4
infrastructure/backup/test/resources/bb.edn
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
{:deps {org.clojure/spec.alpha {:mvn/version "0.4.233"}
|
||||||
|
orchestra/orchestra {:mvn/version "2021.01.01-1"}
|
||||||
|
org.domaindrivenarchitecture/dda-backup {:mvn/version "0.1.1-SNAPSHOT"}}}
|
||||||
|
|
32
infrastructure/backup/test/resources/install-test.bb
Executable file
32
infrastructure/backup/test/resources/install-test.bb
Executable file
|
@ -0,0 +1,32 @@
|
||||||
|
#!/usr/bin/env bb
|
||||||
|
|
||||||
|
(require '[babashka.tasks :as tasks])
|
||||||
|
|
||||||
|
(defn curl-and-check!
|
||||||
|
[filename artifact-url sha256-url]
|
||||||
|
(let [filepath (str "/tmp/" filename)]
|
||||||
|
(tasks/shell "curl" "-SsLo" filepath artifact-url)
|
||||||
|
(tasks/shell "curl" "-SsLo" "/tmp/checksum" sha256-url)
|
||||||
|
(tasks/shell "bash" "-c" (str "echo \" " filepath "\"|tee -a /tmp/checksum"))
|
||||||
|
;(tasks/shell "sha256sum" "-c" "--status" "/tmp/checksum")
|
||||||
|
))
|
||||||
|
|
||||||
|
(defn tar-install!
|
||||||
|
[filename binname]
|
||||||
|
(let [filepath (str "/tmp/" filename)]
|
||||||
|
(tasks/shell "tar" "-C" "/tmp" "-xzf" filepath)
|
||||||
|
(tasks/shell "install" "-m" "0700" "-o" "root" "-g" "root" (str "/tmp/" binname) "/usr/local/bin/")))
|
||||||
|
|
||||||
|
(defn install!
|
||||||
|
[filename]
|
||||||
|
(tasks/shell "install" "-m" "0700" "-o" "root" "-g" "root" (str "/tmp/" filename) "/usr/local/bin/"))
|
||||||
|
|
||||||
|
(tasks/shell "bb" "/tmp/test.bb")
|
||||||
|
(curl-and-check!
|
||||||
|
"provs-syspec.jar"
|
||||||
|
"https://repo.prod.meissa.de/attachments/0a1da41e-aa5b-4a3e-a3b1-215cf2d5b021"
|
||||||
|
"https://repo.prod.meissa.de/attachments/f227cf65-cb0f-46a7-a6cd-28f46917412a")
|
||||||
|
(install! "provs-syspec.jar")
|
||||||
|
(tasks/shell "apt" "update")
|
||||||
|
(tasks/shell "apt" "install" "-qqy" "openjdk-17-jre-headless")
|
||||||
|
(tasks/shell "java" "-jar" "/usr/local/bin/provs-syspec.jar" "local" "-c" "/tmp/spec.yml" )
|
7
infrastructure/backup/test/resources/spec.yml
Normal file
7
infrastructure/backup/test/resources/spec.yml
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
package:
|
||||||
|
- name: "restic"
|
||||||
|
|
||||||
|
command:
|
||||||
|
- command: "bb -h"
|
||||||
|
- command: "/tmp/test.bb"
|
||||||
|
|
27
infrastructure/backup/test/resources/test.bb
Executable file
27
infrastructure/backup/test/resources/test.bb
Executable file
|
@ -0,0 +1,27 @@
|
||||||
|
#!/usr/bin/env bb
|
||||||
|
|
||||||
|
(require '[babashka.tasks :as tasks]
|
||||||
|
'[dda.backup.management :as mgm])
|
||||||
|
|
||||||
|
(defn restic-repo-init!
|
||||||
|
[]
|
||||||
|
(spit "restic-pwd" "ThePassword")
|
||||||
|
(mgm/init! {:password-file "restic-pwd"
|
||||||
|
:restic-repository "restic-repo"}))
|
||||||
|
|
||||||
|
(defn restic-backup!
|
||||||
|
[]
|
||||||
|
(tasks/shell "mkdir" "test-backup")
|
||||||
|
(spit "test-backup/file" "I was here")
|
||||||
|
(tasks/shell "restic" "backup" "--password-file" "restic-pwd" "--repo" "restic-repo" "test-backup"))
|
||||||
|
|
||||||
|
(defn restic-restore!
|
||||||
|
[]
|
||||||
|
(tasks/shell "mkdir" "test-restore")
|
||||||
|
(tasks/shell "restic" "restore" "--password-file" "restic-pwd" "--repo" "restic-repo" "--target" "test-restore" "latest")
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
(restic-repo-init!)
|
||||||
|
(restic-backup!)
|
||||||
|
(restic-restore!)
|
|
@ -6,7 +6,7 @@ from ddadevops import *
|
||||||
name = "ddadevops"
|
name = "ddadevops"
|
||||||
MODULE = "clj-cljs"
|
MODULE = "clj-cljs"
|
||||||
PROJECT_ROOT_PATH = "../.."
|
PROJECT_ROOT_PATH = "../.."
|
||||||
version = "4.12.1"
|
version = "4.13.2-dev"
|
||||||
|
|
||||||
@init
|
@init
|
||||||
def initialize(project):
|
def initialize(project):
|
||||||
|
|
|
@ -6,7 +6,7 @@ from ddadevops import *
|
||||||
name = "ddadevops"
|
name = "ddadevops"
|
||||||
MODULE = "clj"
|
MODULE = "clj"
|
||||||
PROJECT_ROOT_PATH = "../.."
|
PROJECT_ROOT_PATH = "../.."
|
||||||
version = "4.12.1"
|
version = "4.13.2-dev"
|
||||||
|
|
||||||
@init
|
@init
|
||||||
def initialize(project):
|
def initialize(project):
|
||||||
|
|
|
@ -6,7 +6,7 @@ from ddadevops import *
|
||||||
name = "ddadevops"
|
name = "ddadevops"
|
||||||
MODULE = "ddadevops"
|
MODULE = "ddadevops"
|
||||||
PROJECT_ROOT_PATH = "../.."
|
PROJECT_ROOT_PATH = "../.."
|
||||||
version = "4.12.1"
|
version = "4.13.2-dev"
|
||||||
|
|
||||||
|
|
||||||
@init
|
@init
|
||||||
|
|
|
@ -6,7 +6,7 @@ from ddadevops import *
|
||||||
name = "ddadevops"
|
name = "ddadevops"
|
||||||
MODULE = "dind"
|
MODULE = "dind"
|
||||||
PROJECT_ROOT_PATH = "../.."
|
PROJECT_ROOT_PATH = "../.."
|
||||||
version = "4.12.1"
|
version = "4.13.2-dev"
|
||||||
|
|
||||||
|
|
||||||
@init
|
@init
|
||||||
|
|
|
@ -6,7 +6,7 @@ from ddadevops import *
|
||||||
name = "ddadevops"
|
name = "ddadevops"
|
||||||
MODULE = "kotlin"
|
MODULE = "kotlin"
|
||||||
PROJECT_ROOT_PATH = "../.."
|
PROJECT_ROOT_PATH = "../.."
|
||||||
version = "4.12.1"
|
version = "4.13.2-dev"
|
||||||
|
|
||||||
|
|
||||||
@init
|
@init
|
||||||
|
|
|
@ -6,7 +6,7 @@ from ddadevops import *
|
||||||
name = "ddadevops"
|
name = "ddadevops"
|
||||||
MODULE = "python"
|
MODULE = "python"
|
||||||
PROJECT_ROOT_PATH = "../.."
|
PROJECT_ROOT_PATH = "../.."
|
||||||
version = "4.12.1"
|
version = "4.13.2-dev"
|
||||||
|
|
||||||
|
|
||||||
@init
|
@init
|
||||||
|
|
|
@ -11,6 +11,7 @@ class BuildFileType(Enum):
|
||||||
JS = ".json"
|
JS = ".json"
|
||||||
JAVA_GRADLE = ".gradle"
|
JAVA_GRADLE = ".gradle"
|
||||||
JAVA_CLOJURE = ".clj"
|
JAVA_CLOJURE = ".clj"
|
||||||
|
JAVA_CLOJURE_EDN = ".edn"
|
||||||
PYTHON = ".py"
|
PYTHON = ".py"
|
||||||
|
|
||||||
|
|
||||||
|
@ -41,6 +42,8 @@ class BuildFile(Validateable):
|
||||||
result = BuildFileType.JAVA_CLOJURE
|
result = BuildFileType.JAVA_CLOJURE
|
||||||
case ".py":
|
case ".py":
|
||||||
result = BuildFileType.PYTHON
|
result = BuildFileType.PYTHON
|
||||||
|
case ".edn":
|
||||||
|
result = BuildFileType.JAVA_CLOJURE_EDN
|
||||||
case _:
|
case _:
|
||||||
result = None
|
result = None
|
||||||
return result
|
return result
|
||||||
|
@ -48,11 +51,13 @@ class BuildFile(Validateable):
|
||||||
def __get_file_type_regex_str(self, file_type: BuildFileType):
|
def __get_file_type_regex_str(self, file_type: BuildFileType):
|
||||||
match file_type:
|
match file_type:
|
||||||
case BuildFileType.JAVA_GRADLE:
|
case BuildFileType.JAVA_GRADLE:
|
||||||
return r'(?P<pre_version>\bversion\s?=\s?)\"(?P<version>\d*\.\d*\.\d*(-SNAPSHOT)?)\"'
|
return r"(?P<pre_version>\bversion\s?=\s?)\"(?P<version>\d*\.\d*\.\d*(-SNAPSHOT)?)\""
|
||||||
case BuildFileType.PYTHON:
|
case BuildFileType.PYTHON:
|
||||||
return r'(?P<pre_version>\bversion\s?=\s?)\"(?P<version>\d*\.\d*\.\d*(-SNAPSHOT|-dev\d*)?)\"'
|
return r"(?P<pre_version>\bversion\s?=\s?)\"(?P<version>\d*\.\d*\.\d*(-SNAPSHOT|-dev\d*)?)\""
|
||||||
case BuildFileType.JAVA_CLOJURE:
|
case BuildFileType.JAVA_CLOJURE:
|
||||||
return r'(?P<pre_version>\(defproject\s(\S)*\s)\"(?P<version>\d*\.\d*\.\d*(-SNAPSHOT)?)\"'
|
return r"(?P<pre_version>\(defproject\s(\S)*\s)\"(?P<version>\d*\.\d*\.\d*(-SNAPSHOT)?)\""
|
||||||
|
case BuildFileType.JAVA_CLOJURE_EDN:
|
||||||
|
return r"(?P<pre_version>\:version\s+)\"(?P<version>\d*\.\d*\.\d*(-SNAPSHOT)?)\""
|
||||||
case _:
|
case _:
|
||||||
return ""
|
return ""
|
||||||
|
|
||||||
|
@ -62,8 +67,15 @@ class BuildFile(Validateable):
|
||||||
match build_file_type:
|
match build_file_type:
|
||||||
case BuildFileType.JS:
|
case BuildFileType.JS:
|
||||||
version_str = json.loads(self.content)["version"]
|
version_str = json.loads(self.content)["version"]
|
||||||
case BuildFileType.JAVA_GRADLE | BuildFileType.PYTHON | BuildFileType.JAVA_CLOJURE:
|
case (
|
||||||
version_str = re.search(self.__get_file_type_regex_str(build_file_type), self.content).group("version")
|
BuildFileType.JAVA_GRADLE
|
||||||
|
| BuildFileType.PYTHON
|
||||||
|
| BuildFileType.JAVA_CLOJURE
|
||||||
|
| BuildFileType.JAVA_CLOJURE_EDN
|
||||||
|
):
|
||||||
|
version_str = re.search(
|
||||||
|
self.__get_file_type_regex_str(build_file_type), self.content
|
||||||
|
).group("version")
|
||||||
except:
|
except:
|
||||||
raise RuntimeError(f"Version not found in file {self.file_path}")
|
raise RuntimeError(f"Version not found in file {self.file_path}")
|
||||||
|
|
||||||
|
@ -84,10 +96,15 @@ class BuildFile(Validateable):
|
||||||
json_data = json.loads(self.content)
|
json_data = json.loads(self.content)
|
||||||
json_data["version"] = new_version.to_string()
|
json_data["version"] = new_version.to_string()
|
||||||
self.content = json.dumps(json_data, indent=4)
|
self.content = json.dumps(json_data, indent=4)
|
||||||
case BuildFileType.JAVA_GRADLE | BuildFileType.PYTHON | BuildFileType.JAVA_CLOJURE:
|
case (
|
||||||
|
BuildFileType.JAVA_GRADLE
|
||||||
|
| BuildFileType.PYTHON
|
||||||
|
| BuildFileType.JAVA_CLOJURE
|
||||||
|
| BuildFileType.JAVA_CLOJURE_EDN
|
||||||
|
):
|
||||||
substitute = re.sub(
|
substitute = re.sub(
|
||||||
self.__get_file_type_regex_str(build_file_type),
|
self.__get_file_type_regex_str(build_file_type),
|
||||||
fr'\g<pre_version>"{new_version.to_string()}"',
|
rf'\g<pre_version>"{new_version.to_string()}"',
|
||||||
self.content,
|
self.content,
|
||||||
1,
|
1,
|
||||||
)
|
)
|
||||||
|
|
|
@ -78,6 +78,12 @@ class DnsRecord(Validateable):
|
||||||
result.append("ipv4 & ipv6 may not both be empty.")
|
result.append("ipv4 & ipv6 may not both be empty.")
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
def ip(self) -> str:
|
||||||
|
if (self.ipv4):
|
||||||
|
return self.ipv4
|
||||||
|
else:
|
||||||
|
return self.ipv6
|
||||||
|
|
||||||
|
|
||||||
class Devops(Validateable):
|
class Devops(Validateable):
|
||||||
def __init__(
|
def __init__(
|
||||||
|
|
|
@ -86,7 +86,7 @@ class K3s(Validateable):
|
||||||
cmd = [
|
cmd = [
|
||||||
"provs-server.jar",
|
"provs-server.jar",
|
||||||
"k3s",
|
"k3s",
|
||||||
f"{self.k3s_provision_user}@{self.provision_dns.fqdn}",
|
f"{self.k3s_provision_user}@{self.provision_dns.ip()}",
|
||||||
"-c",
|
"-c",
|
||||||
f"{devops.build_path()}/out_k3sServerConfig.yaml",
|
f"{devops.build_path()}/out_k3sServerConfig.yaml",
|
||||||
"-a",
|
"-a",
|
||||||
|
|
|
@ -183,6 +183,34 @@ def test_should_parse_and_set_version_for_clj():
|
||||||
== sut.content
|
== sut.content
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def test_should_parse_and_set_version_for_clj_edn():
|
||||||
|
sut = BuildFile(
|
||||||
|
Path("./deps.edn"),
|
||||||
|
"""
|
||||||
|
{:project {:name org.domaindrivenarchitecture/dda-backup
|
||||||
|
:version "1.1.5-SNAPSHOT"}
|
||||||
|
|
||||||
|
}
|
||||||
|
""",
|
||||||
|
)
|
||||||
|
assert sut.get_version() == Version.from_str("1.1.5-SNAPSHOT", "SNAPSHOT")
|
||||||
|
|
||||||
|
sut = BuildFile(
|
||||||
|
Path("./deps.edn"),
|
||||||
|
"""
|
||||||
|
{:project {:name org.domaindrivenarchitecture/dda-backup
|
||||||
|
:version "1.1.5-SNAPSHOT"}
|
||||||
|
|
||||||
|
}
|
||||||
|
""",
|
||||||
|
)
|
||||||
|
sut.set_version(Version.from_str("1.1.5-SNAPSHOT", "SNAPSHOT").create_major())
|
||||||
|
assert (
|
||||||
|
'\n{:project {:name org.domaindrivenarchitecture/dda-backup\n :version "2.0.0"}\n\n}\n'
|
||||||
|
== sut.content
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def test_should_throw_for_clj_wrong_version():
|
def test_should_throw_for_clj_wrong_version():
|
||||||
sut = BuildFile(
|
sut = BuildFile(
|
||||||
Path("./project.clj"),
|
Path("./project.clj"),
|
||||||
|
|
|
@ -24,7 +24,7 @@ def test_should_calculate_command():
|
||||||
assert (
|
assert (
|
||||||
"provs-server.jar "
|
"provs-server.jar "
|
||||||
+ "k3s "
|
+ "k3s "
|
||||||
+ "k3s_provision_user@example.org "
|
+ "k3s_provision_user@::1 "
|
||||||
+ "-c "
|
+ "-c "
|
||||||
+ "root_path/target/name/module/out_k3sServerConfig.yaml "
|
+ "root_path/target/name/module/out_k3sServerConfig.yaml "
|
||||||
+ "-a "
|
+ "-a "
|
||||||
|
|
Loading…
Reference in a new issue