From 0554b1b42187d16cf8a0317a6ea8c0391c4fe190 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Ber=C4=8Di=C4=8D?= Date: Thu, 14 Nov 2024 02:51:33 +0200 Subject: [PATCH] docker: Add Dockerfile for developing ROFL on macOS --- .github/workflows/rofl-dev-image.yml | 83 ++++++++++++++++++++++++++++ docker/rofl-dev/Dockerfile | 9 +++ docs/rofl/prerequisites.md | 33 ++++++++--- 3 files changed, 118 insertions(+), 7 deletions(-) create mode 100644 .github/workflows/rofl-dev-image.yml create mode 100644 docker/rofl-dev/Dockerfile diff --git a/.github/workflows/rofl-dev-image.yml b/.github/workflows/rofl-dev-image.yml new file mode 100644 index 0000000000..a61342bb90 --- /dev/null +++ b/.github/workflows/rofl-dev-image.yml @@ -0,0 +1,83 @@ +# NOTE: This name appears in GitHub's Checks API and in workflow's status badge. +name: rofl-dev-image + +on: + push: + # XXX: ideally on main branches we would build the image only if there are changes in the + # 'docker/' directory (as we do in pull_requests). However, this doesn't work when pushing a new + # 'stable/*' branch - the build on a new branch does not trigger unless there are changes + # compared to main on the filtered path. + # If this is ever fixed, or per branch filters are possible, bring back the path filter to only + # build the image when there are changes within 'docker/' directory. + branches: + - main + - stable/* + # Or when a pull request event occurs for a pull request against one of the matched branches and at least + # one modified file matches the configured paths. + # + # NOTE: We use this to be able to easily test Docker image changes. + pull_request: + branches: + - main + - stable/* + paths: + - docker/rofl-dev/** + # Or every day at 04:00 UTC (for the default/main branch). + schedule: + - cron: "0 4 * * *" + +# Cancel in-progress jobs on same branch. +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + + build-rofl-dev: + # NOTE: This name appears in GitHub's Checks API. + name: build-rofl-dev + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + # Check out pull request's HEAD commit instead of the merge commit. + ref: ${{ github.event.pull_request.head.sha }} + + - name: Determine tag name + id: determine-tag + uses: ./.github/actions/determine-tag + + - 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.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: "Rebuild oasisprotocol/rofl-dev:${{ steps.determine-tag.outputs.tag }}" + uses: docker/build-push-action@v5 + with: + context: docker/rofl-dev + file: docker/rofl-dev/Dockerfile + tags: ghcr.io/oasisprotocol/rofl-dev:${{ steps.determine-tag.outputs.tag }} + pull: true + push: true + labels: | + org.opencontainers.image.source=${{ github.event.repository.html_url }} + org.opencontainers.image.created=${{ steps.determine-tag.outputs.created }} + org.opencontainers.image.revision=${{ github.sha }} + + - name: Prune old ghcr.io/oasisprotocol/rofl-dev images + uses: vlaurin/action-ghcr-prune@v0.6.0 + with: + token: ${{ secrets.GITHUB_TOKEN }} + organization: oasisprotocol + container: rofl-dev + keep-younger-than: 7 # days + keep-last: 2 + prune-untagged: true + prune-tags-regexes: ^pr- diff --git a/docker/rofl-dev/Dockerfile b/docker/rofl-dev/Dockerfile new file mode 100644 index 0000000000..f2eea73532 --- /dev/null +++ b/docker/rofl-dev/Dockerfile @@ -0,0 +1,9 @@ +FROM ghcr.io/oasisprotocol/oasis-core-dev:stable-24.3.x AS oasis-core-dev + +ARG OASIS_CLI_VERSION=0.10.3 + +RUN curl -L -o /tmp/cli.tar.gz "https://github.com/oasisprotocol/cli/releases/download/v${OASIS_CLI_VERSION}/oasis_cli_${OASIS_CLI_VERSION}_linux_amd64.tar.gz" && \ + tar -C /usr/bin -xf /tmp/cli.tar.gz --strip-components 1 "oasis_cli_${OASIS_CLI_VERSION}_linux_amd64/oasis" && \ + rm /tmp/cli.tar.gz + +VOLUME /src diff --git a/docs/rofl/prerequisites.md b/docs/rofl/prerequisites.md index 27742e6d04..5479f1b9c1 100644 --- a/docs/rofl/prerequisites.md +++ b/docs/rofl/prerequisites.md @@ -17,6 +17,27 @@ If you already have everything set up, feel free to skip to the [next chapter]. The following is a list of prerequisites required to start developing using the Oasis SDK: +:::info + +Docker images are available to help you set up a development +environment. If you don't want to install everything locally (or **in +particular if you use macOS** as your development system), you can use +the `ghcr.io/oasisprotocol/rofl-dev` image, which contains all the tools +needed to compile a ROFL app. + +To use it, bind the directory with your app source to the container's +`/src` directory with a command like the following, then continue with +the next section of this guide: + +```bash +docker run --platform linux/amd64 --volume ./rofl-oracle:/src -it ghcr.io/oasisprotocol/rofl-dev +``` + +Note that on macOS you **must** use the `--platform linux/amd64` +parameter, no matter which processor your computer has. + +::: + ### [Rust] We follow [Rust upstream's recommendation][rust-upstream-rustup] on using @@ -77,20 +98,18 @@ nightly-2022-08-22-x86_64-unknown-linux-gnu (overridden by '/code/rust-toolchain rustc 1.65.0-nightly (c0941dfb5 2022-08-21) ``` -For testing ROFL binaries on Sapphire Localnet, the binaries should be compiled -for [MUSL C standard library]. You will need to add the following target to your -rust environment: +Make sure you have the correct target for rust to compile for: ```shell -rustup target add x86_64-unknown-linux-musl +rustup target add x86_64-unknown-linux-gnu ``` -Additionally, you will need the MUSL wrapper for gcc, the multilib package and -clang for compiling the `mbedtls-sys-auto` dependency. On Ubuntu/Debian systems, +In addition, you will need gcc's multilib support package and clang for +compiling the `mbedtls-sys-auto` dependency. On Ubuntu/Debian systems, you can install those by running: ```shell -sudo apt install musl-tools gcc-multilib clang +sudo apt install gcc-multilib clang ```