diff --git a/.github/actions/build-push-action/action.yml b/.github/actions/build-push-action/action.yml index 24dfc322fe..262b7734e1 100644 --- a/.github/actions/build-push-action/action.yml +++ b/.github/actions/build-push-action/action.yml @@ -95,16 +95,16 @@ runs: run: | FLAT_BRANCH_VERSION=$(echo "${{ github.ref_name }}" | sed 's/[^a-zA-Z0-9.-]//g') - semver_regex="^v([0-9]+)\.([0-9]+)\.([0-9]+)(-[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$" - if [[ ! ${{ env.REL_VERSION }} =~ $semver_regex ]]; then - echo "Invalid Release Version Format : ${{ env.REL_VERSION }}" - echo "Please provide a valid SemVer version" - echo "e.g. v1.2.3 or v1.2.3-alpha-1" - echo "Exiting the build process" - exit 1 # Exit with status 1 to fail the step - fi - if [ "${{ env.BUILD_RELEASE }}" == "true" ]; then + semver_regex="^v([0-9]+)\.([0-9]+)\.([0-9]+)(-[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$" + if [[ ! ${{ env.REL_VERSION }} =~ $semver_regex ]]; then + echo "Invalid Release Version Format : ${{ env.REL_VERSION }}" + echo "Please provide a valid SemVer version" + echo "e.g. v1.2.3 or v1.2.3-alpha-1" + echo "Exiting the build process" + exit 1 # Exit with status 1 to fail the step + fi + TAG=${{ env.IMG_OWNER }}/${{ env.IMG_NAME }}:${{ env.REL_VERSION }} if [ "${{ env.HARBOR_PUSH }}" == "true" ]; then diff --git a/.github/workflows/build-branch-cloud.yml b/.github/workflows/build-branch-cloud.yml index 6e95a73c57..daaef8bcef 100644 --- a/.github/workflows/build-branch-cloud.yml +++ b/.github/workflows/build-branch-cloud.yml @@ -2,25 +2,67 @@ name: Branch Build Enterprise Cloud on: workflow_dispatch: - release: - types: [released, prereleased] + inputs: + build_type: + description: "Type of build to run" + required: true + type: choice + default: "Build" + options: + - "Build" + - "Release" + releaseVersion: + description: "Release Version" + type: string + default: v0.0.0-cloud + isPrerelease: + description: "Is Pre-release" + type: boolean + default: false + required: true + + push: + branches: + - master env: - TARGET_BRANCH: ${{ github.ref_name || github.event.release.target_commitish }} + TARGET_BRANCH: ${{ github.ref_name }} VAULT_KP_PREFIX: plane-ee-cloud-builds + BUILD_TYPE: ${{ github.event.inputs.build_type }} + RELEASE_VERSION: ${{ github.event.inputs.releaseVersion }} + IS_PRERELEASE: ${{ github.event.inputs.isPrerelease }} jobs: branch_build_setup: name: Build Setup - runs-on: ubuntu-22.04 + runs-on: ubuntu-20.04 outputs: gh_branch_name: ${{ steps.set_env_variables.outputs.TARGET_BRANCH }} - flat_branch_name: ${{ steps.set_env_variables.outputs.FLAT_BRANCH_NAME }} gh_buildx_driver: ${{ steps.set_env_variables.outputs.BUILDX_DRIVER }} gh_buildx_version: ${{ steps.set_env_variables.outputs.BUILDX_VERSION }} gh_buildx_platforms: ${{ steps.set_env_variables.outputs.BUILDX_PLATFORMS }} gh_buildx_endpoint: ${{ steps.set_env_variables.outputs.BUILDX_ENDPOINT }} + build_web: ${{ steps.changed_files.outputs.web_any_changed }} + build_admin: ${{ steps.changed_files.outputs.admin_any_changed }} + build_space: ${{ steps.changed_files.outputs.space_any_changed }} + build_live: ${{ steps.changed_files.outputs.live_any_changed }} + build_apiserver: ${{ steps.changed_files.outputs.apiserver_any_changed }} + build_proxy: ${{ steps.changed_files.outputs.proxy_any_changed }} + build_monitor: ${{ steps.changed_files.outputs.monitor_any_changed }} + + dh_img_web: ${{ steps.set_env_variables.outputs.DH_IMG_WEB }} + dh_img_space: ${{ steps.set_env_variables.outputs.DH_IMG_SPACE }} + dh_img_admin: ${{ steps.set_env_variables.outputs.DH_IMG_ADMIN }} + dh_img_live: ${{ steps.set_env_variables.outputs.DH_IMG_LIVE }} + dh_img_backend: ${{ steps.set_env_variables.outputs.DH_IMG_BACKEND }} + dh_img_proxy: ${{ steps.set_env_variables.outputs.DH_IMG_PROXY }} + dh_img_monitor: ${{ steps.set_env_variables.outputs.DH_IMG_MONITOR }} + harbor_push: ${{ steps.set_env_variables.outputs.HARBOR_PUSH }} + build_release: ${{ steps.set_env_variables.outputs.BUILD_RELEASE }} + build_prerelease: ${{ steps.set_env_variables.outputs.BUILD_PRERELEASE }} + release_version: ${{ steps.set_env_variables.outputs.RELEASE_VERSION }} + vault_secrets: ${{ steps.get_vault_secrets.outputs.VAULT_SECRETS }} steps: - id: set_env_variables name: Set Environment Variables @@ -30,97 +72,154 @@ jobs: echo "BUILDX_PLATFORMS=linux/amd64" >> $GITHUB_OUTPUT echo "BUILDX_ENDPOINT=" >> $GITHUB_OUTPUT - FLAT_BRANCH_NAME=$(echo "${{ env.TARGET_BRANCH }}" | sed 's/[^a-zA-Z0-9]/-/g') - echo "FLAT_BRANCH_NAME=$FLAT_BRANCH_NAME" >> $GITHUB_OUTPUT + BR_NAME=$( echo "${{ env.TARGET_BRANCH }}" | sed 's/[^a-zA-Z0-9.-]//g') + echo "TARGET_BRANCH=$BR_NAME" >> $GITHUB_OUTPUT + + echo "DH_IMG_WEB=web-cloud" >> $GITHUB_OUTPUT + echo "DH_IMG_SPACE=space-cloud" >> $GITHUB_OUTPUT + echo "DH_IMG_ADMIN=admin-cloud" >> $GITHUB_OUTPUT + echo "DH_IMG_LIVE=live-cloud" >> $GITHUB_OUTPUT + echo "DH_IMG_BACKEND=backend-cloud" >> $GITHUB_OUTPUT + echo "DH_IMG_PROXY=proxy-cloud" >> $GITHUB_OUTPUT + echo "DH_IMG_MONITOR=monitor-cloud" >> $GITHUB_OUTPUT + + BUILD_RELEASE=false + BUILD_PRERELEASE=false + RELVERSION="latest" + + if [ "${{ env.BUILD_TYPE }}" == "Release" ]; then + FLAT_RELEASE_VERSION=$(echo "${{ env.RELEASE_VERSION }}" | sed 's/[^a-zA-Z0-9.-]//g') + echo "FLAT_RELEASE_VERSION=${FLAT_RELEASE_VERSION}" >> $GITHUB_OUTPUT + + semver_regex="^v([0-9]+)\.([0-9]+)\.([0-9]+)(-[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$" + if [[ ! $FLAT_RELEASE_VERSION =~ $semver_regex ]]; then + echo "Invalid Release Version Format : $FLAT_RELEASE_VERSION" + echo "Please provide a valid SemVer version" + echo "e.g. v1.2.3 or v1.2.3-alpha-1" + echo "Exiting the build process" + exit 1 # Exit with status 1 to fail the step + fi + BUILD_RELEASE=true + RELVERSION=$FLAT_RELEASE_VERSION + + if [ "${{ env.IS_PRERELEASE }}" == "true" ]; then + BUILD_PRERELEASE=true + fi + fi + echo "BUILD_RELEASE=${BUILD_RELEASE}" >> $GITHUB_OUTPUT + echo "BUILD_PRERELEASE=${BUILD_PRERELEASE}" >> $GITHUB_OUTPUT + echo "RELEASE_VERSION=${RELVERSION}" >> $GITHUB_OUTPUT + echo "HARBOR_PUSH=false" >> $GITHUB_OUTPUT + + - name: Tailscale + uses: tailscale/github-action@v2 + with: + oauth-client-id: ${{ secrets.TAILSCALE_OAUTH_CLIENT_ID }} + oauth-secret: ${{ secrets.TAILSCALE_OAUTH_SECRET }} + tags: tag:ci + + - name: Get the ENV values from Vault + id: get_vault_secrets + run: | + if [ "${{ env.TARGET_BRANCH }}" == "master" ]; then + ENV_NAME="prod" + else + ENV_NAME="stage" + fi + + curl -fsSL \ + --header "X-Vault-Token: ${{ secrets.VAULT_TOKEN }}" \ + --request GET \ + ${{ vars.VAULT_HOST }}/v1/kv/git-builds/data/${{ env.VAULT_KP_PREFIX }}-${ENV_NAME} | jq .data.data > vault_secrets.json + + if [ $? != 0 ]; then + echo "Failed to get the ENV values from Vault" + exit 1 + fi + + VAULT_SECRETS=$(cat vault_secrets.json | base64 -w 0) + echo "VAULT_SECRETS=${VAULT_SECRETS}" >> $GITHUB_OUTPUT - id: checkout_files name: Checkout Files uses: actions/checkout@v4 - - name: Generate Keypair - run: | - if [ "${{ github.event_name }}" == "release" ]; then - ssh-keygen -t ed25519 -m PEM -f monitor/prime.key -N "" - echo "-----------------" - echo "" - cat monitor/prime.key.pub - echo "" - echo "-----------------" - else - echo "${{ secrets.DEFAULT_PRIME_PRIVATE_KEY }}" > monitor/prime.key - fi + - name: Get changed files + id: changed_files + uses: tj-actions/changed-files@v42 + with: + files_yaml: | + apiserver: + - apiserver/** + proxy: + - nginx/** + admin: + - admin/** + - packages/** + - "package.json" + - "yarn.lock" + - "tsconfig.json" + - "turbo.json" + space: + - space/** + - packages/** + - "package.json" + - "yarn.lock" + - "tsconfig.json" + - "turbo.json" + web: + - web/** + - packages/** + - "package.json" + - "yarn.lock" + - "tsconfig.json" + - "turbo.json" + live: + - live/** + - packages/** + - 'package.json' + - 'yarn.lock' + - 'tsconfig.json' + - 'turbo.json' + monitor: + - monitor/** branch_build_push_admin: + if: ${{ needs.branch_build_setup.outputs.build_admin == 'true' || github.event_name == 'workflow_dispatch' || needs.branch_build_setup.outputs.gh_branch_name == 'master' }} name: Build-Push Admin Docker Image - runs-on: ${{vars.ACTION_RUNS_ON}} + runs-on: ubuntu-20.04 needs: [branch_build_setup] - env: - ADMIN_CLOUD_TAG: makeplane/admin-enterprise-cloud:${{ needs.branch_build_setup.outputs.flat_branch_name }} - TARGET_BRANCH: ${{ needs.branch_build_setup.outputs.gh_branch_name }} - BUILDX_DRIVER: ${{ needs.branch_build_setup.outputs.gh_buildx_driver }} - BUILDX_VERSION: ${{ needs.branch_build_setup.outputs.gh_buildx_version }} - BUILDX_PLATFORMS: ${{ needs.branch_build_setup.outputs.gh_buildx_platforms }} - BUILDX_ENDPOINT: ${{ needs.branch_build_setup.outputs.gh_buildx_endpoint }} steps: - - name: Set Admin Docker Tag + - name: Load Vault Secrets run: | - if [ "${{ github.event_name }}" == "release" ]; then - CLOUD_TAG=makeplane/admin-enterprise-cloud:stable - CLOUD_TAG=${CLOUD_TAG},makeplane/admin-enterprise-cloud:${{ github.event.release.tag_name }} - elif [ "${{ env.TARGET_BRANCH }}" == "master" ]; then - CLOUD_TAG=makeplane/admin-enterprise-cloud:latest - else - CLOUD_TAG=${{ env.ADMIN_CLOUD_TAG }} - fi - echo "ADMIN_CLOUD_TAG=${CLOUD_TAG}" >> $GITHUB_ENV + echo ${{ needs.branch_build_setup.outputs.vault_secrets }} | base64 -d > vault_secrets.json + jq -r 'to_entries|map("\(.key)=\(.value|tostring)")|.[]' vault_secrets.json >> $GITHUB_ENV - - name: Tailscale - uses: tailscale/github-action@v2 - with: - oauth-client-id: ${{ secrets.TAILSCALE_OAUTH_CLIENT_ID }} - oauth-secret: ${{ secrets.TAILSCALE_OAUTH_SECRET }} - tags: tag:ci - - - name: Get the ENV values from Vault - run: | - if [ "${{ env.TARGET_BRANCH }}" == "master" ]; then - ENV_NAME="prod" - else - ENV_NAME="stage" - fi - - curl -fsSL \ - --header "X-Vault-Token: ${{ secrets.VAULT_TOKEN }}" \ - --request GET \ - ${{ vars.VAULT_HOST }}/v1/kv/git-builds/data/${{ env.VAULT_KP_PREFIX }}-${ENV_NAME} | jq .data.data > values.json - - jq -r 'to_entries|map("\(.key)=\(.value|tostring)")|.[]' values.json >> $GITHUB_ENV - - - name: Login to Docker Hub - uses: docker/login-action@v3 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - with: - driver: ${{ env.BUILDX_DRIVER }} - version: ${{ env.BUILDX_VERSION }} - endpoint: ${{ env.BUILDX_ENDPOINT }} - - - name: Check out the repo + - id: checkout_files + name: Checkout Files uses: actions/checkout@v4 - - - name: Build and Push Admin-Cloud to Docker Container Registry - uses: docker/build-push-action@v5.1.0 + - name: Admin Build and Push + uses: ./.github/actions/build-push-action with: - context: . - file: ./admin/Dockerfile.admin - platforms: ${{ env.BUILDX_PLATFORMS }} - tags: ${{ env.ADMIN_CLOUD_TAG }} - push: true + build-release: ${{ needs.branch_build_setup.outputs.build_release }} + build-prerelease: ${{ needs.branch_build_setup.outputs.build_prerelease }} + release-version: ${{ needs.branch_build_setup.outputs.release_version }} + + docker-username: ${{ secrets.DOCKERHUB_USERNAME }} + dockerhub-token: ${{ secrets.DOCKERHUB_TOKEN }} + harbor-push: ${{ needs.branch_build_setup.outputs.harbor_push }} + harbor-username: ${{ secrets.HARBOR_USERNAME }} + harbor-token: ${{ secrets.HARBOR_TOKEN }} + harbor-registry: ${{ vars.HARBOR_REGISTRY }} + harbor-project: ${{ vars.HARBOR_PROJECT }} + docker-image-owner: makeplane + docker-image-name: ${{ needs.branch_build_setup.outputs.dh_img_admin }} + build-context: . + dockerfile-path: ./admin/Dockerfile.admin + buildx-driver: ${{ needs.branch_build_setup.outputs.gh_buildx_driver }} + buildx-version: ${{ needs.branch_build_setup.outputs.gh_buildx_version }} + buildx-platforms: ${{ needs.branch_build_setup.outputs.gh_buildx_platforms }} + buildx-endpoint: ${{ needs.branch_build_setup.outputs.gh_buildx_endpoint }} build-args: | NEXT_PUBLIC_WEB_BASE_URL=${{ env.NEXT_PUBLIC_WEB_BASE_URL }} NEXT_PUBLIC_SPACE_BASE_URL=${{ env.NEXT_PUBLIC_SPACE_BASE_URL }} @@ -129,82 +228,41 @@ jobs: NEXT_PUBLIC_ADMIN_BASE_PATH=${{ env.NEXT_PUBLIC_ADMIN_BASE_PATH }} NEXT_PUBLIC_SPACE_BASE_PATH=${{ env.NEXT_PUBLIC_SPACE_BASE_PATH }} NEXT_PUBLIC_API_BASE_PATH=${{ env.NEXT_PUBLIC_API_BASE_PATH }} - env: - DOCKER_BUILDKIT: 1 - DOCKER_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} - DOCKER_PASSWORD: ${{ secrets.DOCKERHUB_TOKEN }} branch_build_push_web: + if: ${{ needs.branch_build_setup.outputs.build_web == 'true' || github.event_name == 'workflow_dispatch' || needs.branch_build_setup.outputs.gh_branch_name == 'master' }} name: Build-Push Web Docker Image - runs-on: ${{vars.ACTION_RUNS_ON}} + runs-on: ubuntu-20.04 needs: [branch_build_setup] - env: - WEB_CLOUD_IMAGE: makeplane/web-enterprise-cloud - WEB_CLOUD_TAG: makeplane/web-enterprise-cloud:${{ needs.branch_build_setup.outputs.flat_branch_name }} - TARGET_BRANCH: ${{ needs.branch_build_setup.outputs.gh_branch_name }} - BUILDX_DRIVER: ${{ needs.branch_build_setup.outputs.gh_buildx_driver }} - BUILDX_VERSION: ${{ needs.branch_build_setup.outputs.gh_buildx_version }} - BUILDX_PLATFORMS: ${{ needs.branch_build_setup.outputs.gh_buildx_platforms }} - BUILDX_ENDPOINT: ${{ needs.branch_build_setup.outputs.gh_buildx_endpoint }} steps: - - name: Set Web Docker Tag + - name: Load Vault Secrets run: | - if [ "${{ github.event_name }}" == "release" ]; then - CLOUD_TAG=${{env.WEB_CLOUD_IMAGE}}:stable - CLOUD_TAG=${CLOUD_TAG},${{env.WEB_CLOUD_IMAGE}}:${{ github.event.release.tag_name }} - elif [ "${{ env.TARGET_BRANCH }}" == "master" ]; then - CLOUD_TAG=${{env.WEB_CLOUD_IMAGE}}:latest - else - CLOUD_TAG=${{ env.WEB_CLOUD_TAG }} - fi - echo "WEB_CLOUD_TAG=${CLOUD_TAG}" >> $GITHUB_ENV - - - name: Tailscale - uses: tailscale/github-action@v2 - with: - oauth-client-id: ${{ secrets.TAILSCALE_OAUTH_CLIENT_ID }} - oauth-secret: ${{ secrets.TAILSCALE_OAUTH_SECRET }} - tags: tag:ci - - - name: Get the ENV values from Vault - run: | - if [ "${{ env.TARGET_BRANCH }}" == "master" ]; then - ENV_NAME="prod" - else - ENV_NAME="stage" - fi - - curl -fsSL \ - --header "X-Vault-Token: ${{ secrets.VAULT_TOKEN }}" \ - --request GET \ - ${{ vars.VAULT_HOST }}/v1/kv/git-builds/data/${{ env.VAULT_KP_PREFIX }}-${ENV_NAME} | jq .data.data > values.json - - jq -r 'to_entries|map("\(.key)=\(.value|tostring)")|.[]' values.json >> $GITHUB_ENV - - - name: Login to Docker Hub - uses: docker/login-action@v3 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - with: - driver: ${{ env.BUILDX_DRIVER }} - version: ${{ env.BUILDX_VERSION }} - endpoint: ${{ env.BUILDX_ENDPOINT }} - - - name: Check out the repo + echo ${{ needs.branch_build_setup.outputs.vault_secrets }} | base64 -d > vault_secrets.json + jq -r 'to_entries|map("\(.key)=\(.value|tostring)")|.[]' vault_secrets.json >> $GITHUB_ENV + - id: checkout_files + name: Checkout Files uses: actions/checkout@v4 - - - name: Build and Push Web Cloud to Docker Container Registry - uses: docker/build-push-action@v5.1.0 + - name: Web Build and Push + uses: ./.github/actions/build-push-action with: - context: . - file: ./web/Dockerfile.web - platforms: ${{ env.BUILDX_PLATFORMS }} - tags: ${{ env.WEB_CLOUD_TAG }} - push: true + build-release: ${{ needs.branch_build_setup.outputs.build_release }} + build-prerelease: ${{ needs.branch_build_setup.outputs.build_prerelease }} + release-version: ${{ needs.branch_build_setup.outputs.release_version }} + docker-username: ${{ secrets.DOCKERHUB_USERNAME }} + dockerhub-token: ${{ secrets.DOCKERHUB_TOKEN }} + harbor-push: ${{ needs.branch_build_setup.outputs.harbor_push }} + harbor-username: ${{ secrets.HARBOR_USERNAME }} + harbor-token: ${{ secrets.HARBOR_TOKEN }} + harbor-registry: ${{ vars.HARBOR_REGISTRY }} + harbor-project: ${{ vars.HARBOR_PROJECT }} + docker-image-owner: makeplane + docker-image-name: ${{ needs.branch_build_setup.outputs.dh_img_web }} + build-context: . + dockerfile-path: ./web/Dockerfile.web + buildx-driver: ${{ needs.branch_build_setup.outputs.gh_buildx_driver }} + buildx-version: ${{ needs.branch_build_setup.outputs.gh_buildx_version }} + buildx-platforms: ${{ needs.branch_build_setup.outputs.gh_buildx_platforms }} + buildx-endpoint: ${{ needs.branch_build_setup.outputs.gh_buildx_endpoint }} build-args: | NEXT_PUBLIC_WEB_BASE_URL=${{ env.NEXT_PUBLIC_WEB_BASE_URL }} NEXT_PUBLIC_SPACE_BASE_URL=${{ env.NEXT_PUBLIC_SPACE_BASE_URL }} @@ -213,82 +271,41 @@ jobs: NEXT_PUBLIC_ADMIN_BASE_PATH=${{ env.NEXT_PUBLIC_ADMIN_BASE_PATH }} NEXT_PUBLIC_SPACE_BASE_PATH=${{ env.NEXT_PUBLIC_SPACE_BASE_PATH }} NEXT_PUBLIC_API_BASE_PATH=${{ env.NEXT_PUBLIC_API_BASE_PATH }} - env: - DOCKER_BUILDKIT: 1 - DOCKER_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} - DOCKER_PASSWORD: ${{ secrets.DOCKERHUB_TOKEN }} - + branch_build_push_space: + if: ${{ needs.branch_build_setup.outputs.build_space == 'true' || github.event_name == 'workflow_dispatch' || needs.branch_build_setup.outputs.gh_branch_name == 'master' }} name: Build-Push Space Docker Image - runs-on: ${{vars.ACTION_RUNS_ON}} + runs-on: ubuntu-20.04 needs: [branch_build_setup] - env: - SPACE_CLOUD_IMAGE: makeplane/space-enterprise-cloud - SPACE_CLOUD_TAG: makeplane/space-enterprise-cloud:${{ needs.branch_build_setup.outputs.flat_branch_name }} - TARGET_BRANCH: ${{ needs.branch_build_setup.outputs.flat_branch_name }} - BUILDX_DRIVER: ${{ needs.branch_build_setup.outputs.gh_buildx_driver }} - BUILDX_VERSION: ${{ needs.branch_build_setup.outputs.gh_buildx_version }} - BUILDX_PLATFORMS: ${{ needs.branch_build_setup.outputs.gh_buildx_platforms }} - BUILDX_ENDPOINT: ${{ needs.branch_build_setup.outputs.gh_buildx_endpoint }} steps: - - name: Set Space Docker Tag + - name: Load Vault Secrets run: | - if [ "${{ github.event_name }}" == "release" ]; then - CLOUD_TAG=${{env.SPACE_CLOUD_IMAGE}}:stable - CLOUD_TAG=${CLOUD_TAG},${{env.SPACE_CLOUD_IMAGE}}:${{ github.event.release.tag_name }} - elif [ "${{ env.TARGET_BRANCH }}" == "master" ]; then - CLOUD_TAG=${{env.SPACE_CLOUD_IMAGE}}:latest - else - CLOUD_TAG=${{ env.SPACE_CLOUD_TAG }} - fi - echo "SPACE_CLOUD_TAG=${CLOUD_TAG}" >> $GITHUB_ENV - - - name: Tailscale - uses: tailscale/github-action@v2 - with: - oauth-client-id: ${{ secrets.TAILSCALE_OAUTH_CLIENT_ID }} - oauth-secret: ${{ secrets.TAILSCALE_OAUTH_SECRET }} - tags: tag:ci - - - name: Get the ENV values from Vault - run: | - if [ "${{ env.TARGET_BRANCH }}" == "master" ]; then - ENV_NAME="prod" - else - ENV_NAME="stage" - fi - - curl -fsSL \ - --header "X-Vault-Token: ${{ secrets.VAULT_TOKEN }}" \ - --request GET \ - ${{ vars.VAULT_HOST }}/v1/kv/git-builds/data/${{ env.VAULT_KP_PREFIX }}-${ENV_NAME} | jq .data.data > values.json - - jq -r 'to_entries|map("\(.key)=\(.value|tostring)")|.[]' values.json >> $GITHUB_ENV - - - name: Login to Docker Hub - uses: docker/login-action@v3 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - with: - driver: ${{ env.BUILDX_DRIVER }} - version: ${{ env.BUILDX_VERSION }} - endpoint: ${{ env.BUILDX_ENDPOINT }} - - - name: Check out the repo + echo ${{ needs.branch_build_setup.outputs.vault_secrets }} | base64 -d > vault_secrets.json + jq -r 'to_entries|map("\(.key)=\(.value|tostring)")|.[]' vault_secrets.json >> $GITHUB_ENV + - id: checkout_files + name: Checkout Files uses: actions/checkout@v4 - - - name: Build and Push Space-Cloud to Docker Container Registry - uses: docker/build-push-action@v5.1.0 + - name: Space Build and Push + uses: ./.github/actions/build-push-action with: - context: . - file: ./space/Dockerfile.space - platforms: ${{ env.BUILDX_PLATFORMS }} - tags: ${{ env.SPACE_CLOUD_TAG }} - push: true + build-release: ${{ needs.branch_build_setup.outputs.build_release }} + build-prerelease: ${{ needs.branch_build_setup.outputs.build_prerelease }} + release-version: ${{ needs.branch_build_setup.outputs.release_version }} + docker-username: ${{ secrets.DOCKERHUB_USERNAME }} + dockerhub-token: ${{ secrets.DOCKERHUB_TOKEN }} + harbor-push: ${{ needs.branch_build_setup.outputs.harbor_push }} + harbor-username: ${{ secrets.HARBOR_USERNAME }} + harbor-token: ${{ secrets.HARBOR_TOKEN }} + harbor-registry: ${{ vars.HARBOR_REGISTRY }} + harbor-project: ${{ vars.HARBOR_PROJECT }} + docker-image-owner: makeplane + docker-image-name: ${{ needs.branch_build_setup.outputs.dh_img_space }} + build-context: . + dockerfile-path: ./space/Dockerfile.space + buildx-driver: ${{ needs.branch_build_setup.outputs.gh_buildx_driver }} + buildx-version: ${{ needs.branch_build_setup.outputs.gh_buildx_version }} + buildx-platforms: ${{ needs.branch_build_setup.outputs.gh_buildx_platforms }} + buildx-endpoint: ${{ needs.branch_build_setup.outputs.gh_buildx_endpoint }} build-args: | NEXT_PUBLIC_WEB_BASE_URL=${{ env.NEXT_PUBLIC_WEB_BASE_URL }} NEXT_PUBLIC_SPACE_BASE_URL=${{ env.NEXT_PUBLIC_SPACE_BASE_URL }} @@ -297,62 +314,96 @@ jobs: NEXT_PUBLIC_ADMIN_BASE_PATH=${{ env.NEXT_PUBLIC_ADMIN_BASE_PATH }} NEXT_PUBLIC_SPACE_BASE_PATH=${{ env.NEXT_PUBLIC_SPACE_BASE_PATH }} NEXT_PUBLIC_API_BASE_PATH=${{ env.NEXT_PUBLIC_API_BASE_PATH }} - env: - DOCKER_BUILDKIT: 1 - DOCKER_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} - DOCKER_PASSWORD: ${{ secrets.DOCKERHUB_TOKEN }} + + branch_build_push_live: + if: ${{ needs.branch_build_setup.outputs.build_live == 'true' || github.event_name == 'workflow_dispatch' || needs.branch_build_setup.outputs.gh_branch_name == 'master' }} + name: Build-Push Live Collaboration Docker Image + runs-on: ubuntu-20.04 + needs: [branch_build_setup] + steps: + - id: checkout_files + name: Checkout Files + uses: actions/checkout@v4 + - name: Live Build and Push + uses: ./.github/actions/build-push-action + with: + build-release: ${{ needs.branch_build_setup.outputs.build_release }} + build-prerelease: ${{ needs.branch_build_setup.outputs.build_prerelease }} + release-version: ${{ needs.branch_build_setup.outputs.release_version }} + docker-username: ${{ secrets.DOCKERHUB_USERNAME }} + dockerhub-token: ${{ secrets.DOCKERHUB_TOKEN }} + harbor-push: ${{ needs.branch_build_setup.outputs.harbor_push }} + harbor-username: ${{ secrets.HARBOR_USERNAME }} + harbor-token: ${{ secrets.HARBOR_TOKEN }} + harbor-registry: ${{ vars.HARBOR_REGISTRY }} + harbor-project: ${{ vars.HARBOR_PROJECT }} + docker-image-owner: makeplane + docker-image-name: ${{ needs.branch_build_setup.outputs.dh_img_live }} + build-context: . + dockerfile-path: ./live/Dockerfile.live + buildx-driver: ${{ needs.branch_build_setup.outputs.gh_buildx_driver }} + buildx-version: ${{ needs.branch_build_setup.outputs.gh_buildx_version }} + buildx-platforms: ${{ needs.branch_build_setup.outputs.gh_buildx_platforms }} + buildx-endpoint: ${{ needs.branch_build_setup.outputs.gh_buildx_endpoint }} branch_build_push_apiserver: + if: ${{ needs.branch_build_setup.outputs.build_apiserver == 'true' || github.event_name == 'workflow_dispatch' || needs.branch_build_setup.outputs.gh_branch_name == 'master' }} name: Build-Push API Server Docker Image - runs-on: ${{vars.ACTION_RUNS_ON}} + runs-on: ubuntu-20.04 needs: [branch_build_setup] - env: - BACKEND_CLOUD_IMAGE: makeplane/backend-enterprise-cloud - BACKEND_CLOUD_TAG: makeplane/backend-enterprise-cloud:${{ needs.branch_build_setup.outputs.flat_branch_name }} - TARGET_BRANCH: ${{ needs.branch_build_setup.outputs.gh_branch_name }} - BUILDX_DRIVER: ${{ needs.branch_build_setup.outputs.gh_buildx_driver }} - BUILDX_VERSION: ${{ needs.branch_build_setup.outputs.gh_buildx_version }} - BUILDX_PLATFORMS: ${{ needs.branch_build_setup.outputs.gh_buildx_platforms }} - BUILDX_ENDPOINT: ${{ needs.branch_build_setup.outputs.gh_buildx_endpoint }} steps: - - name: Set Backend Docker Tag - run: | - if [ "${{ github.event_name }}" == "release" ]; then - CLOUD_TAG=${{env.BACKEND_CLOUD_IMAGE}}:stable - CLOUD_TAG=${CLOUD_TAG},${{env.BACKEND_CLOUD_IMAGE}}:${{ github.event.release.tag_name }} - elif [ "${{ env.TARGET_BRANCH }}" == "master" ]; then - CLOUD_TAG=${{env.BACKEND_CLOUD_IMAGE}}:latest - else - CLOUD_TAG=${{ env.BACKEND_CLOUD_TAG }} - fi - echo "BACKEND_CLOUD_TAG=${CLOUD_TAG}" >> $GITHUB_ENV - - - name: Login to Docker Hub - uses: docker/login-action@v3 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - with: - driver: ${{ env.BUILDX_DRIVER }} - version: ${{ env.BUILDX_VERSION }} - endpoint: ${{ env.BUILDX_ENDPOINT }} - - - name: Check out the repo + - id: checkout_files + name: Checkout Files uses: actions/checkout@v4 - - - name: Build and Push Backend-Cloud to Docker Hub - uses: docker/build-push-action@v5.1.0 + - name: Backend Build and Push + uses: ./.github/actions/build-push-action with: - context: ./apiserver - file: ./apiserver/Dockerfile.api - platforms: ${{ env.BUILDX_PLATFORMS }} - push: true - tags: ${{ env.BACKEND_CLOUD_TAG }} - env: - DOCKER_BUILDKIT: 1 - DOCKER_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} - DOCKER_PASSWORD: ${{ secrets.DOCKERHUB_TOKEN }} + build-release: ${{ needs.branch_build_setup.outputs.build_release }} + build-prerelease: ${{ needs.branch_build_setup.outputs.build_prerelease }} + release-version: ${{ needs.branch_build_setup.outputs.release_version }} + docker-username: ${{ secrets.DOCKERHUB_USERNAME }} + dockerhub-token: ${{ secrets.DOCKERHUB_TOKEN }} + harbor-push: ${{ needs.branch_build_setup.outputs.harbor_push }} + harbor-username: ${{ secrets.HARBOR_USERNAME }} + harbor-token: ${{ secrets.HARBOR_TOKEN }} + harbor-registry: ${{ vars.HARBOR_REGISTRY }} + harbor-project: ${{ vars.HARBOR_PROJECT }} + docker-image-owner: makeplane + docker-image-name: ${{ needs.branch_build_setup.outputs.dh_img_backend }} + build-context: ./apiserver + dockerfile-path: ./apiserver/Dockerfile.api + buildx-driver: ${{ needs.branch_build_setup.outputs.gh_buildx_driver }} + buildx-version: ${{ needs.branch_build_setup.outputs.gh_buildx_version }} + buildx-platforms: ${{ needs.branch_build_setup.outputs.gh_buildx_platforms }} + buildx-endpoint: ${{ needs.branch_build_setup.outputs.gh_buildx_endpoint }} + branch_build_push_proxy: + if: ${{ needs.branch_build_setup.outputs.build_proxy == 'true' || github.event_name == 'workflow_dispatch' || needs.branch_build_setup.outputs.gh_branch_name == 'master' }} + name: Build-Push Proxy Docker Image + runs-on: ubuntu-20.04 + needs: [branch_build_setup] + steps: + - id: checkout_files + name: Checkout Files + uses: actions/checkout@v4 + - name: Proxy Build and Push + uses: ./.github/actions/build-push-action + with: + build-release: ${{ needs.branch_build_setup.outputs.build_release }} + build-prerelease: ${{ needs.branch_build_setup.outputs.build_prerelease }} + release-version: ${{ needs.branch_build_setup.outputs.release_version }} + docker-username: ${{ secrets.DOCKERHUB_USERNAME }} + dockerhub-token: ${{ secrets.DOCKERHUB_TOKEN }} + harbor-push: ${{ needs.branch_build_setup.outputs.harbor_push }} + harbor-username: ${{ secrets.HARBOR_USERNAME }} + harbor-token: ${{ secrets.HARBOR_TOKEN }} + harbor-registry: ${{ vars.HARBOR_REGISTRY }} + harbor-project: ${{ vars.HARBOR_PROJECT }} + docker-image-owner: makeplane + docker-image-name: ${{ needs.branch_build_setup.outputs.dh_img_proxy }} + build-context: ./nginx + dockerfile-path: ./nginx/Dockerfile + buildx-driver: ${{ needs.branch_build_setup.outputs.gh_buildx_driver }} + buildx-version: ${{ needs.branch_build_setup.outputs.gh_buildx_version }} + buildx-platforms: ${{ needs.branch_build_setup.outputs.gh_buildx_platforms }} + buildx-endpoint: ${{ needs.branch_build_setup.outputs.gh_buildx_endpoint }} diff --git a/.github/workflows/build-branch-ee.yml b/.github/workflows/build-branch-ee.yml index 541f27d81e..74e5548ed1 100644 --- a/.github/workflows/build-branch-ee.yml +++ b/.github/workflows/build-branch-ee.yml @@ -3,6 +3,23 @@ name: Branch Build Enterprise on: workflow_dispatch: inputs: + build_type: + description: 'Type of build to run' + required: true + type: choice + default: 'Build' + options: + - 'Build' + - 'Release' + releaseVersion: + description: "Release Version" + type: string + default: v0.0.0 + isPrerelease: + description: "Is Pre-release" + type: boolean + default: false + required: true arm64: description: "Build for ARM64 architecture" required: false @@ -15,6 +32,9 @@ on: env: TARGET_BRANCH: ${{ github.ref_name }} ARM64_BUILD: ${{ github.event.inputs.arm64 }} + BUILD_TYPE: ${{ github.event.inputs.build_type }} + RELEASE_VERSION: ${{ github.event.inputs.releaseVersion }} + IS_PRERELEASE: ${{ github.event.inputs.isPrerelease }} jobs: branch_build_setup: @@ -44,13 +64,15 @@ jobs: dh_img_proxy: ${{ steps.set_env_variables.outputs.DH_IMG_PROXY }} dh_img_monitor: ${{ steps.set_env_variables.outputs.DH_IMG_MONITOR }} harbor_push: ${{ steps.set_env_variables.outputs.HARBOR_PUSH }} - release_version: ${{ steps.set_env_variables.outputs.FLAT_RELEASE_VERSION }} + build_release: ${{ steps.set_env_variables.outputs.BUILD_RELEASE }} + build_prerelease: ${{ steps.set_env_variables.outputs.BUILD_PRERELEASE }} + release_version: ${{ steps.set_env_variables.outputs.RELEASE_VERSION }} steps: - id: set_env_variables name: Set Environment Variables run: | - if [ "${{ env.ARM64_BUILD }}" == "true" ] || ([ "${{ github.event_name }}" == "release" ] && [ "${{ env.IS_PRERELEASE }}" != "true" ]); then + if [ "${{ env.ARM64_BUILD }}" == "true" ] || ([ "${{ env.BUILD_TYPE }}" == "Release" ] && [ "${{ env.IS_PRERELEASE }}" != "true" ]); then echo "BUILDX_DRIVER=cloud" >> $GITHUB_OUTPUT echo "BUILDX_VERSION=lab:latest" >> $GITHUB_OUTPUT echo "BUILDX_PLATFORMS=linux/amd64,linux/arm64" >> $GITHUB_OUTPUT @@ -64,6 +86,44 @@ jobs: BR_NAME=$( echo "${{ env.TARGET_BRANCH }}" |sed 's/[^a-zA-Z0-9.-]//g') echo "TARGET_BRANCH=$BR_NAME" >> $GITHUB_OUTPUT + echo "DH_IMG_WEB=web-enterprise" >> $GITHUB_OUTPUT + echo "DH_IMG_SPACE=space-enterprise" >> $GITHUB_OUTPUT + echo "DH_IMG_ADMIN=admin-enterprise" >> $GITHUB_OUTPUT + echo "DH_IMG_LIVE=live-enterprise" >> $GITHUB_OUTPUT + echo "DH_IMG_BACKEND=backend-enterprise" >> $GITHUB_OUTPUT + echo "DH_IMG_PROXY=proxy-enterprise" >> $GITHUB_OUTPUT + echo "DH_IMG_MONITOR=monitor-enterprise" >> $GITHUB_OUTPUT + + BUILD_RELEASE=false + BUILD_PRERELEASE=false + RELVERSION="latest" + HARBOR_PUSH=false + + if [ "${{ env.BUILD_TYPE }}" == "Release" ]; then + FLAT_RELEASE_VERSION=$(echo "${{ env.RELEASE_VERSION }}" | sed 's/[^a-zA-Z0-9.-]//g') + echo "FLAT_RELEASE_VERSION=${FLAT_RELEASE_VERSION}" >> $GITHUB_OUTPUT + HARBOR_PUSH=true + + semver_regex="^v([0-9]+)\.([0-9]+)\.([0-9]+)(-[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$" + if [[ ! $FLAT_RELEASE_VERSION =~ $semver_regex ]]; then + echo "Invalid Release Version Format : $FLAT_RELEASE_VERSION" + echo "Please provide a valid SemVer version" + echo "e.g. v1.2.3 or v1.2.3-alpha-1" + echo "Exiting the build process" + exit 1 # Exit with status 1 to fail the step + fi + BUILD_RELEASE=true + RELVERSION=$FLAT_RELEASE_VERSION + + if [ "${{ env.IS_PRERELEASE }}" == "true" ]; then + BUILD_PRERELEASE=true + fi + fi + echo "BUILD_RELEASE=${BUILD_RELEASE}" >> $GITHUB_OUTPUT + echo "BUILD_PRERELEASE=${BUILD_PRERELEASE}" >> $GITHUB_OUTPUT + echo "RELEASE_VERSION=${RELVERSION}" >> $GITHUB_OUTPUT + echo "HARBOR_PUSH=${HARBOR_PUSH}" >> $GITHUB_OUTPUT + if [ "${{ env.TARGET_BRANCH }}" == "master" ]; then echo "artifact_upload_to_s3=true" >> $GITHUB_OUTPUT echo "artifact_s3_suffix=latest" >> $GITHUB_OUTPUT @@ -75,15 +135,6 @@ jobs: echo "artifact_s3_suffix=$BR_NAME" >> $GITHUB_OUTPUT fi - echo "DH_IMG_WEB=web-enterprise" >> $GITHUB_OUTPUT - echo "DH_IMG_SPACE=space-enterprise" >> $GITHUB_OUTPUT - echo "DH_IMG_ADMIN=admin-enterprise" >> $GITHUB_OUTPUT - echo "DH_IMG_LIVE=live-enterprise" >> $GITHUB_OUTPUT - echo "DH_IMG_BACKEND=backend-enterprise" >> $GITHUB_OUTPUT - echo "DH_IMG_PROXY=proxy-enterprise" >> $GITHUB_OUTPUT - echo "DH_IMG_MONITOR=monitor-enterprise" >> $GITHUB_OUTPUT - echo "HARBOR_PUSH=true" >> $GITHUB_OUTPUT - - id: checkout_files name: Checkout Files uses: actions/checkout@v4 @@ -168,6 +219,9 @@ jobs: - name: Web Build and Push uses: ./.github/actions/build-push-action with: + build-release: ${{ needs.branch_build_setup.outputs.build_release }} + build-prerelease: ${{ needs.branch_build_setup.outputs.build_prerelease }} + release-version: ${{ needs.branch_build_setup.outputs.release_version }} docker-username: ${{ secrets.DOCKERHUB_USERNAME }} dockerhub-token: ${{ secrets.DOCKERHUB_TOKEN }} harbor-push: ${{ needs.branch_build_setup.outputs.harbor_push }} @@ -196,6 +250,9 @@ jobs: - name: Space Build and Push uses: ./.github/actions/build-push-action with: + build-release: ${{ needs.branch_build_setup.outputs.build_release }} + build-prerelease: ${{ needs.branch_build_setup.outputs.build_prerelease }} + release-version: ${{ needs.branch_build_setup.outputs.release_version }} docker-username: ${{ secrets.DOCKERHUB_USERNAME }} dockerhub-token: ${{ secrets.DOCKERHUB_TOKEN }} harbor-push: ${{ needs.branch_build_setup.outputs.harbor_push }} @@ -224,6 +281,9 @@ jobs: - name: Live Build and Push uses: ./.github/actions/build-push-action with: + build-release: ${{ needs.branch_build_setup.outputs.build_release }} + build-prerelease: ${{ needs.branch_build_setup.outputs.build_prerelease }} + release-version: ${{ needs.branch_build_setup.outputs.release_version }} docker-username: ${{ secrets.DOCKERHUB_USERNAME }} dockerhub-token: ${{ secrets.DOCKERHUB_TOKEN }} harbor-push: ${{ needs.branch_build_setup.outputs.harbor_push }} @@ -252,6 +312,9 @@ jobs: - name: Backend Build and Push uses: ./.github/actions/build-push-action with: + build-release: ${{ needs.branch_build_setup.outputs.build_release }} + build-prerelease: ${{ needs.branch_build_setup.outputs.build_prerelease }} + release-version: ${{ needs.branch_build_setup.outputs.release_version }} docker-username: ${{ secrets.DOCKERHUB_USERNAME }} dockerhub-token: ${{ secrets.DOCKERHUB_TOKEN }} harbor-push: ${{ needs.branch_build_setup.outputs.harbor_push }} @@ -280,6 +343,9 @@ jobs: - name: Proxy Build and Push uses: ./.github/actions/build-push-action with: + build-release: ${{ needs.branch_build_setup.outputs.build_release }} + build-prerelease: ${{ needs.branch_build_setup.outputs.build_prerelease }} + release-version: ${{ needs.branch_build_setup.outputs.release_version }} docker-username: ${{ secrets.DOCKERHUB_USERNAME }} dockerhub-token: ${{ secrets.DOCKERHUB_TOKEN }} harbor-push: ${{ needs.branch_build_setup.outputs.harbor_push }} @@ -322,6 +388,9 @@ jobs: - name: Monitor Build and Push uses: ./.github/actions/build-push-action with: + build-release: ${{ needs.branch_build_setup.outputs.build_release }} + build-prerelease: ${{ needs.branch_build_setup.outputs.build_prerelease }} + release-version: ${{ needs.branch_build_setup.outputs.release_version }} docker-username: ${{ secrets.DOCKERHUB_USERNAME }} dockerhub-token: ${{ secrets.DOCKERHUB_TOKEN }} harbor-push: ${{ needs.branch_build_setup.outputs.harbor_push }}