name: Build and Push Development Images on: push: branches: - main paths: - 'images/**' - 'VERSION' pull_request: branches: - main schedule: # Weekly rebuild to get latest security updates (Mondays 2 AM UTC) - cron: '0 2 * * 1' workflow_dispatch: inputs: force_rebuild: description: 'Force rebuild all images' required: false default: 'false' env: REGISTRY: registry.home.deepblack.cloud IMAGE_PREFIX: chorus jobs: build-base: runs-on: ubuntu-latest outputs: version: ${{ steps.version.outputs.version }} steps: - uses: actions/checkout@v4 - name: Read version id: version run: echo "version=$(cat VERSION)" >> $GITHUB_OUTPUT - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Login to Registry run: | echo "${{ secrets.REGISTRY_PASSWORD }}" | docker login ${{ env.REGISTRY }} -u "${{ secrets.REGISTRY_USERNAME }}" --password-stdin - name: Build and push base image run: | docker buildx build \ --platform linux/amd64 \ --target base \ --push \ --tag ${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/base:latest \ --tag ${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/base:${{ steps.version.outputs.version }} \ --cache-from type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/base:buildcache \ --cache-to type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/base:buildcache,mode=max \ -f images/base/Dockerfile \ images/base build-rust: needs: build-base runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Login to Registry run: | echo "${{ secrets.REGISTRY_PASSWORD }}" | docker login ${{ env.REGISTRY }} -u "${{ secrets.REGISTRY_USERNAME }}" --password-stdin - name: Build and push rust-dev run: | docker buildx build \ --platform linux/amd64 \ --target rust-dev \ --push \ --tag ${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/rust-dev:latest \ --tag ${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/rust-dev:${{ needs.build-base.outputs.version }} \ --cache-from type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/rust-dev:buildcache \ --cache-to type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/rust-dev:buildcache,mode=max \ -f images/base/Dockerfile \ images/base build-go: needs: build-base runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Login to Registry run: | echo "${{ secrets.REGISTRY_PASSWORD }}" | docker login ${{ env.REGISTRY }} -u "${{ secrets.REGISTRY_USERNAME }}" --password-stdin - name: Build and push go-dev run: | docker buildx build \ --platform linux/amd64 \ --target go-dev \ --push \ --tag ${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/go-dev:latest \ --tag ${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/go-dev:${{ needs.build-base.outputs.version }} \ --cache-from type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/go-dev:buildcache \ --cache-to type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/go-dev:buildcache,mode=max \ -f images/base/Dockerfile \ images/base build-python: needs: build-base runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Login to Registry run: | echo "${{ secrets.REGISTRY_PASSWORD }}" | docker login ${{ env.REGISTRY }} -u "${{ secrets.REGISTRY_USERNAME }}" --password-stdin - name: Build and push python-dev run: | docker buildx build \ --platform linux/amd64 \ --target python-dev \ --push \ --tag ${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/python-dev:latest \ --tag ${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/python-dev:${{ needs.build-base.outputs.version }} \ --cache-from type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/python-dev:buildcache \ --cache-to type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/python-dev:buildcache,mode=max \ -f images/base/Dockerfile \ images/base build-node: needs: build-base runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Login to Registry run: | echo "${{ secrets.REGISTRY_PASSWORD }}" | docker login ${{ env.REGISTRY }} -u "${{ secrets.REGISTRY_USERNAME }}" --password-stdin - name: Build and push node-dev run: | docker buildx build \ --platform linux/amd64 \ --target node-dev \ --push \ --tag ${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/node-dev:latest \ --tag ${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/node-dev:${{ needs.build-base.outputs.version }} \ --cache-from type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/node-dev:buildcache \ --cache-to type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/node-dev:buildcache,mode=max \ -f images/base/Dockerfile \ images/base build-java: needs: build-base runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Login to Registry run: | echo "${{ secrets.REGISTRY_PASSWORD }}" | docker login ${{ env.REGISTRY }} -u "${{ secrets.REGISTRY_USERNAME }}" --password-stdin - name: Build and push java-dev run: | docker buildx build \ --platform linux/amd64 \ --target java-dev \ --push \ --tag ${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/java-dev:latest \ --tag ${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/java-dev:${{ needs.build-base.outputs.version }} \ --cache-from type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/java-dev:buildcache \ --cache-to type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/java-dev:buildcache,mode=max \ -f images/base/Dockerfile \ images/base build-cpp: needs: build-base runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Login to Registry run: | echo "${{ secrets.REGISTRY_PASSWORD }}" | docker login ${{ env.REGISTRY }} -u "${{ secrets.REGISTRY_USERNAME }}" --password-stdin - name: Build and push cpp-dev run: | docker buildx build \ --platform linux/amd64 \ --target cpp-dev \ --push \ --tag ${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/cpp-dev:latest \ --tag ${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/cpp-dev:${{ needs.build-base.outputs.version }} \ --cache-from type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/cpp-dev:buildcache \ --cache-to type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/cpp-dev:buildcache,mode=max \ -f images/base/Dockerfile \ images/base test-images: needs: [build-rust, build-go, build-python, build-node, build-java, build-cpp] runs-on: ubuntu-latest strategy: matrix: image: [base, rust-dev, go-dev, python-dev, node-dev, java-dev, cpp-dev] steps: - uses: actions/checkout@v4 - name: Login to Registry run: | echo "${{ secrets.REGISTRY_PASSWORD }}" | docker login ${{ env.REGISTRY }} -u "${{ secrets.REGISTRY_USERNAME }}" --password-stdin - name: Test ${{ matrix.image }} run: | chmod +x tests/test-${{ matrix.image }}.sh REGISTRY=${{ env.REGISTRY }}/chorus bash tests/test-${{ matrix.image }}.sh