Changelog
[v1.2.0] - 2026-05-20
Third release. Adds an open62541-based server with HistoryRead + HistoryUpdate enabled, used by php-opcua/opcua-client to exercise the HistoryUpdate service end-to-end (UA-.NETStandard does not implement it on its demo nodes).
Added
open62541-historizingservice — open62541 v1.4.8 built withUA_ENABLE_HISTORIZING=ON, hosting a singleDoublevariablens=2;s=Historizing.CounterwithaccessLevelincludingHISTORYREAD | HISTORYWRITEand aUA_HistoryDataBackend_Memory(capacity 1024). Host port24842:4840. No security, anonymous only.- The exposed node accepts
HistoryInsertData,HistoryReplaceData,HistoryUpdateData,HistoryDeleteRawModified,HistoryReadRaw.HistoryDeleteAtTimeand the Event subtypes are accepted (no protocol error) but the Memory backend does not implement the actual delete/event paths.
[v1.1.0] - 2026-05-12
Second release. Adds a permissive open62541-based mirror of the
uanetstandard-test-suite port 4843 (opcua-all-security) so the encryption
and username/password authentication paths can be exercised without the
UA-.NETStandard stack running, and so CI clients can validate every RSA
security policy against a second implementation.
Added
open62541-all-securityservice — open62541 v1.4.8 built withUA_ENABLE_ENCRYPTION=OPENSSLplus a small custom example (open62541-all-security/server.cin the build context) that wires every RSA security policy the build supports, every security mode (None/Sign/SignAndEncrypt), Anonymous + Username/Password authentication with the same four logins asuanetstandard-test-suite(admin/admin123,operator/operator123,viewer/viewer123,test/test). Host port24841:4840. Self-signed RSA-2048 server cert generated on first boot byentrypoint.sh(DER,subjectAltNameURI:urn:open62541.server.application,IP:127.0.0.1,DNS:localhost).- Permissive trust posture for the new service: replaces the default
trust-list-based PKI with
UA_CertificateVerification_AcceptAllon bothsecureChannelPKIandsessionPKI, and setsallowNonePolicyPassword = true. Mirrorsuanetstandard-test-suiteport 4845 (opcua-auto-accept) behaviour: ephemeral client certificates and plain-text passwords onSecurityPolicy#Noneare both accepted, no server-side pre-trust step required. Documented in README as a test posture — do NOT lift the wiring into a production server template. - Composite action waits for both ports.
action.ymlnow polls24840and24841in sequence and exits non-zero if either port fails to accept TCP withinstartup-timeoutseconds. The compose logs are dumped to the runner on any failure (previously dumped only when the single port-24840 check timed out).
Changed
- Action
descriptionand README rewritten to reflect the now-two-server inventory; the "single open62541 server" framing from v1.0.0 is gone. The "Future services" rule about staying clear of4840–4849still holds.
[v1.0.0] - initial release
First public release. Extracted from php-opcua/opcua-client where the
equivalent Dockerfile was living under .github/opcua-nodemanagement/ and was
being rebuilt on every CI run (3–5 min cold / ~1 min warm).
Added
- docker-compose.yml — source of truth for every server this suite ships.
Uses the
image:+build:dual pattern: local dev / publish workflow builds the services and tags them with the declared image name; the composite action pulls them pre-built from GHCR.TAGenv var is set tov<semver>by the publish workflow and defaults tolatestfor consumers of the action. Local default policy isrestart: unless-stoppedso developers start the suite once and it survives reboots — same pattern asuanetstandard-test-suite. - docker-compose.ci.yml — CI-only override merged on top of the base file
by the composite action. Sets
restart: "no"to match the ephemeral runner lifecycle (any restart would be meaningless on a VM that is about to be destroyed). open62541-nmservice — first and only service at v1.0.0. Dockerfile lives inopen62541-nm/Dockerfileand buildsopen62541 v1.4.8(pinned viaARG OPEN62541_REF) withUA_ENABLE_NODEMANAGEMENT=ON,UA_ENABLE_SUBSCRIPTIONS=ON,UA_ENABLE_METHODCALLS=ON,UA_ENABLE_HISTORIZING=ON,UA_NAMESPACE_ZERO=FULL. Multi-stage to keep the runtime image small (debian-slim + libssl3 + the built example binary). Fallback chain in the entrypoint (ci_server→server_ctt→access_control_server→ …) so the image keeps working if upstream renames or removes an example. Host port mapped to24840:4840to avoid clashes withuanetstandard-test-suite's4840–4849range.- Composite action (
action.yml) —uses: php-opcua/[email protected]doesdocker compose pull && docker compose up -dusing the action's own checkout as compose file source (github.action_path), mergingdocker-compose.ymlanddocker-compose.ci.yml. Inputs:image-tag(defaultlatest) andstartup-timeout(default30). No outputs: the endpoint URLs are part of the suite's versioned contract (port24840foropen62541-nm), just likeuanetstandard-test-suiteon4840-4849— the caller hardcodes them in its own test helpers. - Publish workflow (
.github/workflows/publish.yml) — on tag pushv*, runsdocker compose build --push(tags every service asghcr.io/<owner>/extra-test-suite/<service>:<tag>and pushes), then re-tags and pushes each image as:latest. GHA layer cache is reused across runs.