Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import de.fraunhofer.ipa.rossystem.deployment.RosInstallCompiler
import de.fraunhofer.ipa.rossystem.deployment.DockerComposeCompiler
import de.fraunhofer.ipa.rossystem.deployment.DockerContainerCompiler
import de.fraunhofer.ipa.rossystem.deployment.GitActionCompiler
import de.fraunhofer.ipa.rossystem.deployment.DeploymentHelpers
import rossystem.RosSystem;
import java.util.HashMap
import java.util.Map
Expand Down Expand Up @@ -44,12 +45,12 @@ class DeploymentArtifactsGenerator extends AbstractGenerator {
RosInstallCompiler rosintall_compiler = new RosInstallCompiler()
DockerComposeCompiler dockercompose_compiler = new DockerComposeCompiler()
GitActionCompiler gitaction_compiler = new GitActionCompiler()


DeploymentHelpers generator_helper = new DeploymentHelpers()

String ros_distro
String system_folder_prefix
Integer ros_version
String system_prefix
String stack_prefix
Map<String, List<String>> device_map = new HashMap<String, List<String>>

def get_ros_distro(String distro) {
Expand Down Expand Up @@ -85,26 +86,26 @@ class DeploymentArtifactsGenerator extends AbstractGenerator {
}
]
for (system : resource.allContents.toIterable.filter(RosSystem)){
system_prefix = create_system_prefix(system)
system_folder_prefix = create_system_prefix(system)
if (system.componentStack.size==0){
fsa.generateFile(system_prefix +"/Dockerfile",docker_compiler.compile_toDockerContainer(system, null, ros_distro, ros_version))
fsa.generateFile(system_prefix +"/extra_layer/" + system.getName().toLowerCase + ".rosinstall",rosintall_compiler.compile_toRosInstall(system,null))
fsa.generateFile(system_prefix +"/extra_layer/Dockerfile",docker_compiler.compile_toDockerImageExtraLayer(system, null,ros_distro, ros_version))
fsa.generateFile(system_folder_prefix +"/Dockerfile",docker_compiler.compile_toDockerContainer(system, null, ros_distro, ros_version))
fsa.generateFile(system_folder_prefix +"/extra_layer/" + system.getName().toLowerCase + ".rosinstall",rosintall_compiler.compile_toRosInstall(system,null))
fsa.generateFile(system_folder_prefix +"/extra_layer/Dockerfile",docker_compiler.compile_toDockerImageExtraLayer(system, null,ros_distro, ros_version))
} else {
for (stack : system.componentStack){
stack_prefix = String.join("/", system_prefix, system.name.toLowerCase+'_'+stack.name.toLowerCase)
fsa.generateFile(String.join("/", stack_prefix, "Dockerfile"),docker_compiler.compile_toDockerContainer(system, stack, ros_distro, ros_version))
fsa.generateFile(String.join("/", stack_prefix, "extra_layer", stack.name.toLowerCase+".rosinstall"),rosintall_compiler.compile_toRosInstall(system,stack))
fsa.generateFile(String.join("/", stack_prefix, "extra_layer", "Dockerfile"),docker_compiler.compile_toDockerImageExtraLayer(system,stack, ros_distro, ros_version))
val stack_folder_prefix = String.join("/", system_folder_prefix, system.name.toLowerCase+'_'+stack.name.toLowerCase)
fsa.generateFile(String.join("/", stack_folder_prefix, "Dockerfile"),docker_compiler.compile_toDockerContainer(system, stack, ros_distro, ros_version))
fsa.generateFile(String.join("/", stack_folder_prefix, "extra_layer", stack.name.toLowerCase+".rosinstall"),rosintall_compiler.compile_toRosInstall(system,stack))
fsa.generateFile(String.join("/", stack_folder_prefix, "extra_layer", "Dockerfile"),docker_compiler.compile_toDockerImageExtraLayer(system,stack, ros_distro, ros_version))
}
}

fsa.generateFile(String.join("/", system_prefix, "docker-compose.yml"),dockercompose_compiler.compile_toDockerCompose(system, ros_distro, ros_version, device_map))
fsa.generateFile(String.join("/", system_folder_prefix, "docker-compose.yml"),dockercompose_compiler.compile_toDockerCompose(system, ros_distro, ros_version, device_map))
}

// git action workflow
for (system : resource.allContents.toIterable.filter(RosSystem)){
fsa.generateFile(String.join("/", system_prefix, system.getName().toLowerCase + "_workflow.yml") ,gitaction_compiler.compile_toGitAction(system, ros_version))
fsa.generateFile(String.join("/", system_folder_prefix, generator_helper.get_uniqe_name(system.name.toLowerCase, ros_distro) + "_workflow.yml") ,gitaction_compiler.compile_toGitAction(system, ros_version, ros_distro))
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package de.fraunhofer.ipa.rossystem.deployment

import componentInterface.ComponentInterface
import de.fraunhofer.ipa.rossystem.generator.GeneratorHelpers
import java.util.ArrayList
import java.util.HashSet
import java.util.List
import java.util.Set
import ros.Dependency
import ros.PackageDependency
import ros.impl.PackageImpl
import rossystem.ComponentStack
import rossystem.RosSystem

class DeploymentHelpers extends GeneratorHelpers {
List<ComponentInterface> ComponentsList
PackageImpl component_package
Set<String> Repos

def get_uniqe_name(String prefix, String ros_distro) {
return prefix + "_" + ros_distro
}

def get_folder_name(String prefix, String ros_distro) {
if(ros_distro=="foxy") {
return prefix + "_ros2"
}
else{
return prefix
}
}

def Set<String> listOfRepos(Object subsystem) {
new ArrayList()
ComponentsList = new ArrayList<ComponentInterface>();
if (subsystem.class.toString.contains("RosSystemImpl")){
ComponentsList = (subsystem as RosSystem).rosComponent
} else if (subsystem.class.toString.contains("ComponentStackImpl")) {
ComponentsList = (subsystem as ComponentStack).rosComponent
}

Repos = new HashSet<String>();
for (ComponentInterface component: ComponentsList){
component_package = null;
component_package = get_pkg(component);
if (component_package !== null){
if (component_package.fromGitRepo !== null){
Repos.add(component_package.fromGitRepo);
}
if (!component_package.dependency.empty){
for (Dependency depend: component_package.dependency){
if ((depend as PackageDependency).package !== null){
if ((depend as PackageDependency).package.fromGitRepo !== null){
Repos.add((depend as PackageDependency).package.fromGitRepo);
}
}
}
}}}
return Repos;
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
package de.fraunhofer.ipa.rossystem.deployment

import rossystem.RosSystem
import de.fraunhofer.ipa.rossystem.generator.GeneratorHelpers
import de.fraunhofer.ipa.rossystem.deployment.DeploymentHelpers
import java.util.Map
import java.util.List

class DockerComposeCompiler {

GeneratorHelpers generator_helper = new GeneratorHelpers()
DeploymentHelpers generator_helper = new DeploymentHelpers()

def create_devices(List<String> ports)'''
«IF ports.size() > 0»
Expand All @@ -31,8 +31,8 @@ services:
- ros

«IF system.getComponentStack().isEmpty()»
«" "»«system.name.toLowerCase»:
image: "«system.name.toLowerCase»:latest"
«" "»«generator_helper.get_uniqe_name(system.name.toLowerCase, ros_distro)»:
image: "«generator_helper.get_uniqe_name(system.name.toLowerCase, ros_distro)»:latest"
depends_on:
- ros-master
environment:
Expand All @@ -44,8 +44,8 @@ services:
command: stdbuf -o L roslaunch «system.name.toLowerCase» «system.name.toLowerCase».launch --wait
«ELSE»
«FOR stack:system.componentStack»
«" "»«system.name.toLowerCase»_«stack.name.toLowerCase»:
image: "«system.name.toLowerCase»_«stack.name.toLowerCase»:latest"
«" "»«generator_helper.get_uniqe_name(system.name.toLowerCase, ros_distro)»_«stack.name.toLowerCase»:
image: "«generator_helper.get_uniqe_name(system.name.toLowerCase, ros_distro)»_«stack.name.toLowerCase»:latest"
depends_on:
- ros-master
environment:
Expand All @@ -59,8 +59,22 @@ services:
«ENDFOR»
«ENDIF»
«ELSE»
Todo: complete docker compose file for ros2
«ENDIF»
version: "3.3"
services:
«IF system.getComponentStack().isEmpty()»
«" "»«generator_helper.get_uniqe_name(system.name.toLowerCase, ros_distro)»:
image: "«generator_helper.get_uniqe_name(system.name.toLowerCase, ros_distro)»:latest"
«create_devices(device_map.get(system.name))»
command: stdbuf -o L ros2 launch «system.name.toLowerCase» «system.name.toLowerCase».launch.py
«ELSE»
«FOR stack:system.componentStack»
«" "»«generator_helper.get_uniqe_name(system.name.toLowerCase, ros_distro)»_«stack.name.toLowerCase»:
image: "«generator_helper.get_uniqe_name(system.name.toLowerCase, ros_distro)»_«stack.name.toLowerCase»:latest"
«create_devices(device_map.get(stack.name))»
command: stdbuf -o L ros2 launch «system.name.toLowerCase»_«stack.name.toLowerCase» «stack.name.toLowerCase».launch.py

«ENDFOR»
«ENDIF»
«ENDIF»
'''
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,38 +2,39 @@ package de.fraunhofer.ipa.rossystem.deployment

import rossystem.RosSystem
import rossystem.ComponentStack
import de.fraunhofer.ipa.rossystem.generator.GeneratorHelpers
import de.fraunhofer.ipa.rossystem.deployment.DeploymentHelpers

class DockerContainerCompiler {
GeneratorHelpers generator_helper = new GeneratorHelpers()
DeploymentHelpers generator_helper = new DeploymentHelpers()

def dockerfile_header(Integer ros_version) '''
# syntax=docker/dockerfile:experimental
ARG SUFFIX=
ARG BUILDER_SUFFIX=:ros«ros_version»
ARG PREFIX=
ARG PREFIX=
'''
def compile_toDockerContainer(RosSystem system, ComponentStack stack, String ros_distro, Integer ros_version) '''«generator_helper.init_pkg()»
«dockerfile_header(ros_version)»
«IF stack===null»
«IF generator_helper.listOfRepos(system).isEmpty()»
FROM ros:«ros_distro»-ros-core as base
«ELSE»
FROM ${PREFIX}extra_layer_«system.name.toLowerCase»${SUFFIX} as base
FROM ${PREFIX}extra_layer_«generator_helper.get_uniqe_name(system.name.toLowerCase, ros_distro)»${SUFFIX} as base
«ENDIF»
«ELSE»
«IF generator_helper.listOfRepos(stack).isEmpty()»
FROM ros:«ros_distro»-ros-core as base
«ELSE»
FROM ${PREFIX}extra_layer_«stack.name.toLowerCase»${SUFFIX} as base
FROM ${PREFIX}extra_layer_«generator_helper.get_uniqe_name(system.name.toLowerCase, ros_distro)»_«stack.name.toLowerCase»${SUFFIX} as base
«ENDIF»
«ENDIF»
FROM ${PREFIX}builder${BUILDER_SUFFIX} as builder

FROM base as build
COPY . /root/ws/src/«IF stack===null»«system.name.toLowerCase»«ELSE»«system.name.toLowerCase»_«stack.name.toLowerCase»«ENDIF»/
COPY . /root/ws/src/«IF stack===null»«system.name.toLowerCase»«ELSE»«system.name.toLowerCase»_«stack.name.toLowerCase»«ENDIF»«IF ros_version===2»_ros2«ENDIF»/
RUN --mount=type=bind,from=builder,target=/builder \
apt-get update -qq && \
«IF ros_version===2»/builder/workspace.bash builder_setup && \«ENDIF»
/builder/workspace.bash build_workspace /root/ws && \
rm -rf /var/lib/apt/lists/*

Expand Down Expand Up @@ -63,7 +64,11 @@ RUN --mount=type=bind,from=builder,target=/builder --mount=type=bind,target=/roo
COPY --from=install /opt/ros/$ROS_DISTRO /opt/ros/$ROS_DISTRO

FROM deploy as launch
«IF ros_version==1»
«IF stack===null»CMD ["roslaunch", "«system.name»", "«system.name».launch"]«ELSE»CMD ["roslaunch", "«system.name.toLowerCase»_«stack.name.toLowerCase»", "«stack.name.toLowerCase».launch"]«ENDIF»
«ELSE»
«IF stack===null»CMD ["ros2", "launch", "«system.name.toLowerCase»", "«system.name.toLowerCase».launch.py"]«ELSE»CMD ["ros2", "launch", "«system.name.toLowerCase»_«stack.name.toLowerCase»", "«stack.name.toLowerCase».launch.py"]«ENDIF»
«ENDIF»
'''

def compile_toDockerImageExtraLayer(RosSystem system, ComponentStack stack, String ros_distro, Integer ros_version) '''«generator_helper.init_pkg()»
Expand All @@ -76,6 +81,7 @@ FROM base as pre_build
COPY * /root/ws/src/
RUN --mount=type=bind,from=builder,target=/builder \
apt-get update -qq && \
«IF ros_version===2»/builder/workspace.bash builder_setup && \«ENDIF»
/builder/workspace.bash update_list /root/ws && \
rm -rf /var/lib/apt/lists/*

Expand Down Expand Up @@ -103,7 +109,7 @@ RUN --mount=type=bind,from=builder,target=/builder \
/builder/workspace.bash install_depends /root/ws && \
rm -rf /var/lib/apt/lists/*

FROM pre_build as deploy
FROM build as deploy
RUN --mount=type=bind,from=builder,target=/builder \
--mount=type=bind,target=/root/ws,from=install,source=/root/ws \
apt-get update -qq && \
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package de.fraunhofer.ipa.rossystem.deployment

import rossystem.RosSystem
import de.fraunhofer.ipa.rossystem.generator.GeneratorHelpers
import de.fraunhofer.ipa.rossystem.deployment.DeploymentHelpers

class GitActionCompiler {

GeneratorHelpers generator_helper = new GeneratorHelpers()
DeploymentHelpers generator_helper = new DeploymentHelpers()

def default_part(String layer, String context_path, String needed_layer, String tag)'''
«layer»:
Expand Down Expand Up @@ -38,6 +38,10 @@ class GitActionCompiler {
key: ${{ runner.os }}-buildx-${{ github.sha }}
restore-keys: |
${{ runner.os }}-buildx-
-
name: Get Branch
id: extract_branch
run: echo ::set-output name=branch::$(echo ${GITHUB_REF#refs/heads/} | sed 's/[^a-zA-Z0-9-]/_/g')
-
name: Docker meta
id: docker_meta
Expand All @@ -47,10 +51,6 @@ class GitActionCompiler {
tags: |
«tag»
type=raw,value=latest
-
name: Get Branch
id: extract_branch
run: echo ::set-output name=branch::$(echo ${GITHUB_REF} | cut -d'/' -f3)
-
name: Build and Push Docker Image
uses: docker/build-push-action@v2
Expand All @@ -74,48 +74,52 @@ class GitActionCompiler {
def build_layer()'''
«default_part("builder", "./builder", null, "type=raw,value=${{ env.BUILDER_SUFFIX }}")»
'''
def extra_layer(String name, String path)'''
«default_part("extra_layer_"+name, String.join("/", ".",path,"extra_layer"), "builder", "type=ref,event=branch")»
def extra_layer(String sys_name, String ros_distro)
'''
«default_part("extra_layer_"+ generator_helper.get_uniqe_name(sys_name, ros_distro), String.join("/", ".",generator_helper.get_folder_name(sys_name, ros_distro),"extra_layer"), null, "type=raw,value=${{ steps.extract_branch.outputs.branch }}")»
'''
def extra_layer(String sys_name, String stack_name,String ros_distro)
'''
«default_part(String.join("_", "extra_layer", generator_helper.get_uniqe_name(sys_name, ros_distro), stack_name), String.join("/", ".",generator_helper.get_folder_name(sys_name, ros_distro), String.join("_", sys_name, stack_name),"extra_layer"), null, "type=raw,value=${{ steps.extract_branch.outputs.branch }}")»
'''
def system_layer(String sys_name, Boolean need_extra)'''
def system_layer(String sys_name, Boolean need_extra, String ros_distro)'''
«IF need_extra»
«default_part(sys_name, "./"+sys_name, "extra_layer_"+sys_name, "type=ref,event=branch")»
«default_part(generator_helper.get_uniqe_name(sys_name, ros_distro), "./"+ generator_helper.get_folder_name(sys_name, ros_distro), "extra_layer_"+ generator_helper.get_uniqe_name(sys_name, ros_distro), "type=raw,value=${{ steps.extract_branch.outputs.branch }}")»
«ELSE»
«default_part(sys_name, "./"+sys_name, "builder", "type=ref,event=branch")»
«default_part(generator_helper.get_uniqe_name(sys_name, ros_distro), "./"+ generator_helper.get_folder_name(sys_name, ros_distro), null, "type=raw,value=${{ steps.extract_branch.outputs.branch }}")»
«ENDIF»
'''
def stack_layer(String sys_name, String stack_name, Boolean need_extra)'''
def stack_layer(String sys_name, String stack_name, String ros_distro, Boolean need_extra)'''
«IF need_extra»
«default_part(sys_name+"_"+stack_name, String.join("/", ".",sys_name, sys_name+"_"+stack_name), "extra_layer_"+stack_name, "type=ref,event=branch")»
«default_part(generator_helper.get_uniqe_name(sys_name, ros_distro)+"_"+stack_name, String.join("/", ".",generator_helper.get_folder_name(sys_name, ros_distro), sys_name+"_"+stack_name), String.join("_", "extra_layer", generator_helper.get_uniqe_name(sys_name, ros_distro), stack_name), "type=raw,value=${{ steps.extract_branch.outputs.branch }}")»
«ELSE»
«default_part(sys_name+"_"+stack_name, String.join("/", ".",sys_name, sys_name+"_"+stack_name), "builder", "type=ref,event=branch")»
«default_part(generator_helper.get_uniqe_name(sys_name, ros_distro)+"_"+stack_name, String.join("/", ".",generator_helper.get_folder_name(sys_name, ros_distro), sys_name+"_"+stack_name), null, "type=raw,value=${{ steps.extract_branch.outputs.branch }}")»
«ENDIF»
'''
def compile_toGitAction(RosSystem system, Integer ros_version) '''«generator_helper.init_pkg()»
name: «system.name.toLowerCase»
def compile_toGitAction(RosSystem system, Integer ros_version, String ros_distro) '''«generator_helper.init_pkg()»
name: «generator_helper.get_uniqe_name(system.name.toLowerCase, ros_distro)»
on:
push:
paths:
- '«system.name.toLowerCase»/**'
- '«generator_helper.get_folder_name(system.name.toLowerCase, ros_distro)»/**'
env:
PREFIX: "${{ secrets.DOCKER_USERNAME }}/"
SUFFIX: ""
««« Todo: get distro from model
BUILDER_SUFFIX: ros«ros_version»
jobs:
«build_layer()»
«IF system.getComponentStack().isEmpty()»
«IF !generator_helper.listOfRepos(system).isEmpty()»
«extra_layer(system.name.toLowerCase, system.name.toLowerCase
«system_layer(system.name.toLowerCase, true)»
«extra_layer(system.name.toLowerCase, ros_distro
«system_layer(system.name.toLowerCase, true, ros_distro
«ELSE»
«system_layer(system.name.toLowerCase, false)»
«system_layer(system.name.toLowerCase, false, ros_distro
«ENDIF»
«ELSE»«FOR stack : system.getComponentStack()»«IF !generator_helper.listOfRepos(stack).isEmpty()»
«extra_layer(stack.name.toLowerCase, String.join("/", system.name.toLowerCase, system.name.toLowerCase + "_" + stack.name.toLowerCase)
«stack_layer(system.name.toLowerCase, stack.name.toLowerCase, true)»
«extra_layer(system.name.toLowerCase, stack.name.toLowerCase, ros_distro
«stack_layer(system.name.toLowerCase, stack.name.toLowerCase, ros_distro, true)»
«ELSE»
«stack_layer(system.name.toLowerCase, stack.name.toLowerCase, false)»
«stack_layer(system.name.toLowerCase, stack.name.toLowerCase, ros_distro, false)»
«ENDIF»
«ENDFOR»
«ENDIF»
Expand Down
Loading