diff --git a/.devcontainer/data-engineering/devcontainer.json b/.devcontainer/data-engineering/devcontainer.json deleted file mode 100644 index 92eade723f..0000000000 --- a/.devcontainer/data-engineering/devcontainer.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "name": "data-engineering", - "image": "mcr.microsoft.com/devcontainers/base:ubuntu", - "features": { - "ghcr.io/devcontainers/features/common-utils:2": { "configureZshAsDefaultShell": true }, - "ghcr.io/devcontainers/features/docker-in-docker:2": {}, - "../features/src/base": {}, - "../features/src/aws-tools": {} - }, - "remoteUser": "vscode", - "runArgs": ["--name=data-engineering-devcontainer"], - "mounts": [ - { "source": "ministryofjustice-data-platform-devcontainer-persisted", "target": "/opt/vscode-dev-containers", "type": "volume" }, - { "source": "ministryofjustice-data-platform-devcontainer-workspace", "target": "/home/vscode/workspace", "type": "volume" }, - { "source": "ministryofjustice-data-platform-devcontainer-commandhistory", "target": "/home/vscode/.commandhistory", "type": "volume" } - ], - "workspaceFolder": "/home/vscode/workspace", - "customizations": { - "vscode": { - "extensions": ["EditorConfig.EditorConfig", "GitHub.copilot", "GitHub.vscode-pull-request-github"] - } - } -} diff --git a/.devcontainer/devcontainer-build.json b/.devcontainer/devcontainer-build.json new file mode 100644 index 0000000000..3c9f4607af --- /dev/null +++ b/.devcontainer/devcontainer-build.json @@ -0,0 +1,21 @@ +{ + "name": "ministryofjustice-data-platform", + "image": "mcr.microsoft.com/devcontainers/base:ubuntu", + "features": { + "ghcr.io/devcontainers/features/common-utils:2": { "configureZshAsDefaultShell": true }, + "ghcr.io/devcontainers/features/docker-in-docker:2": {}, + "./features/src/base": {}, + "./features/src/aws-tools": {}, + "./features/src/cicd-tools": {}, + "./features/src/container-tools": {}, + "./features/src/git-tools": {}, + "./features/src/kubernetes-tools": {}, + "./features/src/policy-tools": {}, + "./features/src/pulumi-tools": {}, + "./features/src/terraform-tools": {} + }, + "overrideFeatureInstallOrder": [ + "ghcr.io/devcontainers/features/common-utils", + "./features/src/base" + ] +} diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000000..cbf2621504 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,12 @@ +{ + "name": "ministryofjustice-data-platform", + "image": "ghcr.io/ministryofjustice/data-platform-devcontainer:latest", + "remoteUser": "vscode", + "runArgs": ["--name=ministryofjustice-data-platform-devcontainer"], + "mounts": [ + { "source": "ministryofjustice-data-platform-devcontainer-persisted", "target": "/opt/vscode-dev-containers", "type": "volume" }, + { "source": "ministryofjustice-data-platform-devcontainer-workspace", "target": "/home/vscode/workspace", "type": "volume" }, + { "source": "ministryofjustice-data-platform-devcontainer-commandhistory", "target": "/home/vscode/.commandhistory", "type": "volume" } + ], + "workspaceFolder": "/home/vscode/workspace" +} diff --git a/.devcontainer/features/src/git-tools/devcontainer-feature.json b/.devcontainer/features/src/git-tools/devcontainer-feature.json index e4b3838b0b..ec282aae78 100644 --- a/.devcontainer/features/src/git-tools/devcontainer-feature.json +++ b/.devcontainer/features/src/git-tools/devcontainer-feature.json @@ -22,5 +22,10 @@ } }, "mounts": [{ "source": "ministryofjustice-data-platform-devcontainer-gh", "target": "/home/vscode/.config/gh", "type": "volume" }], + "customizations": { + "vscode": { + "extensions": ["EditorConfig.EditorConfig", "GitHub.vscode-pull-request-github", "GitHub.vscode-github-actions"] + } + }, "installsAfter": ["./features/src/base"] } diff --git a/.devcontainer/hack/build.sh b/.devcontainer/hack/build.sh new file mode 100644 index 0000000000..9a335a3a01 --- /dev/null +++ b/.devcontainer/hack/build.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +devcontainer build \ + --image-name "ghcr.io/ministryofjustice/data-platform-devcontainer:latest" \ + --platform "linux/arm64" \ + --push "false" \ + --workspace-folder . \ + --config .devcontainer/devcontainer-build.json diff --git a/.devcontainer/platform-engineering/devcontainer.json b/.devcontainer/platform-engineering/devcontainer.json deleted file mode 100644 index a216f347d9..0000000000 --- a/.devcontainer/platform-engineering/devcontainer.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "name": "platform-engineering", - "image": "mcr.microsoft.com/devcontainers/base:ubuntu", - "features": { - "ghcr.io/devcontainers/features/common-utils:2": { "configureZshAsDefaultShell": true }, - "ghcr.io/devcontainers/features/docker-in-docker:2": {}, - "../features/src/base": {}, - "../features/src/aws-tools": {}, - "../features/src/cicd-tools": {}, - "../features/src/container-tools": {}, - "../features/src/git-tools": {}, - "../features/src/kubernetes-tools": {}, - "../features/src/policy-tools": {}, - "../features/src/pulumi-tools": {}, - "../features/src/terraform-tools": {} - }, - "overrideFeatureInstallOrder": [ - "ghcr.io/devcontainers/features/common-utils", - "../features/src/base" - ], - "remoteUser": "vscode", - "runArgs": ["--name=platform-engineering-devcontainer"], - "mounts": [ - { "source": "ministryofjustice-data-platform-devcontainer-persisted", "target": "/opt/vscode-dev-containers", "type": "volume" }, - { "source": "ministryofjustice-data-platform-devcontainer-workspace", "target": "/home/vscode/workspace", "type": "volume" }, - { "source": "ministryofjustice-data-platform-devcontainer-commandhistory", "target": "/home/vscode/.commandhistory", "type": "volume" } - ], - "workspaceFolder": "/home/vscode/workspace", - "customizations": { - "vscode": { - "extensions": ["EditorConfig.EditorConfig", "GitHub.copilot", "GitHub.vscode-pull-request-github", "GitHub.vscode-github-actions"] - } - } -} diff --git a/.github/workflows/devcontainer.yml b/.github/workflows/devcontainer.yml index ef8486dcd4..9c58833924 100644 --- a/.github/workflows/devcontainer.yml +++ b/.github/workflows/devcontainer.yml @@ -9,6 +9,13 @@ on: # yamllint disable-line rule:truthy - .github/workflows/devcontainer.yml - .github/workflows/path-filter/devcontainer.yml - .devcontainer/** + push: + branches: + - main + paths: + - .github/workflows/devcontainer.yml + - .github/workflows/path-filter/devcontainer.yml + - .devcontainer/** permissions: read-all @@ -17,6 +24,7 @@ env: jobs: detect-changes: + if: github.ref != 'refs/heads/main' name: Detect changes runs-on: ubuntu-latest outputs: @@ -33,7 +41,7 @@ jobs: filters: .github/workflows/path-filter/devcontainer.yml test: - if: ${{ needs.detect-changes.outputs.features != '[]' }} + if: (github.ref == 'refs/heads/main') && (needs.detect-changes.outputs.features != '[]') needs: [detect-changes] name: Test runs-on: ubuntu-latest @@ -68,7 +76,7 @@ jobs: --base-image devcontainer test-scenarios: - if: ${{ needs.detect-changes.outputs.features != '[]' }} + if: (github.ref == 'refs/heads/main') && (needs.detect-changes.outputs.features != '[]') needs: [detect-changes] name: Test Scenarios runs-on: ubuntu-latest @@ -101,3 +109,80 @@ jobs: --features ${{ matrix.feature }} \ --skip-autogenerated \ --base-image devcontainer + + build: + if: github.ref != 'refs/heads/main' + name: Build + runs-on: ubuntu-latest + strategy: + matrix: + platform: [linux/amd64, linux/arm64] + steps: + - name: Checkout + id: checkout + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + + - name: Install devcontainer CLI + id: install_devcontainer_cli + run: npm install -g @devcontainers/cli@${{ env.DEVCONTAINER_CLI_VERSION }} + + - name: Set up Docker QEMU + if: ${{ matrix.platform == 'linux/arm64' }} + id: setup_docker_qemu + uses: docker/setup-qemu-action@2b82ce82d56a2a04d2637cd93a637ae1b359c0a7 # v2.2.0 + + - name: Set up Docker Buildx + if: ${{ matrix.platform == 'linux/arm64' }} + id: setup_docker_buildx + uses: docker/setup-buildx-action@4c0219f9ac95b02789c1075625400b2acbff50b1 # v2.9.1 + + - name: Build Image + id: build_image + run: | + devcontainer build \ + --platform ${{ matrix.platform }} \ + --image-name ghcr.io/ministryofjustice/data-platform-devcontainer \ + --workspace-folder . \ + --config .devcontainer/devcontainer-build.json + + publish: + # if: github.ref == 'refs/heads/main' + name: Publish + runs-on: ubuntu-latest + permissions: + id-token: write + packages: write + steps: + - name: Checkout + id: checkout + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + + - name: Install devcontainer CLI + id: install_devcontainer_cli + run: npm install -g @devcontainers/cli@${{ env.DEVCONTAINER_CLI_VERSION }} + + - name: Set up Docker QEMU + id: setup_docker_qemu + uses: docker/setup-qemu-action@2b82ce82d56a2a04d2637cd93a637ae1b359c0a7 # v2.2.0 + + - name: Set up Docker Buildx + id: setup_docker_buildx + uses: docker/setup-buildx-action@4c0219f9ac95b02789c1075625400b2acbff50b1 # v2.9.1 + + - name: Login to GitHub Container Registry + id: ghcr_login + uses: docker/login-action@465a07811f14bebb1938fbed4728c6a1ff8901fc # v2.2.0 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Publish Image + id: publish_image + run: | + devcontainer build \ + --image-name "ghcr.io/ministryofjustice/data-platform-devcontainer:latest" \ + --push "true" \ + --platform "linux/amd64,linux/arm64" \ + --workspace-folder . \ + --config .devcontainer/devcontainer-build.json