Skip to content

Commit

Permalink
Initial version of ocm-gear
Browse files Browse the repository at this point in the history
This is the initial contribution to the Open Source Open-Component-Model
OCM-Gear project.

The following SAP developers contributed to this project until this
initial contribution was published as open source:

   142  Jonas Brand
   115  Philipp Heil
     7  Julian Herzog
     2  Christian Cwienk
     1  Andreas Burger

It is derived from the historical, SAP-internal delivery-gear repository
at commit dd72a39f65864f48a4829775d926b2a0be63a974
  • Loading branch information
8R0WNI3 committed Jul 30, 2024
0 parents commit 1f20fb0
Show file tree
Hide file tree
Showing 25 changed files with 6,294 additions and 0 deletions.
137 changes: 137 additions & 0 deletions .ci/component_descriptor
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
#!/usr/bin/env python3

import dataclasses
import hashlib
import logging
import os
import tarfile
import tempfile
import yaml

import ccc.oci
import ci.util
import cnudie.util
import gci.componentmodel as cm

logger = logging.getLogger(__name__)

component_descriptor_base_path = os.path.abspath(ci.util.check_env('BASE_DEFINITION_PATH'))
component_descriptor_path = os.path.abspath(ci.util.check_env('COMPONENT_DESCRIPTOR_PATH'))
component_version = ci.util.check_env('COMPONENT_VERSION')

own_dir = os.path.abspath(os.path.dirname(__file__))
repo_dir = os.path.abspath(os.path.join(own_dir, os.pardir))

delivery_service_versionfile = os.path.join(repo_dir, 'DELIVERY_SERVICE_VERSION')
delivery_dashboard_versionfile = os.path.join(repo_dir, 'DELIVERY_DASHBOARD_VERSION')

installation_dir = os.path.join(repo_dir, 'installation')


def component_version_from_file(file_path: str):
with open(file_path) as version_file:
version = version_file.read().strip()
return version


def parse_component_descriptor():
component_descriptor = cm.ComponentDescriptor.from_dict(
ci.util.parse_yaml_file(component_descriptor_base_path)
)
return component_descriptor


def add_component_ref(
component: cm.Component,
component_ref: cm.ComponentReference,
):
component.componentReferences.append(component_ref)


def add_installation_resource(
component: cm.Component,
):
mimetype = 'application/tar+gzip'

file = tempfile.TemporaryFile()
with tarfile.open(fileobj=file, mode='w:gz') as tar:
tar.add(
name=installation_dir,
arcname=os.path.basename(installation_dir),
)

hash = hashlib.sha256()
file.seek(0)
while (buf := file.read(4096)):
hash.update(buf)
digest = f'sha256:{hash.hexdigest()}'
octets = file.tell()
file.seek(0)

target_ref = cnudie.util.target_oci_ref(component=component)
logger.info(f'pushing blob for installation script with {digest=} to {target_ref=}')

client = ccc.oci.oci_client()
client.put_blob(
image_reference=target_ref,
digest=digest,
octets_count=octets,
data=file,
mimetype=mimetype,
)

component.resources.append(
cm.Resource(
name='installation',
version=component_version,
type='directoryTree',
access=cm.LocalBlobAccess(
mediaType=mimetype,
localReference=digest,
size=octets,
),
),
)


def main():
delivery_service_version = component_version_from_file(delivery_service_versionfile)
delivery_dashboard_version = component_version_from_file(delivery_dashboard_versionfile)

component_descriptor = parse_component_descriptor()
component = component_descriptor.component

add_component_ref(
component=component,
component_ref=cm.ComponentReference(
name='delivery-dashboard',
componentName='ocm.software/delivery-gear/delivery-dashboard',
version=delivery_dashboard_version,
labels=[],
)
)

add_component_ref(
component=component,
component_ref=cm.ComponentReference(
name='delivery-service',
componentName='ocm.software/delivery-gear/delivery-service',
version=delivery_service_version,
labels=[],
)
)

add_installation_resource(
component=component,
)

with open(component_descriptor_path, 'w') as f:
yaml.dump(
data=dataclasses.asdict(component_descriptor),
Dumper=cm.EnumValueYamlDumper,
stream=f,
)


if __name__ == '__main__':
main()
40 changes: 40 additions & 0 deletions .ci/lint
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
#!/usr/bin/env bash
set -e

# usage: $1: <src-dir>

