diff --git a/.github/workflows/push-docker-images.yml b/.github/workflows/push-docker-images.yml new file mode 100644 index 0000000..1f66e70 --- /dev/null +++ b/.github/workflows/push-docker-images.yml @@ -0,0 +1,98 @@ +name: Build and Publish Docker Images + +on: + workflow_dispatch: + inputs: + image_to_build: + description: "Select an image that you want to build and push" + type: choice + options: + - commerce-coordinator + - course-discovery + - credentials + branch: + description: "Target branch from which the source dockerfile from image will be sourced" + + schedule: + - cron: "0 4 * * 1-5" # UTC Time + +# Added for testing purposes. Will remove once the PR is finalised + pull_request: + branches: + - '**' + +jobs: + set-matrix: + runs-on: ubuntu-22.04 + outputs: + docker_images: ${{ steps.set-images-input.outputs.images_to_build }} + steps: + - name: Check out code + uses: actions/checkout@v4 + + - id: set-images-input + run: | + image_to_build="${{ github.event.inputs.image_to_build }}" + if [[ -n "$image_to_build" ]]; then + images=$(jq -c --arg name "$image_to_build" '[.[] | select(.name == $name)]' images-data.json) + echo "$images" + echo "images_to_build=$images" >> $GITHUB_OUTPUT + else + images=$(jq -c '.' images-data.json) + echo "$images" + echo "images_to_build=$images" >> $GITHUB_OUTPUT + fi + push: + runs-on: ubuntu-22.04 + continue-on-error: true + needs: [set-matrix] + + strategy: + matrix: + images: ${{ fromJson(needs.set-matrix.outputs.docker_images) }} + + steps: + - name: Get tag name + id: get-tag-name + uses: actions/github-script@v7 + with: + script: | + const tagName = "${{ github.event.inputs.branch }}" || 'latest'; + console.log('Will use tag: ' + tagName); + return tagName; + result-encoding: string + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Login to DockerHub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_PASSWORD }} + + - name: Build and push Dev Docker image + uses: docker/build-push-action@v6 + with: + file: ./dockerfiles/${{matrix.images.dockerfile || matrix.images.image_name}}.Dockerfile + push: true + platforms: ${{ matrix.images.os_platform }} + target: ${{ matrix.images.target }} + tags: edxops/${{matrix.images.image_name}}-dev:test + # ${{ steps.get-tag-name.outputs.result }} + + - name: Send failure notification + if: ${{ failure() && (matrix.images.owning_team_email) }} + uses: dawidd6/action-send-mail@v3 + with: + server_address: email-smtp.us-east-1.amazonaws.com + server_port: 465 + username: ${{secrets.edx_smtp_username}} + password: ${{secrets.edx_smtp_password}} + subject: Push Image to docker.io/edxops failed in ${{matrix.images.name}} + to: ${{matrix.images.owning_team_email}} + from: github-actions + body: Push Image to docker.io/edxops for ${{matrix.images.name}} failed! For details see "github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" diff --git a/images-data.json b/images-data.json new file mode 100644 index 0000000..8a456e7 --- /dev/null +++ b/images-data.json @@ -0,0 +1,110 @@ +[ + { + "image_name": "commerce-coordinator", + "name": "commerce coordinator", + "os_platform": "linux/arm64", + "target": "app" + }, + { + "image_name": "course-discovery", + "name": "course discovery", + "os_platform": "linux/arm64", + "target": "dev" + }, + { + "image_name": "credentials", + "name": "credentials", + "os_platform": "linux/arm64", + "target": "dev" + }, + { + "image_name": "ecommerce", + "name": "ecommerce", + "os_platform": "linux/arm64", + "target": "dev" + }, + { + "image_name": "edx-analytics-dashboard", + "name": "edx analytics dashboard", + "os_platform": "linux/arm64", + "target": "dev" + }, + { + "image_name": "edx-analytics-data-api", + "name": "edx analytics data api", + "os_platform": "linux/arm64", + "target": "dev", + "owning_team_email": "cbrash@redventures.com" + }, + { + "image_name": "edx-exams", + "name": "edx exams", + "os_platform": "linux/arm64", + "target": "app", + "owning_team_email": "cbrash@redventures.com" + }, + { + "dockerfile": "edx-platform", + "image_name": "cms-dev", + "name": "lms", + "os_platform": "linux/amd64,linux/arm64", + "target": "development", + "build_args": { + "SERVICE_VARIANT": "cms", + "SERVICE_PORT": "18010" + }, + }, + { + "dockerfile": "edx-platform", + "image_name": "lms-dev", + "name": "lms", + "os_platform": "linux/amd64,linux/arm64", + "target": "development", + "build_args": { + "SERVICE_VARIANT": "lms", + "SERVICE_PORT": "18000" + } + }, + { + "image_name": "edx-notes-api", + "name": "edx notes api", + "os_platform": "linux/arm64", + "target": "dev" + }, + { + "image_name": "enterprise-access", + "name": "enterprise access", + "os_platform": "linux/arm64", + "target": "devstack" + }, + { + "image_name": "enterprise-catalog", + "name": "enterprise catalog", + "os_platform": "linux/arm64", + "target": "legacy_devapp" + }, + { + "image_name": "enterprise-subsidy", + "name": "enterprise subsidy", + "os_platform": "linux/arm64", + "target": "devstack" + }, + { + "image_name": "program-intent-engagement", + "name": "program intent engagement", + "os_platform": "linux/arm64", + "target": "app" + }, + { + "image_name": "registrar", + "name": "registrar", + "os_platform": "linux/arm64", + "target": "dev" + }, + { + "image_name": "xqueue", + "name": "xqueue", + "os_platform": "linux/arm64", + "target": "dev" + } +]