1. 12 Feb, 2026 1 commit
    • Ivan Matkov's avatar
      Build Docker images locally when `Dockerfile`s change (#1161) · 1b3f124b
      Ivan Matkov authored
      Fixes [SKIKO-1103](https://youtrack.jetbrains.com/issue/SKIKO-1103)
      Properly handle Dockerfile changes in CI
      
      ### 1. Handle Dockerfile Changes in CI
      When a PR modifies both the `Dockerfile` and C++ source, CI must build
      the library against the **new** container logic before merging to catch
      compatibility issues.
      Workflows now detect `Dockerfile` changes and automatically build images
      locally before running tests. When no `Dockerfile` changes are detected,
      published images from `ghcr.io` are used.
      
      ### 2. Avoid GLIBC Mismatches: Run GitHub Actions Outside Containers
      Running GitHub Actions native steps (like `actions/checkout`) inside
      custom containers causes GLIBC version mismatches since GitHub's
      Node.js-based actions require newer GLIBC than Amazon Linux 2 provides.
      This change introduced new composite action `docker-skiko-run` that runs
      GitHub actions outside the container on `ubuntu-24.04` runner, and only
      executes build/test commands inside the Docker container via `docker
      run`.
      
      ### 3. Environment Alignment: Use `linux-compat` for GitHub Actions
      Builds
      GitHub Actions used Ubuntu 20.04 images with GLIBC 2.31, while TeamCity
      publishing used Amazon Linux 2 with GLIBC 2.26. This mismatch could mask
      GLIBC compatibility issues during PR validation.
      Most GitHub Actions workflows now use `linux-compat` (Amazon Linux 2).
      - Web builds are out of the scope here because emsdk requires newer
      GLIBC.
      - Cross-compilation is out of the scope because there is no simply way
      to get arm shared libraries to x64 image on AL2
      
      Note: TeamCity publishing should be updated to use `linux-compat` too
      
      ### 4. Introduce Orchestrator Workflows
      New orchestrator workflows compose existing test/build/docs workflows:
      - **`pull-request.yml`** - Runs on every PR: detects Docker changes,
      builds images if needed (dry-run), runs tests + publish dry run + docs
      validation
      - **`post-merge.yml`** - Runs on push to master/release: detects Docker
      changes, publishes images if changed, runs tests + publish dry run +
      docs publication
      
      So, we should have fewer "Run CI" temporary PRs now
      
      ### 5. Documentation as Pre-Merge Check
      Documentation builds now run inside the same `linux-compat` Docker
      environment used for library builds, and are validated as part of PR
      checks (previously only ran post-merge).
      
      
      ### 6. Docker Tags Use Branch Names
      Published Docker images are tagged with the branch name (e.g., `master`,
      `release/0.9.46`), so the release branches might publish its own version
      of the image. This way changes in `master` shouldn't prevent making a
      patch for a previous version if it's required
      1b3f124b
  2. 10 Feb, 2026 1 commit
  3. 06 Feb, 2026 2 commits
  4. 05 Feb, 2026 1 commit
  5. 30 Jan, 2026 2 commits
  6. 29 Jan, 2026 1 commit
  7. 28 Jan, 2026 2 commits
    • ApoloApps's avatar
      Part 2 Extension functions non-allocate intermediate objects (#1140) · 3af0752f
      ApoloApps authored
      This is part 2 of [this
      pr](https://github.com/JetBrains/skiko/pull/1137)
      
      **What has changed?**
      1. Added more extension functions that prevent intermediate object
      allocations from a lot of the Skiko api surface
      2. Migrated EnumClass.values() to entries in a lot of classes (maybe
      some have been missed)
      
      **Next**
      Try (important keyword here :), cause if not wrong there are Skia and
      Compose diffs on how they're treated) doing less copies of Matrix
      
      ## Release Notes
      Added API that can accept primitive values instead of `Rect`, `RRect`, `Offset` to avoid additional object allocation
      3af0752f
    • Ivan Matkov's avatar
      Publish Docker Containers used on CI to GHCR (#1152) · 548fed39
      Ivan Matkov authored
      Fixes [SKIKO-1081](https://youtrack.jetbrains.com/issue/SKIKO-1081) Make
      docker images for building skiko publicly available
      
      The Skiko project previously used a private Docker registry
      (`registry.jetbrains.team/p/ui/skiko-docker`) for build containers,
      which required secrets for authentication. This prevented CI
      verification from fork PRs even after manual approval.
      
      The change migrates to GitHub Container Registry (GHCR), making
      containers publicly accessible and enabling CI to run on fork PRs.
      
      Containers built:
      https://github.com/orgs/JetBrains/packages?repo_name=skiko
      
      Triggers:
      - Push to master: Automatically builds and publishes all Docker images
      - Pull requests: Builds images in dry-run mode (no publishing) for
      verification
      - Manual workflow dispatch: Option to publish or just build
      - File changes: Triggers on changes to `skiko/docker/**` or the workflow
      itself
      548fed39
  8. 27 Jan, 2026 1 commit
  9. 19 Jan, 2026 1 commit
  10. 16 Jan, 2026 1 commit
  11. 08 Jan, 2026 1 commit
  12. 07 Jan, 2026 3 commits
  13. 05 Jan, 2026 1 commit
  14. 10 Dec, 2025 2 commits
  15. 01 Dec, 2025 1 commit
  16. 28 Nov, 2025 1 commit
  17. 27 Nov, 2025 1 commit
  18. 26 Nov, 2025 1 commit
  19. 24 Nov, 2025 3 commits
  20. 21 Nov, 2025 3 commits
    • Ivan Matkov's avatar
      Update GCC version to 10 (#1132) · c2cc37a0
      Ivan Matkov authored
      In 0.9.36, there was a missing symbol that caused
      ```
      libskiko-linux-x64.so: undefined symbol: _ZNSt19_Sp_make_shared_tag5_S_eqERKSt9type_info
      ```
      
      It's because the build attempts to statically link the C++ standard
      library, but:
      - Skia's object files reference newer libstdc++ symbols
      - GCC 7.3's `libstdc++` doesn't contain these symbols
      - The static linking fails to resolve these symbols
      
      GCC was downgraded from 9 to 7 in #1130 during the switch to AL2 to
      provide better GLIBC compatibility.
      Since AL2
      [provides](https://docs.aws.amazon.com/linux/al2/ug/c-cplusplus.html)
      only GCC 7.3 by default and GCC 10, installing GCC 9 is problematic
      there, so it's bumped to 10
      
      However, GCC 10 introduces outline atomics as default for new ARM chips,
      the build might fail due to missing symbols like
      ```
      org_jetbrains_skia_FontMgrWithFallback__1nDefaultWithFallbackFontProvider: error: undefined reference to '__aarch64_ldadd4_relax'
      org_jetbrains_skia_FontMgrWithFallback__1nDefaultWithFallbackFontProvider: error: undefined reference to '__aarch64_ldadd4_acq_rel'
      ```
      so, to keep things compatible with the previous GCC version,
      `-mno-outline-atomics` option was added to disable this new behavior.
      c2cc37a0
    • Ivan Matkov's avatar
      Fix glibc compatibility (#1130) · 49fea5b9
      Ivan Matkov authored
      [SKIKO-1066](https://youtrack.jetbrains.com/issue/SKIKO-1066) Support
      glibc 2.27
      [CMP-9307](https://youtrack.jetbrains.com/issue/CMP-9307) Support glibc
      2.27
      
      - Added `linux-compat` docker image based on #1123. It works on both x64
      and arm64 architectures
      - `multistrap` tool was replaced by installing required packages inside
      `linux-compat` and `linux-amd64` docker images
      - `linux-arm64` uses GCC instead of clang (aligning between
      distributions)
      - GitHub checks now use precompiled docker images to reuse the same
      environment
      - `ci.yml` and `web.yml` were combined into `tests.yml`
      - `publishToMavenLocal` checks are moved to `publish-dry-run.yml`
      - Add building an Android sample as part of CI checks
      
      ---------
      Co-authored-by: 's avatarVladislav.Ertel <vladislav.ertel@jetbrains.com>
      49fea5b9
    • Sebastian Sellmair's avatar
      Lock .skiko directory using lockfile when unpacking the native binary (#1128) · fbb08087
      Sebastian Sellmair authored
      In the compose hot reload project, we have seen races from multiple
      tests trying to unpack skiko into the .skiko directory. Currently, the
      library loading is only synchronized within the project. This MR also
      adds a .lock file, which has to be locked when modifying the dataDir.
      
      Note: This MR also changed the Library.load method from always entering
      a monitor, to resolving an atomic reference, best case.
      
      ## Release Notes
      ### Fixes - Desktop
      - Fixed a race condition that occurred when multiple processes attempted
      to unpack Skiko binary files at startup
      fbb08087
  21. 20 Nov, 2025 1 commit
  22. 12 Nov, 2025 5 commits
    • Igor Demin's avatar
      Revert "Fix signKotlinMultiplatformPublication on CI" (#1126) · e4cf12a1
      Igor Demin authored
      Reverts JetBrains/skiko#1125
      
      Fails on CI
      e4cf12a1
    • Igor Demin's avatar
      Fix signKotlinMultiplatformPublication on CI (#1125) · 8d247093
      Igor Demin authored
      Regression after https://github.com/JetBrains/skiko/pull/1119 was added
      on CI
      
      ```
      org.gradle.internal.execution.WorkValidationException: A problem was found with the configuration of task ':signKotlinMultiplatformPublication' (type 'Sign').
        - Gradle detected a problem with the following location: '/mnt/agent/work/381d14fe560aa354/skiko/build/libs/skiko-0.9.33-javadoc.jar.asc'.
      
          Reason: Task ':publishAwtRuntimeElementsPublicationToComposeRepoRepository' uses this output of task ':signKotlinMultiplatformPublication' without declaring an explicit or implicit dependency. This can lead to incorrect results being produced, depending on what order the tasks are executed.
      
          Possible solutions:
            1. Declare task ':signKotlinMultiplatformPublication' as an input of ':publishAwtRuntimeElementsPublicationToComposeRepoRepository'.
            2. Declare an explicit dependency on ':signKotlinMultiplatformPublication' from ':publishAwtRuntimeElementsPublicationToComposeRepoRepository' using Task#dependsOn.
            3. Declare an explicit dependency on ':signKotlinMultiplatformPublication' from ':publishAwtRuntimeElementsPublicationToComposeRepoRepository' using Task#mustRunAfter.
      ```
      
      The fix is blind as we can only test it in master
      8d247093
    • Sebastian Sellmair's avatar
      Publish 'skiko-awt-runtime' (#1119) · f0d0baa1
      Sebastian Sellmair authored
      This publication creates one variant for each native platform. 
      It allows depending (and exposing) a single dependency, which can later
      be resolved to platform-specific artifacts.
      
      <details>
      <summary>skiko-awt-runtime.module</summary>
      
      ```json
      {
        "formatVersion": "1.1",
        "component": {
          "group": "org.jetbrains.skiko",
          "module": "skiko-awt-runtime",
          "version": "1.0-SNAPSHOT",
          "attributes": {
            "org.gradle.status": "integration"
          }
        },
        "createdBy": {
          "gradle": {
            "version": "8.13"
          }
        },
        "variants": [
          {
            "name": "jvmRuntimeElements-macos-x64",
            "attributes": {
              "org.gradle.category": "library",
              "org.gradle.dependency.bundling": "external",
              "org.gradle.jvm.environment": "standard-jvm",
              "org.gradle.libraryelements": "jar",
              "org.gradle.native.architecture": "x86-64",
              "org.gradle.native.operatingSystem": "macos",
              "org.gradle.usage": "java-runtime",
              "org.jetbrains.kotlin.platform.type": "jvm"
            },
            "dependencies": [
              {
                "group": "org.jetbrains.skiko",
                "module": "skiko-awt-runtime-macos-x64",
                "version": {
                  "requires": "1.0-SNAPSHOT"
                }
              }
            ]
          },
          {
            "name": "jvmRuntimeElements-macos-arm64",
            "attributes": {
              "org.gradle.category": "library",
              "org.gradle.dependency.bundling": "external",
              "org.gradle.jvm.environment": "standard-jvm",
              "org.gradle.libraryelements": "jar",
              "org.gradle.native.architecture": "aarch64",
              "org.gradle.native.operatingSystem": "macos",
              "org.gradle.usage": "java-runtime",
              "org.jetbrains.kotlin.platform.type": "jvm"
            },
            "dependencies": [
              {
                "group": "org.jetbrains.skiko",
                "module": "skiko-awt-runtime-macos-arm64",
                "version": {
                  "requires": "1.0-SNAPSHOT"
                }
              }
            ]
          }
        ]
      }
      ```
      
      </details>
      
      
      <details>
      <summary>skiko-awt-runtime.pom</summary>
      
      ```xml
      <?xml version="1.0" encoding="UTF-8"?>
      <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <!-- This module was also published with a richer model, Gradle metadata,  -->
        <!-- which should be used instead. Do not delete the following line which  -->
        <!-- is to indicate to Gradle or any Gradle module metadata file consumer  -->
        <!-- that they should prefer consuming it instead. -->
        <!-- do_not_remove: published-with-gradle-metadata -->
        <modelVersion>4.0.0</modelVersion>
        <groupId>org.jetbrains.skiko</groupId>
        <artifactId>skiko-awt-runtime</artifactId>
        <version>1.0-SNAPSHOT</version>
        <packaging>pom</packaging>
        <name>Skiko JVM Runtime</name>
        <description>Kotlin Skia bindings</description>
        <url>https://www.github.com/JetBrains/skiko</url>
        <licenses>
          <license>
            <name>The Apache License, Version 2.0</name>
            <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
          </license>
        </licenses>
        <developers>
          <developer>
            <name>Compose Multiplatform Team</name>
            <organization>JetBrains</organization>
            <organizationUrl>https://www.jetbrains.com</organizationUrl>
          </developer>
        </developers>
        <scm>
          <connection>scm:git:https://www.github.com/JetBrains/skiko.git</connection>
          <developerConnection>scm:git:https://www.github.com/JetBrains/skiko.git</developerConnection>
          <url>https://www.github.com/JetBrains/skiko</url>
        </scm>
      </project>
      ```
      
      </details>
      
      
      
      Simple example usage:
      ```kotlin
      kotlin {
          target.attributes {
              attribute(ARCHITECTURE_ATTRIBUTE, objects.named(DefaultNativePlatform.getCurrentArchitecture().name))
              attribute(OPERATING_SYSTEM_ATTRIBUTE, objects.named(DefaultNativePlatform.getCurrentOperatingSystem().toFamilyName()))
          }
      }
      
      dependencies {
          implementation("org.jetbrains.skiko:skiko-awt:1.0-SNAPSHOT")
          implementation("org.jetbrains.skiko:skiko-awt-runtime:1.0-SNAPSHOT")
      }
      ```
      
      ## Motivation
      This allows 'intermediate' libraries to express that this dependency
      exists (in a single publication) and push down the artifact selection to
      consumers. This is an advanced feature and can be leveraged by more
      complex builds.
      
      ---------
      Co-authored-by: 's avatarIgor Demin <igor.demin@jetbrains.com>
      f0d0baa1
    • Ivan Matkov's avatar
      Use `macos-15` for CI checks (#1122) · 40c0ffb0
      Ivan Matkov authored
      It's due to
      > The macOS-13 based runner images are being deprecated, consider
      switching to macOS-15 (macos-15-intel) or macOS 15 arm64 (macos-latest)
      instead.
      40c0ffb0
    • Sebastian Sellmair's avatar
      [build] Properly mark jvm/awt source sets as optional, respecting the… (#1124) · 0d4b50d0
      Sebastian Sellmair authored
      … 'skiko.awt.enabled' feature flag
      0d4b50d0
  23. 05 Nov, 2025 2 commits
  24. 04 Nov, 2025 2 commits