Skip to content

Commit 0a10b0b

Browse files
authored
CI: Docker Workflow (#2568)
Build and Release Docker images on tag events.
1 parent d98329e commit 0a10b0b

File tree

135 files changed

+1140
-249
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

135 files changed

+1140
-249
lines changed

.github/workflows/docker.yml

+88
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
name: Build OpenEMS Docker Image
2+
3+
on:
4+
push:
5+
branches:
6+
- develop
7+
- main
8+
tags:
9+
- "*.*.*"
10+
11+
jobs:
12+
docker:
13+
runs-on: ubuntu-latest
14+
strategy:
15+
fail-fast: true
16+
matrix:
17+
image: [edge, backend, ui-edge, ui-backend]
18+
include:
19+
- image: edge
20+
dockerfile: tools/docker/edge/Dockerfile
21+
args: ""
22+
- image: ui-edge
23+
dockerfile: tools/docker/ui/Dockerfile
24+
args: "VERSION=openems,openems-edge-docker"
25+
- image: backend
26+
dockerfile: tools/docker/backend/Dockerfile
27+
args: ""
28+
- image: ui-backend
29+
dockerfile: tools/docker/ui/Dockerfile
30+
args: "VERSION=openems,openems-backend-docker"
31+
permissions:
32+
packages: write
33+
contents: read
34+
35+
steps:
36+
- name: Checkout
37+
uses: actions/checkout@v4
38+
39+
- name: Set up QEMU
40+
uses: docker/setup-qemu-action@v3
41+
42+
- name: Set up Docker Buildx
43+
uses: docker/setup-buildx-action@v3
44+
45+
- name: Get cleaned branch name
46+
id: clean_name
47+
run: |
48+
REF_NAME=$(echo "${{ github.ref }}" | sed -e 's/refs\/heads\///' -e 's/refs\/tags\///' -e 's/release\/v//')
49+
echo "branch=${REF_NAME}-test" >> "$GITHUB_OUTPUT"
50+
51+
- name: Login to Docker Hub
52+
uses: docker/login-action@v3
53+
with:
54+
username: ${{ secrets.DOCKERHUB_USERNAME }}
55+
password: ${{ secrets.DOCKERHUB_TOKEN }}
56+
57+
- name: Login to GitHub Container Registry
58+
uses: docker/login-action@v3
59+
with:
60+
registry: ghcr.io
61+
username: ${{ github.REPOSITORY_OWNER }}
62+
password: ${{ secrets.GITHUB_TOKEN }}
63+
64+
- name: Extract metadata (tags, labels) for Docker
65+
id: meta
66+
uses: docker/metadata-action@v5
67+
with:
68+
images: |
69+
openems/${{ matrix.image }}
70+
ghcr.io/openems/${{ matrix.image }}
71+
labels: |
72+
org.opencontainers.image.authors=OpenEMS
73+
org.opencontainers.image.title=OpenEMS ${{ matrix.image }}
74+
org.opencontainers.image.vendor=OpenEMS <openems.io>
75+
tags: |
76+
type=semver,pattern={{version}}
77+
type=raw,value=latest,enable=${{ github.ref == 'refs/heads/master' }}
78+
type=raw,value=develop,enable=${{ github.ref == 'refs/heads/develop' }}
79+
80+
- name: Build and push Docker images
81+
uses: docker/build-push-action@v5
82+
with:
83+
file: ${{ matrix.dockerfile }}
84+
platforms: linux/amd64, linux/arm64
85+
push: true
86+
tags: ${{ steps.meta.outputs.tags }}
87+
labels: ${{ steps.meta.outputs.labels }}
88+
build-args: ${{ matrix.args }}

.gitignore

+4-4
Original file line numberDiff line numberDiff line change
@@ -218,10 +218,10 @@ gradle-app.setting
218218
# docs
219219
/doc/build/package-lock.json
220220

221-
# tools (docker) build Directories
222-
/tools/docker/openems-backend/build
223-
/tools/docker/openems-edge/build
224-
/tools/docker/openems-ui/build
221+
# tools (gitpod) build Directories
222+
/tools/gitpod/openems-backend/build
223+
/tools/gitpod/openems-edge/build
224+
/tools/gitpod/openems-ui/build
225225
.atom-build.yml
226226

227227
# OpenEMS temp files

.gitpod.yml

+3-3
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@ tasks:
77
./gradlew build buildBackend -x test
88
rm /tmp/.gradle-lock
99
command: java
10-
-Dfelix.cm.dir=$(pwd)/tools/docker/openems-backend/config.d
10+
-Dfelix.cm.dir=$(pwd)/tools/gitpod/openems-backend/config.d
1111
-jar build/openems-backend.jar
1212
- init: |
1313
sleep 10 && while [ -f /tmp/.gradle-lock ]; do sleep 1; done
1414
./gradlew build buildEdge -x test
1515
command: java
16-
-Dfelix.cm.dir=$(pwd)/tools/docker/openems-edge/config.d
17-
-Dopenems.data.dir=$(pwd)/tools/docker/openems-edge/data
16+
-Dfelix.cm.dir=$(pwd)/tools/gitpod/openems-edge/config.d
17+
-Dopenems.data.dir=$(pwd)/tools/gitpod/openems-edge/data
1818
-jar build/openems-edge.jar
1919
- init: cd ui && npm install
2020
command: ng serve

tools/docker/README.md

+13-1
Original file line numberDiff line numberDiff line change
@@ -1 +1,13 @@
1-
This directory contains example Dockerfiles
1+
# How to use OpenEMS docker images.
2+
3+
## Backend
4+
5+
### see [Backend/README.md](./backend/README.md)
6+
7+
## Edge
8+
9+
### see [Edge/README.md](./edge/README.md)
10+
11+
## UI
12+
13+
### see [UI/README.md](./ui/README.md)

tools/docker/backend/Dockerfile

+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
ARG JAVA_VERSION=21
2+
3+
### Build backend binary
4+
FROM --platform=$BUILDPLATFORM eclipse-temurin:${JAVA_VERSION}-alpine AS build_backend
5+
6+
WORKDIR /src
7+
RUN --mount=type=bind,target=.,readwrite \
8+
--mount=type=cache,target=/root/.gradle \
9+
./gradlew --no-build-cache assemble && \
10+
./gradlew --no-build-cache buildBackend && \
11+
cp build/openems-backend.jar /opt
12+
13+
### Build jar container base
14+
FROM ghcr.io/linuxserver/baseimage-alpine:edge AS base_container
15+
16+
ARG JAVA_VERSION
17+
18+
RUN wget -O /etc/apk/keys/adoptium.rsa.pub https://packages.adoptium.net/artifactory/api/security/keypair/public/repositories/apk && \
19+
echo 'https://packages.adoptium.net/artifactory/apk/alpine/main' >> /etc/apk/repositories
20+
21+
RUN apk update && apk upgrade
22+
23+
RUN apk add --no-cache \
24+
temurin-${JAVA_VERSION}-jre
25+
26+
### Build backend container
27+
FROM base_container
28+
29+
COPY --from=build_backend /opt/ /opt/openems/
30+
COPY tools/docker/backend/root/ /
31+
32+
RUN find /etc/s6-overlay/s6-rc.d -type f -name 'run' -exec chmod +x {} \;
33+
34+
VOLUME /var/opt/openems/config
35+
VOLUME /var/opt/openems/data
36+
37+
EXPOSE 8079 8081 8082

tools/docker/backend/README.md

+80
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
# How to use OpenEMS Backend docker image:
2+
3+
- [How to use OpenEMS Backend docker image:](#how-to-use-openems-backend-docker-image)
4+
- [Start openems docker containers](#start-openems-docker-containers)
5+
- [With docker compose](#with-docker-compose)
6+
- [Setup Container](#setup-container)
7+
- [Setup Timedata.InfluxDB](#setup-timedatainfluxdb)
8+
- [Build your own OpenEMS Backend docker image](#build-your-own-openems-backend-docker-image)
9+
10+
11+
## Start openems docker containers
12+
13+
### With docker compose
14+
1. **Copy [docker-compose.yml](./docker-compose.yml) to a directory of your choice.**
15+
16+
2. **Typ the following command in the directory where the [docker-compose.yml](./docker-compose.yml) file is located.**
17+
18+
```bash
19+
docker compose up -d
20+
```
21+
22+
3. **Access OpenEMS in your browser.**
23+
24+
| | |
25+
| ------- | ---------------------------------------------- |
26+
| Backend | http://localhost:8079/system/console/configMgr |
27+
| UI | http://localhost:80/
28+
29+
## Setup Container
30+
### Setup Timedata.InfluxDB
31+
32+
1. **Setup InfluxDB**
33+
34+
```bash
35+
docker exec openems_influxdb influx setup \
36+
--username openems \
37+
--password WKeuIhl0deIJjrjoY62M \
38+
--org openems.io \
39+
--bucket openems \
40+
--force
41+
```
42+
43+
```bash
44+
docker exec openems_influxdb influx auth list
45+
```
46+
47+
*⚠️ Note down **Token***
48+
49+
2. **Open Backend [Apache-Felix](http://localhost:8079/system/console/configMgr).**
50+
51+
3. **Remove Timedata.Dummy**
52+
53+
4. **Add Timedata.InfluxDB**
54+
55+
*⚠️ Values not specified can be left at their default values*
56+
57+
| Timedata.InfluxDB | |
58+
| ----------------- | ---------------------------- |
59+
| Query Language | INFLUX_QL |
60+
| URL | http://openems_influxdb:8086 |
61+
| Org | openems.io |
62+
| ApiKey | *InfluxDB-Token* |
63+
| Bucket | openems |
64+
65+
----
66+
*for further information see [OpenEMS docs](https://openems.github.io/openems.io/openems/latest/introduction.html)*
67+
68+
## Build your own OpenEMS Backend docker image
69+
70+
1. **Go into the root directory of the OpenEMS project.**
71+
72+
2. **View or Change [Dockerfile](./Dockerfile)**
73+
74+
3. **Type the following build command.**
75+
76+
```bash
77+
docker build . -t openems_backend -f tools/docker/backend/Dockerfile
78+
```
79+
80+
*for UI Image see [ui/README.md](../ui/README.md)*
+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
version: "3"
2+
3+
services:
4+
openems_backend:
5+
image: openems/backend:latest
6+
container_name: openems_backend
7+
hostname: openems_backend
8+
restart: unless-stopped
9+
volumes:
10+
- openems-backend-conf:/var/opt/openems/config:rw
11+
- openems-backend-data:/var/opt/openems/data:rw
12+
ports:
13+
- 8079:8079 # Apache-Felix
14+
- 8081:8081 # Edge-Websocket
15+
- 8082:8082 # UI-Websocket
16+
17+
openems-ui:
18+
image: openems/ui-backend:latest
19+
container_name: openems_ui
20+
hostname: openems_ui
21+
restart: unless-stopped
22+
volumes:
23+
- openems-ui-conf:/etc/nginx:rw
24+
- openems-ui-log:/var/log/nginx:rw
25+
environment:
26+
- UI_WEBSOCKET=ws://localhost:8082
27+
ports:
28+
- 80:80
29+
- 443:443
30+
31+
openems_influxdb:
32+
image: influxdb:alpine
33+
container_name: openems_influxdb
34+
hostname: openems_influxdb
35+
restart: unless-stopped
36+
volumes:
37+
- openems-influxdb:/var/lib/influxdb2:rw
38+
ports:
39+
- 8086:8086
40+
41+
volumes:
42+
openems-backend-conf:
43+
openems-backend-data:
44+
openems-ui-conf:
45+
openems-ui-log:
46+
openems-influxdb:
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
───────────────────────────────────────────
2+
_____ _____ _____ _____ _____ _____ _____
3+
| | _ | __| | | __| | __|
4+
| | | __| __| | | | __| | | |__ |
5+
|_____|__| |_____|_|___|_____|_|_|_|_____|
6+
7+
Based on images from linuxserver.io
8+
───────────────────────────────────────────
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#!/usr/bin/with-contenv bash
2+
# shellcheck shell=bash
3+
4+
PUID=${PUID:-911}
5+
PGID=${PGID:-911}
6+
7+
groupmod -o -g "$PGID" abc
8+
usermod -o -u "$PUID" abc
9+
10+
cat /etc/s6-overlay/s6-rc.d/init-adduser/branding
11+
12+
echo "
13+
for further information visit:
14+
https://openems.io/
15+
16+
───────────────────────────────────────
17+
GID/UID: $(id -g abc)/$(id -u abc)
18+
───────────────────────────────────────"
19+
20+
lsiown abc:abc /app
21+
lsiown abc:abc /config
22+
lsiown abc:abc /defaults
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
oneshot
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/etc/s6-overlay/s6-rc.d/init-adduser/run
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#!/usr/bin/with-contenv bash
2+
# shellcheck shell=bash
3+
4+
# permissions
5+
lsiown -R abc:abc \
6+
/var/opt/openems \
7+
/opt/openems
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
oneshot
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/etc/s6-overlay/s6-rc.d/init-permissions/run

tools/docker/backend/root/etc/s6-overlay/s6-rc.d/svc-openems-backend/dependencies.d/init-services

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#!/usr/bin/with-contenv bash
2+
# shellcheck shell=bash
3+
4+
exec \
5+
s6-notifyoncheck -d -n 300 -w 1000 -c "nc -z 127.0.0.1 8079" \
6+
s6-setuidgid abc \
7+
/usr/bin/java -jar -Dfelix.cm.dir=/var/opt/openems/config -Dopenems.data.dir=/var/opt/openems/data /opt/openems/openems-backend.jar
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
longrun

tools/docker/backend/root/etc/s6-overlay/s6-rc.d/user/contents.d/init-permissions

Whitespace-only changes.

tools/docker/backend/root/etc/s6-overlay/s6-rc.d/user/contents.d/svc-openems-backend

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
:org.apache.felix.configadmin.revision:=L"1"
2+
debugMode="OFF"
3+
poolSize=I"10"
4+
port=I"8081"
5+
service.pid="Edge.Websocket"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
:org.apache.felix.configadmin.revision:=L"1"
2+
path="/var/opt/openems/metadata.json"
3+
service.pid="Metadata.File"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
:org.apache.felix.configadmin.revision:=L"1"
2+
id="timedata0"
3+
service.pid="Timedata.Dummy"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
:org.apache.felix.configadmin.revision:=L"2"
2+
debugMode="OFF"
3+
poolSize=I"10"
4+
port=I"8082"
5+
service.pid="Ui.Websocket"

0 commit comments

Comments
 (0)