name: Build & publish embedded packages for releases on: release: types: [published] pull_request: types: - synchronize - opened - labeled push: branches: [livekit] jobs: versioning: name: Versioning runs-on: ubuntu-latest outputs: DRY_RUN: ${{ steps.dry_run.outputs.DRY_RUN }} PREFIXED_VERSION: ${{ steps.prefixed_version.outputs.PREFIXED_VERSION }} UNPREFIXED_VERSION: ${{ steps.unprefixed_version.outputs.UNPREFIXED_VERSION }} TAG: ${{ steps.tag.outputs.TAG }} steps: - name: Calculate VERSION # We should only use the hard coded test value for a dry run run: echo "VERSION=${{ github.event_name == 'release' && github.event.release.tag_name || 'v0.0.0-pre.0' }}" >> "$GITHUB_ENV" - id: dry_run name: Set DRY_RUN # We perform a dry run for all events except releases. # This is to help make sure that we notice if the packaging process has become # broken ahead of a release. run: echo "DRY_RUN=${{ github.event_name != 'release' }}" >> "$GITHUB_OUTPUT" - id: prefixed_version name: Set PREFIXED_VERSION run: echo "PREFIXED_VERSION=${VERSION}" >> "$GITHUB_OUTPUT" - id: unprefixed_version name: Set UNPREFIXED_VERSION # This just strips the leading character run: echo "UNPREFIXED_VERSION=${VERSION:1}" >> "$GITHUB_OUTPUT" - id: tag # latest = a proper release # other = anything else name: Set tag run: | if [[ "${VERSION}" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then echo "TAG=latest" >> "$GITHUB_OUTPUT" else echo "TAG=other" >> "$GITHUB_OUTPUT" fi build_element_call: needs: versioning uses: ./.github/workflows/build-element-call.yaml with: vite_app_version: embedded-${{ needs.versioning.outputs.PREFIXED_VERSION }} package: embedded secrets: SENTRY_ORG: ${{ secrets.SENTRY_ORG }} SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }} SENTRY_URL: ${{ secrets.SENTRY_URL }} SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} publish_tarball: needs: [build_element_call, versioning] if: always() name: Publish tarball runs-on: ubuntu-latest permissions: contents: write # required to upload release asset steps: - name: Determine filename run: echo "FILENAME_PREFIX=element-call-embedded-${{ needs.versioning.outputs.UNPREFIXED_VERSION }}" >> "$GITHUB_ENV" - name: 📥 Download built element-call artifact uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 with: github-token: ${{ secrets.GITHUB_TOKEN }} run-id: ${{ github.event.workflow_run.id || github.run_id }} name: build-output-embedded path: ${{ env.FILENAME_PREFIX}} - name: Create Tarball run: tar --numeric-owner -cvzf ${{ env.FILENAME_PREFIX }}.tar.gz ${{ env.FILENAME_PREFIX }} - name: Create Checksum run: find ${{ env.FILENAME_PREFIX }} -type f -print0 | sort -z | xargs -0 sha256sum | tee ${{ env.FILENAME_PREFIX }}.sha256 - name: Upload if: ${{ needs.versioning.outputs.DRY_RUN == 'false' }} uses: softprops/action-gh-release@da05d552573ad5aba039eaac05058a918a7bf631 # v2 with: files: | ${{ env.FILENAME_PREFIX }}.tar.gz ${{ env.FILENAME_PREFIX }}.sha256 publish_npm: needs: [build_element_call, versioning] if: always() name: Publish NPM runs-on: ubuntu-latest outputs: ARTIFACT_VERSION: ${{ steps.artifact_version.outputs.ARTIFACT_VERSION }} permissions: contents: read id-token: write # required for the provenance flag on npm publish steps: - name: Checkout uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - name: 📥 Download built element-call artifact uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 with: github-token: ${{ secrets.GITHUB_TOKEN }} run-id: ${{ github.event.workflow_run.id || github.run_id }} name: build-output-embedded path: embedded/web/dist # n.b. We don't enable corepack here because we are using plain npm - name: Setup node uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4 with: node-version-file: .node-version registry-url: "https://registry.npmjs.org" - name: Publish npm working-directory: embedded/web run: | npm version ${{ needs.versioning.outputs.PREFIXED_VERSION }} --no-git-tag-version echo "ARTIFACT_VERSION=$(jq '.version' --raw-output package.json)" >> "$GITHUB_ENV" npm publish --provenance --access public --tag ${{ needs.versioning.outputs.TAG }} ${{ needs.versioning.outputs.DRY_RUN == 'true' && '--dry-run' || '' }} env: NODE_AUTH_TOKEN: ${{ secrets.NPM_RELEASE_TOKEN }} - id: artifact_version name: Output artifact version run: echo "ARTIFACT_VERSION=${{env.ARTIFACT_VERSION}}" >> "$GITHUB_OUTPUT" publish_android: needs: [build_element_call, versioning] if: always() name: Publish Android AAR runs-on: ubuntu-latest outputs: ARTIFACT_VERSION: ${{ steps.artifact_version.outputs.ARTIFACT_VERSION }} permissions: contents: read steps: - name: Checkout uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - name: 📥 Download built element-call artifact uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 with: github-token: ${{ secrets.GITHUB_TOKEN }} run-id: ${{ github.event.workflow_run.id || github.run_id }} name: build-output-embedded path: embedded/android/lib/src/main/assets/element-call - name: ☕️ Setup Java uses: actions/setup-java@c5195efecf7bdfc987ee8bae7a71cb8b11521c00 # v4 with: distribution: "temurin" java-version: "17" - name: Get artifact version # Anything that is not a final release will be tagged as a snapshot run: | if [[ "${{ needs.versioning.outputs.TAG }}" == "latest" ]]; then echo "ARTIFACT_VERSION=${{ needs.versioning.outputs.UNPREFIXED_VERSION }}" >> "$GITHUB_ENV" else echo "ARTIFACT_VERSION=${{ needs.versioning.outputs.UNPREFIXED_VERSION }}-SNAPSHOT" >> "$GITHUB_ENV" fi - name: Set version string run: sed -i "s/0.0.0/${{ env.ARTIFACT_VERSION }}/g" embedded/android/lib/src/main/kotlin/io/element/android/call/embedded/Version.kt - name: Publish AAR working-directory: embedded/android env: EC_VERSION: ${{ env.ARTIFACT_VERSION }} ORG_GRADLE_PROJECT_mavenCentralUsername: ${{ secrets.MAVEN_RELEASE_USERNAME }} ORG_GRADLE_PROJECT_mavenCentralPassword: ${{ secrets.MAVEN_RELEASE_PASSWORD }} ORG_GRADLE_PROJECT_signingInMemoryKey: ${{ secrets.GPG_SIGNING_KEY }} ORG_GRADLE_PROJECT_signingInMemoryKeyPassword: ${{ secrets.GPG_SIGNING_KEY_PASSWORD }} run: ./gradlew publishToMavenCentral --no-daemon ${{ needs.versioning.outputs.DRY_RUN == 'true' && '--dry-run' || '' }} - id: artifact_version name: Output artifact version run: echo "ARTIFACT_VERSION=${{env.ARTIFACT_VERSION}}" >> "$GITHUB_OUTPUT" publish_ios: needs: [build_element_call, versioning] if: always() name: Publish SwiftPM Library runs-on: ubuntu-latest outputs: ARTIFACT_VERSION: ${{ steps.artifact_version.outputs.ARTIFACT_VERSION }} permissions: contents: read steps: - name: Checkout uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 with: path: element-call - name: 📥 Download built element-call artifact uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 with: github-token: ${{ secrets.GITHUB_TOKEN }} run-id: ${{ github.event.workflow_run.id || github.run_id }} name: build-output-embedded path: element-call/embedded/ios/Sources/dist - name: Checkout element-call-swift uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 with: repository: element-hq/element-call-swift path: element-call-swift token: ${{ secrets.SWIFT_RELEASE_TOKEN }} - name: Copy files run: rsync -a --delete --exclude .git element-call/embedded/ios/ element-call-swift - name: Get artifact version run: echo "ARTIFACT_VERSION=${{ needs.versioning.outputs.UNPREFIXED_VERSION }}" >> "$GITHUB_ENV" - name: Set version string run: sed -i "s/0.0.0/${{ env.ARTIFACT_VERSION }}/g" element-call-swift/Sources/EmbeddedElementCall/EmbeddedElementCall.swift - name: Test build working-directory: element-call-swift run: swift build - name: Commit and tag working-directory: element-call-swift run: | git config --global user.email "ci@element.io" git config --global user.name "Element CI" git add -A git commit -am "Release ${{ needs.versioning.outputs.PREFIXED_VERSION }}" git tag -a ${{ env.ARTIFACT_VERSION }} -m "${{ github.event.release.html_url }}" - name: Push working-directory: element-call-swift run: | git push --tags ${{ needs.versioning.outputs.DRY_RUN == 'true' && '--dry-run' || '' }} - id: artifact_version name: Output artifact version run: echo "ARTIFACT_VERSION=${{env.ARTIFACT_VERSION}}" >> "$GITHUB_OUTPUT" release_notes: needs: [versioning, publish_npm, publish_android, publish_ios] if: always() name: Update release notes runs-on: ubuntu-latest permissions: contents: write # to update release notes steps: - name: Log versions run: | echo "NPM: ${{ needs.publish_npm.outputs.ARTIFACT_VERSION }}" echo "Android: ${{ needs.publish_android.outputs.ARTIFACT_VERSION }}" echo "iOS: ${{ needs.publish_ios.outputs.ARTIFACT_VERSION }}" - name: Add release notes if: ${{ needs.versioning.outputs.DRY_RUN == 'false' }} uses: softprops/action-gh-release@da05d552573ad5aba039eaac05058a918a7bf631 # v2 with: append_body: true body: | ## Embedded packages This release includes the following embedded packages that allow Element Call to be used as an embedded widget within another application. ### NPM ``` npm install @element-hq/element-call-embedded@${{ needs.publish_npm.outputs.ARTIFACT_VERSION }} ``` ### Android AAR ``` dependencies { implementation 'io.element.android:element-call-embedded:${{ needs.publish_android.outputs.ARTIFACT_VERSION }}' } ``` ### SwiftPM ``` .package(url: "https://github.com/element-hq/element-call-swift.git", from: "${{ needs.publish_ios.outputs.ARTIFACT_VERSION }}") ```