diff --git a/.github/workflows/Procedure_push_docker_images.yml b/.github/workflows/Procedure_push_docker_images.yml index 235cab02..77a6a1ac 100644 --- a/.github/workflows/Procedure_push_docker_images.yml +++ b/.github/workflows/Procedure_push_docker_images.yml @@ -11,6 +11,10 @@ on: docker_reference: description: 'wazuh-docker reference' required: true + products: + description: 'Comma-separated list of the image names to build and push' + default: 'wazuh-manager,wazuh-dashboard,wazuh-indexer,wazuh-agent' + required: true revision: description: 'Package revision' default: '1' @@ -39,6 +43,11 @@ on: description: 'wazuh-docker reference' required: false type: string + products: + description: 'Comma-separated list of the image names to build and push' + default: 'wazuh-manager,wazuh-dashboard,wazuh-indexer,wazuh-agent' + required: true + type: string revision: description: 'Package revision' default: '1' @@ -59,17 +68,15 @@ on: required: false jobs: - build-and-push: + setup: runs-on: ubuntu-22.04 permissions: id-token: write contents: read - env: - IMAGE_REGISTRY: ${{ inputs.dev && vars.IMAGE_REGISTRY_DEV || vars.IMAGE_REGISTRY_PROD }} - IMAGE_TAG: ${{ inputs.image_tag }} - REVISION: ${{ inputs.revision }} + outputs: + WAZUH_COMPONENTS: ${{ steps.compute-outputs.outputs.WAZUH_COMPONENTS }} steps: - name: Print inputs @@ -85,11 +92,52 @@ jobs: echo "* id: ${{ inputs.id }}" echo "* image_tag: ${{ inputs.image_tag }}" echo "* docker_reference: ${{ inputs.docker_reference }}" + echo "* products: ${{ inputs.products }}" echo "* revision: ${{ inputs.revision }}" echo "* dev: ${{ inputs.dev }}" echo "* dev reference: ${{ inputs.reference }}" echo "---------------------------------------------" + - name: Set up variables + id: compute-outputs + run: | + if [[ "${{ inputs.products }}" != "null" && "${{ inputs.products }}" != "" ]]; then + # Convert comma-separated list to JSON array format + IFS=',' read -ra COMPONENTS <<< "${{ inputs.products }}" + JSON_ARRAY="[" + for i in "${!COMPONENTS[@]}"; do + if [ $i -gt 0 ]; then + JSON_ARRAY+="," + fi + JSON_ARRAY+="\"${COMPONENTS[$i]}\"" + done + JSON_ARRAY+="]" + echo "WAZUH_COMPONENTS=$JSON_ARRAY" >> $GITHUB_OUTPUT + else + echo "WAZUH_COMPONENTS=[\"wazuh-manager\",\"wazuh-dashboard\",\"wazuh-indexer\",\"wazuh-agent\"]" >> $GITHUB_OUTPUT + fi + + build-and-push: + runs-on: ubuntu-22.04 + + permissions: + id-token: write + contents: read + + needs: + - setup + + strategy: + fail-fast: false # all jobs will run even if one fails + matrix: + wazuh_component: ${{ fromJson(needs.setup.outputs.WAZUH_COMPONENTS) }} + + env: + IMAGE_REGISTRY: ${{ inputs.dev && vars.IMAGE_REGISTRY_DEV || vars.IMAGE_REGISTRY_PROD }} + IMAGE_TAG: ${{ inputs.image_tag }} + REVISION: ${{ inputs.revision }} + + steps: - name: Checkout repository uses: actions/checkout@v4 with: @@ -154,7 +202,7 @@ jobs: run: | if [ "${{ inputs.dev }}" = true ]; then IMAGE_TAG="${{ inputs.image_tag }}-${{ inputs.reference }}" - ./build-images.sh -v ${{ inputs.image_tag }} -r $REVISION -d "dev" -rg $IMAGE_REGISTRY -m -ref ${{ inputs.reference }} + ./build-images.sh -v ${{ inputs.image_tag }} -r $REVISION -d "dev" -rg $IMAGE_REGISTRY -m -ref ${{ inputs.reference }} -c ${{ matrix.wazuh_component }} else if [[ "$IMAGE_TAG" == *"-"* ]]; then IFS='-' read -r -a tokens <<< "$IMAGE_TAG" @@ -164,9 +212,9 @@ jobs: fi DEV_STAGE=${tokens[1]} WAZUH_VER=${tokens[0]} - ./build-images.sh -v $WAZUH_VER -r $REVISION -d $DEV_STAGE -rg $IMAGE_REGISTRY -m + ./build-images.sh -v $WAZUH_VER -r $REVISION -d $DEV_STAGE -rg $IMAGE_REGISTRY -m -c ${{ matrix.wazuh_component }} else - ./build-images.sh -v $IMAGE_TAG -r $REVISION -rg $IMAGE_REGISTRY -m + ./build-images.sh -v $IMAGE_TAG -r $REVISION -rg $IMAGE_REGISTRY -m -c ${{ matrix.wazuh_component }} fi fi # Save .env file (generated by build-images.sh) contents to $GITHUB_ENV diff --git a/build-docker-images/build-images.sh b/build-docker-images/build-images.sh index 1a0802fc..8cdfc73e 100755 --- a/build-docker-images/build-images.sh +++ b/build-docker-images/build-images.sh @@ -60,7 +60,7 @@ build() { curl -fsSL -o "$ARTIFACT_URLS_FILE" "https://packages-dev.wazuh.com/${WAZUH_MINOR_VERSION}/${ARTIFACT_URLS_FILE}" fi fi - awk -F':' '{name=$1; val=substr($0,length(name)+3); gsub(/[-.]/,"_",name); print name "=" val}' $ARTIFACT_URLS_FILE > artifacts_env.txt + awk -F':' '!/^#/ && NF>1 {name=$1; val=substr($0,length(name)+3); gsub(/[-.]/,"_",name); print name "=" val}' $ARTIFACT_URLS_FILE > artifacts_env.txt echo WAZUH_VERSION=$WAZUH_IMAGE_VERSION > ../.env echo WAZUH_IMAGE_VERSION=$WAZUH_IMAGE_VERSION >> ../.env @@ -74,11 +74,73 @@ build() { source ./artifacts_env.txt set +a - if [ "${MULTIARCH}" ];then - docker buildx bake --file build-images.yml --push --set *.platform=linux/amd64,linux/arm64 --no-cache|| clean 1 - else - docker buildx bake --file build-images.yml --no-cache|| clean 1 + if [ -z "${WAZUH_COMPONENT}" ]; then + echo "Error: WAZUH_COMPONENT is not set" >&2 + clean 1 fi + + # Validate component + case "${WAZUH_COMPONENT}" in + wazuh-indexer|wazuh-manager|wazuh-dashboard|wazuh-agent) ;; + *) + echo "Error: Unknown component '${WAZUH_COMPONENT}'" >&2 + clean 1 + ;; + esac + + # Determine build command and base options + if [ "${MULTIARCH}" ]; then + build_cmd="docker buildx build --platform linux/amd64,linux/arm64 --push --no-cache" + else + build_cmd="docker build --no-cache" + fi + + # Build common args (used by all components) + build_args=( + -t "${WAZUH_REGISTRY}/wazuh/${WAZUH_COMPONENT}:${IMAGE_TAG}" + --build-arg WAZUH_VERSION="${WAZUH_IMAGE_VERSION}" + --build-arg WAZUH_TAG_REVISION="${WAZUH_TAG_REVISION}" + ) + + # Add component-specific args + case "${WAZUH_COMPONENT}" in + wazuh-indexer) + build_args+=( + --build-arg wazuh_indexer_url_amd64_rpm="${wazuh_indexer_url_x86_64_rpm}" + --build-arg wazuh_indexer_url_arm64_rpm="${wazuh_indexer_url_aarch64_rpm}" + --build-arg wazuh_certs_tool="${wazuh_certs_tool}" + --build-arg wazuh_config_yml="${wazuh_config_yml}" + ) + ;; + wazuh-manager) + build_args+=( + --build-arg wazuh_manager_url_amd64_rpm="${wazuh_manager_url_x86_64_rpm}" + --build-arg wazuh_manager_url_arm64_rpm="${wazuh_manager_url_aarch64_rpm}" + ) + ;; + wazuh-dashboard) + build_args+=( + --build-arg WAZUH_UI_REVISION="${WAZUH_UI_REVISION}" + --build-arg wazuh_dashboard_url_amd64_rpm="${wazuh_dashboard_url_x86_64_rpm}" + --build-arg wazuh_dashboard_url_arm64_rpm="${wazuh_dashboard_url_aarch64_rpm}" + --build-arg wazuh_certs_tool="${wazuh_certs_tool}" + --build-arg wazuh_config_yml="${wazuh_config_yml}" + ) + ;; + wazuh-agent) + build_args+=( + --build-arg wazuh_agent_url_amd64_rpm="${wazuh_agent_url_x86_64_rpm}" + --build-arg wazuh_agent_url_arm64_rpm="${wazuh_agent_url_aarch64_rpm}" + ) + ;; + esac + + # Execute build + echo "Building ${WAZUH_COMPONENT} image..." + $build_cmd "${build_args[@]}" ${WAZUH_COMPONENT}/ || clean 1 + + echo "Image built successfully!" + return 0 } @@ -92,6 +154,7 @@ help() { echo " -r, --revision [Optional] Package revision. By default ${WAZUH_TAG_REVISION}" echo " -ref, --reference [Optional] Set the Wazuh reference to build development images. By default, the latest stable release." echo " -rg, --registry [Optional] Set the Docker registry to push the images." + echo " -c, --component [Required] Set the Wazuh component to build. Accepted values: 'wazuh-indexer', 'wazuh-manager', 'wazuh-dashboard', 'wazuh-agent'." echo " -v, --version [Optional] Set the Wazuh version should be builded. By default, ${WAZUH_IMAGE_VERSION}." echo " -m, --multiarch [Optional] Enable multi-architecture builds." echo " -h, --help Show this help." @@ -152,6 +215,14 @@ main() { help 1 fi ;; + "-c"|"--component") + if [ -n "${2}" ]; then + WAZUH_COMPONENT="${2}" + shift 2 + else + help 1 + fi + ;; *) help 1 esac