Skip to content

add CI to build several Element + module configurations #18

add CI to build several Element + module configurations

add CI to build several Element + module configurations #18

name: Element with modules
on:
push:
branches: # we want to build the widgets from the push into Element staging and publish a main container
- main
tags: # we want to build the stable widgets into stable Element and publish the container
- '@nordeck/element*module*'
pull_request: # we want to build the widgets from the PR into Element develop & staging
schedule: # we want to build the stable widgets into stable Element and publish the container, plus a verification of all dev versions on a daily basis
- cron: '0 5 * * 1-5'
workflow_dispatch: # we build whatever the user inputs and publish the container
inputs:
element:
description: 'Element Web version (git ref)'
required: true
type: 'string'
guestModule:
description: 'Element Guest module version (release tag/git ref/none)'
required: true
type: 'string'
opendeskModule:
description: 'Element openDesk module version (release tag/git ref/none)'
required: true
type: 'string'
lifecycleModule:
description: 'Element Widget Lifecycle module version (release tag/git ref/none)'
required: true
type: 'string'
togglesModule:
description: 'Element Widget Toggles module version (release tag/git ref/none)'
required: true
type: 'string'
jobs:
determine-versions:
name: Determine the versions for which to build containers
runs-on: gh-runner-nordeck
timeout-minutes: 15
permissions:
contents: read
outputs:
matrix: ${{ env.MATRIX }}
steps:
- name: Determine Element Web version
run: |
VERSION_ELEMENT_DEV="develop" # Element develop branch
VERSION_ELEMENT_STAGING="staging" # Element branch with the latest release candidate
VERSION_ELEMENT_STABLE="master" # Element cut their releases from master branch
VERSION_ELEMENT="$VERSION_ELEMENT_DEV"
if [[ "${{ github.event_name }}" == "push" ]] && ${{ startsWith(github.ref, 'refs/heads/main') }}; then VERSION_ELEMENT="$VERSION_ELEMENT_STAGING"; fi
if [[ "${{ github.event_name }}" == "push" ]] && ${{ startsWith(github.ref, 'refs/tags/') }}; then VERSION_ELEMENT="$VERSION_ELEMENT_STABLE"; fi
if [[ "${{ inputs.element }}" != "" ]]; then VERSION_ELEMENT="${{ inputs.element }}"; fi
echo "VERSION_ELEMENT=$VERSION_ELEMENT" >> $GITHUB_ENV
echo "VERSION_ELEMENT_STAGING=$VERSION_ELEMENT_STAGING" >> $GITHUB_ENV
echo "VERSION_ELEMENT_STABLE=$VERSION_ELEMENT_STABLE" >> $GITHUB_ENV
- uses: actions/checkout@v4
with:
fetch-tags: true
fetch-depth: 0
- name: Determine Guest module version
run: |
VERSION_MOD_GUEST_STABLE="$(git describe --match="@nordeck/element-web-guest-module*" --abbrev=0)"
VERSION_MOD_GUEST="main" # Development version
if [[ "${{ github.event_name }}" == "push" ]] && ${{ startsWith(github.ref, 'refs/tags/') }}; then VERSION_MOD_GUEST="$VERSION_MOD_GUEST_STABLE"; fi # latest release
if [[ "${{ github.event_name }}" == "pull_request" ]]; then VERSION_MOD_GUEST=${{ github.sha }}; fi # the local PR version
if [[ "${{ inputs.guestModule }}" != "" ]]; then VERSION_MOD_GUEST=${{ inputs.guestModule }}; fi
echo "VERSION_MOD_GUEST=$VERSION_MOD_GUEST" >> $GITHUB_ENV
echo "VERSION_MOD_GUEST_STABLE=$VERSION_MOD_GUEST_STABLE" >> $GITHUB_ENV
- name: Determine openDesk module version
run: |
VERSION_MOD_OPENDESK_STABLE="$(git describe --match="@nordeck/element-web-opendesk-module*" --abbrev=0)"
VERSION_MOD_OPENDESK="main" # Development version
if [[ "${{ github.event_name }}" == "push" ]] && ${{ startsWith(github.ref, 'refs/tags/') }}; then VERSION_MOD_OPENDESK="$VERSION_MOD_OPENDESK_STABLE"; fi # latest release
if [[ "${{ github.event_name }}" == "pull_request" ]]; then VERSION_MOD_OPENDESK=${{ github.sha }}; fi # the local PR version
if [[ "${{ inputs.opendeskModule }}" != "" ]]; then VERSION_MOD_OPENDESK=${{ inputs.opendeskModule }}; fi
echo "VERSION_MOD_OPENDESK=$VERSION_MOD_OPENDESK" >> $GITHUB_ENV
echo "VERSION_MOD_OPENDESK_STABLE=$VERSION_MOD_OPENDESK_STABLE" >> $GITHUB_ENV
- name: Determine Widget Lifecycle module version
run: |
VERSION_MOD_LIFECYCLE_STABLE="$(git describe --match="@nordeck/element-web-widget-lifecycle-module*" --abbrev=0)" # latest release
VERSION_MOD_LIFECYCLE="main" # Development version
if [[ "${{ github.event_name }}" == "push" ]] && ${{ startsWith(github.ref, 'refs/tags/') }}; then VERSION_MOD_LIFECYCLE="$VERSION_MOD_LIFECYCLE_STABLE"; fi # latest release
if [[ "${{ github.event_name }}" == "pull_request" ]]; then VERSION_MOD_LIFECYCLE=${{ github.sha }}; fi # the local PR version
if [[ "${{ inputs.lifecycleModule }}" != "" ]]; then VERSION_MOD_LIFECYCLE=${{ inputs.lifecycleModule }}; fi
echo "VERSION_MOD_LIFECYCLE=$VERSION_MOD_LIFECYCLE" >> $GITHUB_ENV
echo "VERSION_MOD_LIFECYCLE_STABLE=$VERSION_MOD_LIFECYCLE_STABLE" >> $GITHUB_ENV
- name: Determine Widget Toggles module version
run: |
VERSION_MOD_TOGGLES_STABLE="$(git describe --match="@nordeck/element-web-widget-toggles-module*" --abbrev=0)"
VERSION_MOD_TOGGLES="main" # Development version
if [[ "${{ github.event_name }}" == "push" ]] && ${{ startsWith(github.ref, 'refs/tags/') }}; then VERSION_MOD_TOGGLES="$VERSION_MOD_TOGGLES_STABLE"; fi
if [[ "${{ github.event_name }}" == "pull_request" ]]; then VERSION_MOD_TOGGLES=${{ github.sha }}; fi # the local PR version
if [[ "${{ inputs.togglesModule }}" != "" ]]; then VERSION_MOD_TOGGLES=${{ inputs.togglesModule }}; fi
echo "VERSION_MOD_TOGGLES=$VERSION_MOD_TOGGLES" >> $GITHUB_ENV
echo "VERSION_MOD_TOGGLES_STABLE=$VERSION_MOD_TOGGLES_STABLE" >> $GITHUB_ENV
- name: Create job matrix
run: |
LOCAL="{\"element\": \"${{ env.VERSION_ELEMENT }}\", \"guest\": \"${{ env.VERSION_MOD_GUEST }}\", \"opendesk\": \"${{ env.VERSION_MOD_OPENDESK }}\", \"lifecycle\": \"${{ env.VERSION_MOD_LIFECYCLE }}\", \"toggles\": \"${{ env.VERSION_MOD_TOGGLES }}\"}"
echo $LOCAL | jq
SECONDARY=""
if [[ "${{ github.event_name }}" == "pull_request" ]]
then
SECONDARY="{\"element\": \"${{ env.VERSION_ELEMENT_STAGING }}\", \"guest\": \"${{ env.VERSION_MOD_GUEST }}\", \"opendesk\": \"${{ env.VERSION_MOD_OPENDESK }}\", \"lifecycle\": \"${{ env.VERSION_MOD_LIFECYCLE }}\", \"toggles\": \"${{ env.VERSION_MOD_TOGGLES }}\"}"
echo $SECONDARY | jq
SECONDARY=",$SECONDARY"
elif [[ "${{ github.event_name }}" == "schedule" ]]
then
SECONDARY="{\"element\": \"${{ env.VERSION_ELEMENT_STABLE }}\", \"guest\": \"${{ env.VERSION_MOD_GUEST_STABLE }}\", \"opendesk\": \"${{ env.VERSION_MOD_OPENDESK_STABLE }}\", \"lifecycle\": \"${{ env.VERSION_MOD_LIFECYCLE_STABLE }}\", \"toggles\": \"${{ env.VERSION_MOD_TOGGLES_STABLE }}\"}"
echo $SECONDARY | jq
SECONDARY=",$SECONDARY"
fi
MATRIX="[${LOCAL}${SECONDARY}]"
echo $MATRIX | jq
echo "MATRIX=$MATRIX" >> $GITHUB_ENV
build-container:
name: Build OCI container of Element with modules
runs-on: gh-runner-nordeck
timeout-minutes: 15
permissions:
contents: read
packages: write
needs: determine-versions
strategy:
fail-fast: false
matrix:
include: ${{ fromJson(needs.determine-versions.outputs.matrix) }}
env:
DOCKER_PLATFORMS: linux/amd64,linux/arm64,linux/s390x
steps:
- name: Announce versions
run: |
echo "Building Element Web with modules, versions:"
echo "- Dockerfile ${{ github.sha }}"
echo "- Element Web ${{ matrix.element }}"
echo "- Guest module ${{ matrix.guest }}"
echo "- openDesk module ${{ matrix.opendesk }}"
echo "- Widget Lifecycle module ${{ matrix.lifecycle }}"
echo "- Widget Toggles module ${{ matrix.toggles }}"
- uses: actions/checkout@v4
- name: Set up node
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'yarn'
registry-url: 'https://registry.npmjs.org'
- name: Set up build_config.yaml
run: |
echo "modules:" > ../build_config.yaml
- name: Checkout Guest module version
if: ${{ matrix.guest != 'none' }}
uses: actions/checkout@v4
with:
ref: '${{ matrix.guest }}'
fetch-tags: true
fetch-depth: 0
- name: Build Guest module
if: ${{ ! (startsWith(matrix.guest, '@nordeck') || startsWith(matrix.guest, 'none')) }}
run: |
yarn install --frozen-lockfile
yarn workspace @nordeck/element-web-guest-module package
mv packages/element-web-guest-module/nordeck-element-web-guest-module.tgz ../
- name: Generate Guest module build_config.yaml entry and customisations.json
if: ${{ matrix.guest != 'none' }}
env:
VERSION: ${{ matrix.guest }}
IS_REF: ${{ ! startsWith(matrix.guest, '@nordeck') }}
run: |
VERSION="${{ env.VERSION }}"
HUMAN_GUEST="v$(echo ${{ env.VERSION }} | tr "@" "\n" | tail -1)"
if ${{ env.IS_REF }}
then
VERSION="file:nordeck-element-web-guest-module.tgz"
HUMAN_GUEST="$(git describe --exclude='*' --always)"
fi
echo " - '$VERSION'" >> ../build_config.yaml
cp e2e/src/deploy/elementWeb/customisations.json ../
HUMAN_GUEST="+g-${HUMAN_GUEST}"
echo "HUMAN_GUEST=$HUMAN_GUEST" >> $GITHUB_ENV
- name: Checkout openDesk module version
if: ${{ matrix.opendesk != 'none' }}
uses: actions/checkout@v4
with:
ref: '${{ matrix.opendesk }}'
fetch-tags: true
fetch-depth: 0
- name: Build openDesk module
if: ${{ ! (startsWith(matrix.opendesk, '@nordeck') || startsWith(matrix.opendesk, 'none')) }}
run: |
yarn install --frozen-lockfile
yarn workspace @nordeck/element-web-opendesk-module package
mv packages/element-web-opendesk-module/nordeck-element-web-opendesk-module.tgz ../
- name: Generate openDesk module build_config.yaml entry
if: ${{ matrix.opendesk != 'none' }}
env:
VERSION: ${{ matrix.opendesk }}
IS_REF: ${{ ! startsWith(matrix.opendesk, '@nordeck') }}
run: |
VERSION="${{ env.VERSION }}"
HUMAN_OPENDESK="v$(echo ${{ env.VERSION }} | tr "@" "\n" | tail -1)"
if ${{ env.IS_REF }}
then
VERSION="file:nordeck-element-web-opendesk-module.tgz"
HUMAN_OPENDESK="$(git describe --exclude='*' --always)"
fi
echo " - '$VERSION'" >> ../build_config.yaml
HUMAN_OPENDESK="+od-${HUMAN_OPENDESK}"
echo "HUMAN_OPENDESK=$HUMAN_OPENDESK" >> $GITHUB_ENV
- name: Checkout Widget Lifecycle module version
if: ${{ matrix.lifecycle != 'none' }}
uses: actions/checkout@v4
with:
ref: '${{ matrix.lifecycle }}'
fetch-tags: true
fetch-depth: 0
- name: Build Widget Lifecycle module
if: ${{ ! (startsWith(matrix.lifecycle, '@nordeck') || startsWith(matrix.lifecycle, 'none')) }}
run: |
yarn install --frozen-lockfile
yarn workspace @nordeck/element-web-widget-lifecycle-module package
mv packages/element-web-widget-lifecycle-module/nordeck-element-web-widget-lifecycle-module.tgz ../
- name: Generate Widget Lifecycle module build_config.yaml entry
if: ${{ matrix.lifecycle != 'none' }}
env:
VERSION: ${{ matrix.lifecycle }}
IS_REF: ${{ ! startsWith(matrix.lifecycle, '@nordeck') }}
run: |
VERSION="${{ env.VERSION }}"
HUMAN_LIFECYCLE="v$(echo ${{ env.VERSION }} | tr "@" "\n" | tail -1)"
if ${{ env.IS_REF }}
then
VERSION="file:nordeck-element-web-widget-lifecycle-module.tgz"
HUMAN_LIFECYCLE="$(git describe --exclude='*' --always)"
fi
echo " - '$VERSION'" >> ../build_config.yaml
HUMAN_LIFECYCLE="+wl-${HUMAN_LIFECYCLE}"
echo "HUMAN_LIFECYCLE=$HUMAN_LIFECYCLE" >> $GITHUB_ENV
- name: Checkout Widget Toggles module version
if: ${{ matrix.toggles != 'none' }}
uses: actions/checkout@v4
with:
ref: '${{ matrix.toggles }}'
fetch-tags: true
fetch-depth: 0
- name: Build Widget Toggles module
if: ${{ ! (startsWith(matrix.toggles, '@nordeck') || startsWith(matrix.toggles, 'none')) }}
run: |
yarn install --frozen-lockfile
yarn workspace @nordeck/element-web-widget-toggles-module package
mv packages/element-web-widget-toggles-module/nordeck-element-web-widget-toggles-module.tgz ../
- name: Generate Widget Toggles module build_config.yaml entry
if: ${{ matrix.toggles != 'none' }}
env:
VERSION: ${{ matrix.toggles }}
IS_REF: ${{ ! startsWith(matrix.toggles, '@nordeck') }}
run: |
VERSION=${{ env.VERSION }}
HUMAN_TOGGLES="v$(echo ${{ env.VERSION }} | tr "@" "\n" | tail -1)"
if ${{ env.IS_REF }}
then
VERSION="file:nordeck-element-web-widget-toggles-module.tgz"
HUMAN_TOGGLES="$(git describe --exclude='*' --always)"
fi
echo " - '$VERSION'" >> ../build_config.yaml
HUMAN_TOGGLES="+wt-${HUMAN_TOGGLES}"
echo "HUMAN_TOGGLES=$HUMAN_TOGGLES" >> $GITHUB_ENV
- name: Checkout Dockerfile version
uses: actions/checkout@v4
- name: Checkout Element version
uses: actions/checkout@v4
with:
repository: element-hq/element-web
ref: ${{ matrix.element }}
path: element-web
fetch-tags: true
- name: Determine human readable Element Web version
env:
IS_RELEASE: ${{ matrix.element == 'staging' || matrix.element == 'master' || startsWith(matrix.element,'v') }}
working-directory: element-web
run: |
HUMAN_ELEMENT="$(git describe --exclude='*' --always)"
if ${{ env.IS_RELEASE }}; then HUMAN_ELEMENT="$(git describe --abbrev=0)"; fi
echo "HUMAN_ELEMENT=$HUMAN_ELEMENT" >> $GITHUB_ENV
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to ghcr.io
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Generate Docker metadata
id: meta
uses: docker/metadata-action@v5
with:
images: ghcr.io/nordeck/element-web-modules
labels: |
org.opencontainers.image.title=Element Web with modules
org.opencontainers.image.description=A ready to use Element Web with all Nordeck modules.
org.opencontainers.image.vendor=Nordeck IT + Consulting GmbH
tags: |
type=raw,value=ew-${{ env.HUMAN_ELEMENT }}${{ env.HUMAN_GUEST }}${{ env.HUMAN_OPENDESK }}${{ env.HUMAN_LIFECYCLE }}${{ env.HUMAN_TOGGLES }}
# It can't start with a period or hyphen and must be no longer than 128 characters.
- name: Collect module source files
run: |
mv ../build_config.yaml e2e/src/deploy/elementWeb/
mv ../customisations.json e2e/src/deploy/elementWeb/ || ${{ matrix.guest == 'none' }}
mv ../nordeck-element-web-guest-module.tgz e2e/src/deploy/elementWeb/ || ${{ startsWith(matrix.guest, '@nordeck') || startsWith(matrix.guest, 'none') }}
mv ../nordeck-element-web-opendesk-module.tgz e2e/src/deploy/elementWeb/ || ${{ startsWith(matrix.opendesk, '@nordeck') || startsWith(matrix.opendesk, 'none') }}
mv ../nordeck-element-web-widget-lifecycle-module.tgz e2e/src/deploy/elementWeb/ || ${{ startsWith(matrix.lifecycle, '@nordeck') || startsWith(matrix.lifecycle, 'none') }}
mv ../nordeck-element-web-widget-toggles-module.tgz e2e/src/deploy/elementWeb/ || ${{ startsWith(matrix.toggles, '@nordeck') || startsWith(matrix.toggles, 'none') }}
- name: Build
uses: docker/build-push-action@v6
with:
context: e2e/src/deploy/elementWeb/
build-args: |
ELEMENT_VERSION=${{ matrix.element }}
platforms: ${{ env.DOCKER_PLATFORMS }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
push: ${{ github.event_name == 'push' && (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/')) || github.event_name == 'schedule' && matrix.element == 'master' || github.event_name == 'workflow_dispatch'}}