Files
iot-dc3/.github/workflows/docker-ci.yml
dependabot[bot]andHenry Zhang 344e1b1072 build(deps): bump docker/metadata-action from 5.10.0 to 6.2.0 (#130)
Bumps [docker/metadata-action](https://github.com/docker/metadata-action) from 5.10.0 to 6.2.0.
- [Release notes](https://github.com/docker/metadata-action/releases)
- [Commits](https://github.com/docker/metadata-action/compare/c299e40c65443455700f0fdfc63efafe5b349051...dc802804100637a589fabce1cb79ff13a1411302)

---
updated-dependencies:
- dependency-name: docker/metadata-action
  dependency-version: 6.2.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Henry Zhang <pnokers@icloud.com>
2026-08-03 12:22:30 +08:00

234 lines
7.9 KiB
YAML

name: Docker Images
on:
push:
tags:
- v*
workflow_dispatch:
permissions:
contents: read
concurrency:
group: docker-image-${{ github.ref }}
cancel-in-progress: false
env:
PROFILE: pro
DOCKER_REGISTRY_DEFAULT: pnoker
DOCKER_REGISTRY_ALIYUN: registry.cn-beijing.aliyuncs.com/dc3
jobs:
build-backend:
runs-on: ubuntu-latest
timeout-minutes: 180
permissions:
contents: read
actions: write # for GitHub Actions cache (--cache-to type=gha)
steps:
- name: Checkout
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
- name: Extract variables
id: variables
run: |
set -euo pipefail
# Read project.version from pom.xml without invoking Maven (the
# whole build runs inside Docker now; the runner does not need
# a JDK at all). iot-dc3's <version> is inherited from <parent>.
VERSION=$(awk -F'[<>]' '/<parent>/,/<\/parent>/{if($2=="version") print $3}' pom.xml | head -1)
SERIES="$VERSION"
if [[ "$VERSION" == *.*.* ]]; then
SERIES="${VERSION%.*}"
fi
echo "service_version=$VERSION" >> "$GITHUB_OUTPUT"
echo "service_series=$SERIES" >> "$GITHUB_OUTPUT"
- name: Set QEMU
uses: docker/setup-qemu-action@96fe6ef7f33517b61c61be40b68a1882f3264fb8
- name: Set Docker Buildx
uses: docker/setup-buildx-action@bb05f3f5519dd87d3ba754cc423b652a5edd6d2c
- name: Login Docker Default Registry
uses: docker/login-action@af1e73f918a031802d376d3c8bbc3fe56130a9b0
with:
username: ${{ vars.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Login Docker Aliyun Registry
uses: docker/login-action@af1e73f918a031802d376d3c8bbc3fe56130a9b0
with:
registry: registry.cn-beijing.aliyuncs.com
username: ${{ vars.ALIYUN_DOCKERHUB_USERNAME }}
password: ${{ secrets.ALIYUN_DOCKERHUB_TOKEN }}
- name: Build and push all images
env:
SERVICE_VERSION: ${{ steps.variables.outputs.service_version }}
SERVICE_SERIES: ${{ steps.variables.outputs.service_series }}
run: |
set -euo pipefail
services=(
dc3-gateway
dc3-center-agentic
dc3-center-auth
dc3-center-data
dc3-center-manager
dc3-center-single
dc3-driver-listening-virtual
dc3-driver-modbus-tcp
dc3-driver-modbus-rtu
dc3-driver-mqtt
dc3-driver-opc-da
dc3-driver-opc-ua
dc3-driver-plcs7
dc3-driver-virtual
dc3-driver-bacnet-ip
dc3-driver-ble
dc3-driver-can
dc3-driver-coap
dc3-driver-dlms
dc3-driver-ethernet-ip
dc3-driver-fins
dc3-driver-http
dc3-driver-iec104
dc3-driver-lwm2m
dc3-driver-melsec
dc3-driver-mysql
dc3-driver-oracle
dc3-driver-postgresql
dc3-driver-serial
dc3-driver-sl651
dc3-driver-snmp
dc3-driver-sqlserver
dc3-driver-tcp-udp
dc3-driver-zigbee
)
for name in "${services[@]}"; do
echo "Building and pushing: $name"
# Single root-level Dockerfile defines a target stage per service.
# The shared `builder` stage (mvn package) runs ONCE for the
# whole reactor; BuildKit reuses it across every target image.
# GHA cache (type=gha) persists the builder stage between runs so
# subsequent CI invocations only rebuild what actually changed.
docker buildx build \
--platform linux/arm64,linux/amd64 \
--file Dockerfile \
--target "$name" \
--build-arg PROFILE="$PROFILE" \
--cache-from type=gha,scope=dc3-builder \
--cache-to type=gha,scope=dc3-builder,mode=max \
--push \
--tag "$DOCKER_REGISTRY_DEFAULT/$name:latest" \
--tag "$DOCKER_REGISTRY_DEFAULT/$name:$SERVICE_SERIES" \
--tag "$DOCKER_REGISTRY_DEFAULT/$name:$SERVICE_VERSION" \
--tag "$DOCKER_REGISTRY_ALIYUN/$name:latest" \
--tag "$DOCKER_REGISTRY_ALIYUN/$name:$SERVICE_SERIES" \
--tag "$DOCKER_REGISTRY_ALIYUN/$name:$SERVICE_VERSION" \
.
done
build-web:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
- name: Set QEMU
uses: docker/setup-qemu-action@96fe6ef7f33517b61c61be40b68a1882f3264fb8
- name: Set Docker Buildx
uses: docker/setup-buildx-action@bb05f3f5519dd87d3ba754cc423b652a5edd6d2c
- name: Login DockerHub
uses: docker/login-action@af1e73f918a031802d376d3c8bbc3fe56130a9b0
with:
username: ${{ vars.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Login Aliyun Registry
uses: docker/login-action@af1e73f918a031802d376d3c8bbc3fe56130a9b0
with:
registry: registry.cn-beijing.aliyuncs.com
username: ${{ vars.ALIYUN_DOCKERHUB_USERNAME }}
password: ${{ secrets.ALIYUN_DOCKERHUB_TOKEN }}
- name: Docker metadata
id: meta
uses: docker/metadata-action@dc802804100637a589fabce1cb79ff13a1411302
with:
images: |
pnoker/dc3-web
registry.cn-beijing.aliyuncs.com/dc3/dc3-web
tags: |
type=match,pattern=v(.*),group=1
type=raw,value=latest
- name: Build and Push
uses: docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8
with:
context: .
file: dc3-web/Dockerfile
push: true
platforms: linux/arm64,linux/amd64
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha,scope=dc3-web
cache-to: type=gha,scope=dc3-web,mode=max
release:
runs-on: ubuntu-latest
needs:
- build-backend
- build-web
if: startsWith(github.ref, 'refs/tags/v')
timeout-minutes: 20
permissions:
contents: write
steps:
- name: Checkout
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
with:
fetch-depth: 0
- name: Extract variables
id: variables
run: |
set -euo pipefail
VERSION=$(awk -F'[<>]' '/<parent>/,/<\/parent>/{if($2=="version") print $3}' pom.xml | head -1)
echo "service_version=$VERSION" >> "$GITHUB_OUTPUT"
- name: Generate release notes
id: release_notes
env:
SERVICE_VERSION: ${{ steps.variables.outputs.service_version }}
SERVICE_WORKSPACE: ${{ github.workspace }}
run: |
set -euo pipefail
{
echo "release_notes<<RELEASE_NOTES_EOF"
echo ""
perl -pe 's/\$\{SERVICE_VERSION\}/$ENV{SERVICE_VERSION}/g' "$SERVICE_WORKSPACE/dc3/doc/TITLE.md"
echo ""
perl -pe 's/\$\{SERVICE_VERSION\}/$ENV{SERVICE_VERSION}/g' "$SERVICE_WORKSPACE/dc3/doc/CHANGE.md"
echo ""
perl -pe 's/\$\{SERVICE_VERSION\}/$ENV{SERVICE_VERSION}/g' "$SERVICE_WORKSPACE/dc3/doc/USAGE.md"
echo "RELEASE_NOTES_EOF"
} >> "$GITHUB_OUTPUT"
- name: Create GitHub Release
uses: softprops/action-gh-release@3d0d9888cb7fd7b750713d6e236d1fcb99157228
with:
name: ${{ steps.variables.outputs.service_version }}
body: ${{ steps.release_notes.outputs.release_notes }}
tag_name: ${{ github.ref_name }}
draft: false
prerelease: false
generate_release_notes: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}