Release nightly #205
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Release nightly | |
| on: | |
| workflow_dispatch: | |
| schedule: | |
| - cron: "0 23 * * *" | |
| env: | |
| FLWR_TELEMETRY_ENABLED: 0 | |
| jobs: | |
| authorize-manual-trigger: | |
| name: Authorize manual trigger | |
| uses: ./.github/workflows/_repo-authorize-manual-trigger.yml | |
| release-nightly: | |
| runs-on: ubuntu-24.04 | |
| name: Release nightly on PyPI | |
| if: github.repository == 'flwrlabs/flower' | |
| needs: authorize-manual-trigger | |
| outputs: | |
| skip: ${{ steps.release.outputs.skip }} | |
| pip-version: ${{ steps.release.outputs.pip-version }} | |
| setuptools-version: ${{ steps.release.outputs.setuptools-version }} | |
| matrix: ${{ steps.release.outputs.matrix }} | |
| steps: | |
| - uses: actions/checkout@v5 | |
| - name: Bootstrap | |
| id: bootstrap | |
| uses: ./.github/actions/bootstrap | |
| - name: Validate Docker publishing configuration | |
| run: | | |
| if [ -z "${{ vars.DOCKER_IMAGE_REGISTRY }}" ]; then | |
| echo "Missing required configuration: DOCKER_IMAGE_REGISTRY" >&2 | |
| exit 1 | |
| fi | |
| if [ -z "${{ vars.DOCKER_IMAGE_REGISTRY_USER }}" ]; then | |
| echo "Missing required configuration: DOCKER_IMAGE_REGISTRY_USER" >&2 | |
| exit 1 | |
| fi | |
| if [ -z "${{ vars.DOCKER_IMAGE_NAMESPACE }}" ]; then | |
| echo "Missing required configuration: DOCKER_IMAGE_NAMESPACE" >&2 | |
| exit 1 | |
| fi | |
| - name: Release nightly | |
| id: release | |
| env: | |
| PYPI_REPOSITORY_PASSWORD: ${{ secrets.PYPI_REPOSITORY_PASSWORD }} | |
| PYPI_REPOSITORY_URL: ${{ vars.PYPI_REPOSITORY_URL }} | |
| PYPI_REPOSITORY_NAME: ${{ vars.PYPI_REPOSITORY_NAME }} | |
| PYPI_REPOSITORY_USERNAME: ${{ vars.PYPI_REPOSITORY_USERNAME }} | |
| working-directory: framework | |
| run: | | |
| RESULT=$(./dev/publish-nightly.sh) | |
| if [ "$RESULT" == "There were no commits in the last 24 hours." ]; then | |
| echo "skip=true" >> $GITHUB_OUTPUT | |
| fi | |
| echo "pip-version=${{ steps.bootstrap.outputs.pip-version }}" >> "$GITHUB_OUTPUT" | |
| echo "setuptools-version=${{ steps.bootstrap.outputs.setuptools-version }}" >> "$GITHUB_OUTPUT" | |
| NAME=$(uv version | awk '{ print $1 }') | |
| VERSION=$(uv version --short) | |
| python dev/build-docker-image-matrix.py \ | |
| --flwr-version "${VERSION}" \ | |
| --flwr-package "${NAME}" \ | |
| --image-tag "${VERSION}" \ | |
| --image-tag nightly \ | |
| > matrix.raw.json | |
| python dev/release/resolve-docker-matrix.py \ | |
| --input matrix.raw.json \ | |
| --output matrix.json \ | |
| --docker-image-namespace "${{ vars.DOCKER_IMAGE_NAMESPACE }}" | |
| echo "matrix=$(cat matrix.json)" >> $GITHUB_OUTPUT | |
| build-docker-base-images: | |
| name: Build nightly base images | |
| if: github.repository == 'flwrlabs/flower' && needs.release-nightly.outputs.skip != 'true' | |
| uses: ./.github/workflows/_docker-build.yml | |
| needs: release-nightly | |
| strategy: | |
| fail-fast: false | |
| matrix: ${{ fromJson(needs.release-nightly.outputs.matrix).base }} | |
| with: | |
| registry: ${{ vars.DOCKER_IMAGE_REGISTRY }} | |
| # Keep base image repository aligned with BASE_REPOSITORY for nightly builds. | |
| image-repository: ${{ format('{0}/{1}/base', vars.DOCKER_IMAGE_REGISTRY, vars.DOCKER_IMAGE_NAMESPACE) }} | |
| file-dir: ${{ matrix.images.file_dir }} | |
| build-args: | | |
| PIP_VERSION=${{ needs.release-nightly.outputs.pip-version }} | |
| SETUPTOOLS_VERSION=${{ needs.release-nightly.outputs.setuptools-version }} | |
| ${{ matrix.images.build_args_encoded }} | |
| tags: ${{ matrix.images.tags_encoded }} | |
| docker-registry-user: ${{ vars.DOCKER_IMAGE_REGISTRY_USER }} | |
| secrets: | |
| docker-registry-token: ${{ secrets.DOCKER_IMAGE_REGISTRY_PASSWORD }} | |
| build-docker-binary-images: | |
| name: Build nightly binary images | |
| if: github.repository == 'flwrlabs/flower' && needs.release-nightly.outputs.skip != 'true' | |
| uses: ./.github/workflows/_docker-build.yml | |
| needs: [release-nightly, build-docker-base-images] | |
| strategy: | |
| fail-fast: false | |
| matrix: ${{ fromJson(needs.release-nightly.outputs.matrix).binary }} | |
| with: | |
| registry: ${{ vars.DOCKER_IMAGE_REGISTRY }} | |
| # Compose a fully qualified repository from host + namespace/repository for binary images. | |
| image-repository: ${{ format('{0}/{1}', vars.DOCKER_IMAGE_REGISTRY, matrix.images.namespace_repository) }} | |
| file-dir: ${{ matrix.images.file_dir }} | |
| # Keep BASE_REPOSITORY fully qualified so binary builds pull from the same registry. | |
| build-args: | | |
| BASE_REPOSITORY=${{ format('{0}/{1}/base', vars.DOCKER_IMAGE_REGISTRY, vars.DOCKER_IMAGE_NAMESPACE) }} | |
| BASE_IMAGE=${{ matrix.images.base_image }} | |
| tags: ${{ matrix.images.tags_encoded }} | |
| docker-registry-user: ${{ vars.DOCKER_IMAGE_REGISTRY_USER }} | |
| secrets: | |
| docker-registry-token: ${{ secrets.DOCKER_IMAGE_REGISTRY_PASSWORD }} |