name: Build and push on: workflow_dispatch: push: branches: [ "master" ] env: REGISTRY: vcr.linecorp.com jobs: # Change detection detect-changes: runs-on: [ self-hosted ] outputs: flask-changed: ${{ steps.changes.outputs.flask }} mcp-changed: ${{ steps.changes.outputs.mcp }} shared-changed: ${{ steps.changes.outputs.shared }} steps: - uses: actions/checkout@v3 - uses: dorny/paths-filter@v2 id: changes with: filters: | flask: - 'run_cqa_test_app.py' - 'functions/**' - 'products/jira/**' - 'products/paas/**' - 'products/faas/**' - 'testapps/**' - 'templates/**' mcp: - 'mcp_server.py' - 'products/mcp/**' - 'Dockerfile.mcp' shared: - 'lib/**' - 'common/**' - 'requirements.txt' - 'Dockerfile' # Build Flask App build-flask: needs: detect-changes if: needs.detect-changes.outputs.flask-changed == 'true' || needs.detect-changes.outputs.shared-changed == 'true' || github.event_name == 'workflow_dispatch' runs-on: [ self-hosted ] steps: - uses: actions/checkout@v3 - name: Login to VCR uses: docker/login-action@v2 with: registry: ${{ env.REGISTRY }} username: ${{ secrets.VERDA_PROD_SA_USERNAME }} password: ${{ secrets.VERDA_PROD_SA_PASSWORD }} - name: Build and push Flask App uses: docker/build-push-action@v3 with: context: . file: ./Dockerfile push: true tags: ${{ env.REGISTRY }}/vrdqa/cqa-test-app:latest build-args: | DEV_S3_ACCESS_KEY=${{ secrets.DEV_S3_ACCESS_KEY }} DEV_S3_SECRET_KEY=${{ secrets.DEV_S3_SECRET_KEY }} PROD_S3_ACCESS_KEY=${{ secrets.PROD_S3_ACCESS_KEY }} PROD_S3_SECRET_KEY=${{ secrets.PROD_S3_SECRET_KEY }} # Build MCP Server build-mcp: needs: detect-changes if: needs.detect-changes.outputs.mcp-changed == 'true' || needs.detect-changes.outputs.shared-changed == 'true' || github.event_name == 'workflow_dispatch' runs-on: [ self-hosted ] steps: - uses: actions/checkout@v3 - name: Login to VCR uses: docker/login-action@v2 with: registry: ${{ env.REGISTRY }} username: ${{ secrets.VERDA_PROD_SA_USERNAME }} password: ${{ secrets.VERDA_PROD_SA_PASSWORD }} - name: Build and push MCP Server uses: docker/build-push-action@v3 with: context: . file: ./Dockerfile.mcp push: true tags: ${{ env.REGISTRY }}/vrdqa/cqa-mcp-server:latest # Failure notification notify: needs: [build-flask, build-mcp] if: always() && (failure() || cancelled()) runs-on: [ self-hosted ] steps: - name: Notify Slack on failure run: | ACTIONS_URL="${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" # Check failed jobs FAILED_JOBS="" if [[ "${{ needs.build-flask.result }}" == "failure" ]]; then FAILED_JOBS="${FAILED_JOBS}Flask App, " fi if [[ "${{ needs.build-mcp.result }}" == "failure" ]]; then FAILED_JOBS="${FAILED_JOBS}MCP Server, " fi FAILED_JOBS=${FAILED_JOBS%, } # Remove trailing comma data='{ "username": "${{ github.repository }}", "channel": "'"${SLACK_CHANNEL}"'", "icon_emoji": ":github:", "attachments": [{ "text": "The Docker image build and push has failed for: '"${FAILED_JOBS}"'. Check the build log <'"${ACTIONS_URL}"'|here>.", "color": "danger" }] }' curl -X POST \ -H 'Content-Type: application/json;charset=utf-8' \ -d "${data}" \ "${SLACK_API_PROXY_GROUP_URL}" env: SLACK_CHANNEL: "team-cloud_noti_qa_dev" SLACK_API_PROXY_GROUP_URL: "https://slack-api-proxy-group.linecorp.com/api/chat.postMessage" # Success notification notify-success: needs: [build-flask, build-mcp] if: always() && (needs.build-flask.result == 'success' || needs.build-mcp.result == 'success') runs-on: [ self-hosted ] steps: - name: Notify Slack on success run: | # Check successful jobs SUCCESS_JOBS="" if [[ "${{ needs.build-flask.result }}" == "success" ]]; then SUCCESS_JOBS="${SUCCESS_JOBS}Flask App, " fi if [[ "${{ needs.build-mcp.result }}" == "success" ]]; then SUCCESS_JOBS="${SUCCESS_JOBS}MCP Server, " fi SUCCESS_JOBS=${SUCCESS_JOBS%, } # Remove trailing comma data='{ "username": "${{ github.repository }}", "channel": "'"${SLACK_CHANNEL}"'", "icon_emoji": ":github:", "attachments": [{ "text": "Docker images successfully built and pushed: '"${SUCCESS_JOBS}"'", "color": "good" }] }' curl -X POST \ -H 'Content-Type: application/json;charset=utf-8' \ -d "${data}" \ "${SLACK_API_PROXY_GROUP_URL}" env: SLACK_CHANNEL: "team-cloud_noti_qa_dev" SLACK_API_PROXY_GROUP_URL: "https://slack-api-proxy-group.linecorp.com/api/chat.postMessage"