src_dir="${1:-"$(readlink -f "$(dirname "${0}")/..")"}"

echo 'Running flake8 for all python modules..'
error=0

files="$src_dir/.ci/*"
excluded_files=".ci/lint,.ci/lint-flake8,.ci/pipeline_definitions"

export PYTHONPATH="${src_dir}"

echo 'running pylama for all modules (errors only)'
(
pushd "${src_dir}"
set -x
if pylama -iW,R,C -lpylint "${files}"; then
echo 'pylama succeeded'
else
((error|=1))
fi

if "${src_dir}/.ci/lint-flake8"; then
echo 'pyflake8 succeeded'
else
((error|=1))
fi

if [ $error -eq 0 ]; then
exit 0
elif [ $error -gt 0 ]; then
exit 1
fi
popd
)

exit $?
25 changes: 25 additions & 0 deletions .ci/lint-flake8
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
#!/usr/bin/env bash
set -e

# usage: $1: <src-dir>

src_dir="${1:-"$(readlink -f "$(dirname "${0}")/..")"}"

error=0

files="$src_dir/.ci/*"
excluded_files=".ci/lint,.ci/lint-flake8,.ci/pipeline_definitions"

# flake8 / the linter it instruments cannot handle our special type-hints (CliHint)
if flake8 --max-line-length=101 --select=E101,E117,E201,E202,E203,E225,E251,E3,E4,E5,E703,E9,W1,W2,W3,W6,F --count --format=pylint --ignore=F722,F821 --exclude=$excluded_files $files; then
echo "flake8 succeeded"
else
echo "flake8 found errors (see above)"
((error|=1))
fi

if [ $error -eq 0 ]; then
exit 0
elif [ $error -gt 0 ]; then
exit 1
fi
56 changes: 56 additions & 0 deletions .ci/pipeline_definitions
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
ocm-gear:
base_definition:
traits:
version: ~
component_descriptor:
component_name: ocm.software/ocm-gear
ocm_repository: europe-docker.pkg.dev/gardener-project/releases
ocm_repository_mappings:
- repository: europe-docker.pkg.dev/gardener-project/releases
prefix: ''

jobs:
update-dependencies:
traits:
update_component_deps:
merge_policy: auto_merge
merge_method: rebase
cronjob:
interval: 5m
component_descriptor:
ocm_repository: europe-docker.pkg.dev/gardener-project/snapshots

head-update:
steps:
lint:
execute: lint
traits:
component_descriptor:
ocm_repository: europe-docker.pkg.dev/gardener-project/snapshots

automatic-release:
steps:
trigger-release:
execute: trigger_release.py
inputs:
component_descriptor_dir: component_descriptor_dir
vars:
RELEASE_JOB_NAME: pipeline.variant("manual-release").job_name()
PIPELINE_NAME: pipeline_descriptor.get("name")
depends:
- component_descriptor
traits:
component_descriptor:
ocm_repository: europe-docker.pkg.dev/gardener-project/snapshots

manual-release:
steps:
lint:
execute: lint
traits:
version:
preprocess: finalize
inject_effective_version: True
release:
nextversion: bump_minor
release_notes_policy: disabled
31 changes: 31 additions & 0 deletions .ci/set_dependency_version
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
#!/usr/bin/env python3

import os

import ci.util


repo_dir = os.path.abspath(ci.util.check_env('MAIN_REPO_DIR'))
dependency_name = ci.util.check_env('DEPENDENCY_NAME')
dependency_version = ci.util.check_env('DEPENDENCY_VERSION')

delivery_service_versionfile = os.path.join(repo_dir, 'DELIVERY_SERVICE_VERSION')
delivery_dashboard_versionfile = os.path.join(repo_dir, 'DELIVERY_DASHBOARD_VERSION')


def write_component_version_to_file(file_path: str):
with open(file_path, 'w') as version_file:
version_file.write(dependency_version.strip())


def main():
if dependency_name == 'ocm.software/delivery-gear/delivery-service':
write_component_version_to_file(delivery_service_versionfile)
elif dependency_name == 'ocm.software/delivery-gear/delivery-dashboard':
write_component_version_to_file(delivery_dashboard_versionfile)
else:
raise RuntimeError(f"Don't know how to upgrade dependency: {dependency_name}")


if __name__ == '__main__':
main()
Loading

0 comments on commit 1f20fb0

Please sign in to comment.