name: Feature Preview on: workflow_dispatch: inputs: web-build: required: false description: 'Build Web' type: boolean default: true space-build: required: false description: 'Build Space' type: boolean default: false env: BUILD_WEB: ${{ github.event.inputs.web-build }} BUILD_SPACE: ${{ github.event.inputs.space-build }} jobs: setup-feature-build: name: Feature Build Setup runs-on: ubuntu-latest steps: - name: Checkout run: | echo "BUILD_WEB=$BUILD_WEB" echo "BUILD_SPACE=$BUILD_SPACE" outputs: web-build: ${{ env.BUILD_WEB}} space-build: ${{env.BUILD_SPACE}} feature-build-web: if: ${{ needs.setup-feature-build.outputs.web-build == 'true' }} needs: setup-feature-build name: Feature Build Web runs-on: ubuntu-latest env: AWS_ACCESS_KEY_ID: ${{ vars.FEATURE_PREVIEW_AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.FEATURE_PREVIEW_AWS_SECRET_ACCESS_KEY }} AWS_BUCKET: ${{ vars.FEATURE_PREVIEW_AWS_BUCKET }} NEXT_PUBLIC_API_BASE_URL: ${{ vars.FEATURE_PREVIEW_NEXT_PUBLIC_API_BASE_URL }} steps: - name: Set up Node.js uses: actions/setup-node@v4 with: node-version: '18' - name: Install AWS cli run: | sudo apt-get update sudo apt-get install -y python3-pip pip3 install awscli - name: Checkout uses: actions/checkout@v4 with: path: plane - name: Install Dependencies run: | cd $GITHUB_WORKSPACE/plane yarn install - name: Build Web id: build-web run: | cd $GITHUB_WORKSPACE/plane yarn build --filter=web cd $GITHUB_WORKSPACE TAR_NAME="web.tar.gz" tar -czf $TAR_NAME ./plane FILE_EXPIRY=$(date -u -d "+2 days" +"%Y-%m-%dT%H:%M:%SZ") aws s3 cp $TAR_NAME s3://${{ env.AWS_BUCKET }}/${{github.sha}}/$TAR_NAME --expires $FILE_EXPIRY feature-build-space: if: ${{ needs.setup-feature-build.outputs.space-build == 'true' }} needs: setup-feature-build name: Feature Build Space runs-on: ubuntu-latest env: AWS_ACCESS_KEY_ID: ${{ vars.FEATURE_PREVIEW_AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.FEATURE_PREVIEW_AWS_SECRET_ACCESS_KEY }} AWS_BUCKET: ${{ vars.FEATURE_PREVIEW_AWS_BUCKET }} NEXT_PUBLIC_DEPLOY_WITH_NGINX: 1 NEXT_PUBLIC_API_BASE_URL: ${{ vars.FEATURE_PREVIEW_NEXT_PUBLIC_API_BASE_URL }} outputs: do-build: ${{ needs.setup-feature-build.outputs.space-build }} s3-url: ${{ steps.build-space.outputs.S3_PRESIGNED_URL }} steps: - name: Set up Node.js uses: actions/setup-node@v4 with: node-version: '18' - name: Install AWS cli run: | sudo apt-get update sudo apt-get install -y python3-pip pip3 install awscli - name: Checkout uses: actions/checkout@v4 with: path: plane - name: Install Dependencies run: | cd $GITHUB_WORKSPACE/plane yarn install - name: Build Space id: build-space run: | cd $GITHUB_WORKSPACE/plane yarn build --filter=space cd $GITHUB_WORKSPACE TAR_NAME="space.tar.gz" tar -czf $TAR_NAME ./plane FILE_EXPIRY=$(date -u -d "+2 days" +"%Y-%m-%dT%H:%M:%SZ") aws s3 cp $TAR_NAME s3://${{ env.AWS_BUCKET }}/${{github.sha}}/$TAR_NAME --expires $FILE_EXPIRY feature-deploy: if: ${{ always() && (needs.setup-feature-build.outputs.web-build == 'true' || needs.setup-feature-build.outputs.space-build == 'true') }} needs: [feature-build-web, feature-build-space] name: Feature Deploy runs-on: ubuntu-latest env: AWS_ACCESS_KEY_ID: ${{ vars.FEATURE_PREVIEW_AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.FEATURE_PREVIEW_AWS_SECRET_ACCESS_KEY }} AWS_BUCKET: ${{ vars.FEATURE_PREVIEW_AWS_BUCKET }} KUBE_CONFIG_FILE: ${{ secrets.FEATURE_PREVIEW_KUBE_CONFIG }} steps: - name: Install AWS cli run: | sudo apt-get update sudo apt-get install -y python3-pip pip3 install awscli - 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: Kubectl Setup run: | curl -LO "https://dl.k8s.io/release/${{ vars.FEATURE_PREVIEW_KUBE_VERSION }}/bin/linux/amd64/kubectl" chmod +x kubectl mkdir -p ~/.kube echo "$KUBE_CONFIG_FILE" > ~/.kube/config chmod 600 ~/.kube/config - name: HELM Setup run: | curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 chmod 700 get_helm.sh ./get_helm.sh - name: App Deploy run: | WEB_S3_URL="" if [ ${{ env.BUILD_WEB }} == true ]; then WEB_S3_URL=$(aws s3 presign s3://${{ vars.FEATURE_PREVIEW_AWS_BUCKET }}/${{github.sha}}/web.tar.gz --expires-in 3600) fi SPACE_S3_URL="" if [ ${{ env.BUILD_SPACE }} == true ]; then SPACE_S3_URL=$(aws s3 presign s3://${{ vars.FEATURE_PREVIEW_AWS_BUCKET }}/${{github.sha}}/space.tar.gz --expires-in 3600) fi if [ ${{ env.BUILD_WEB }} == true ] || [ ${{ env.BUILD_SPACE }} == true ]; then helm --kube-insecure-skip-tls-verify repo add feature-preview ${{ vars.FEATURE_PREVIEW_HELM_CHART_URL }} APP_NAMESPACE="${{ vars.FEATURE_PREVIEW_NAMESPACE }}" DEPLOY_SCRIPT_URL="${{ vars.FEATURE_PREVIEW_DEPLOY_SCRIPT_URL }}" METADATA=$(helm --kube-insecure-skip-tls-verify install feature-preview/${{ vars.FEATURE_PREVIEW_HELM_CHART_NAME }} \ --generate-name \ --namespace $APP_NAMESPACE \ --set ingress.primaryDomain=${{vars.FEATURE_PREVIEW_PRIMARY_DOMAIN || 'feature.plane.tools' }} \ --set web.image=${{vars.FEATURE_PREVIEW_DOCKER_BASE}} \ --set web.enabled=${{ env.BUILD_WEB || false }} \ --set web.artifact_url=$WEB_S3_URL \ --set space.image=${{vars.FEATURE_PREVIEW_DOCKER_BASE}} \ --set space.enabled=${{ env.BUILD_SPACE || false }} \ --set space.artifact_url=$SPACE_S3_URL \ --set shared_config.deploy_script_url=$DEPLOY_SCRIPT_URL \ --set shared_config.api_base_url=${{vars.FEATURE_PREVIEW_NEXT_PUBLIC_API_BASE_URL}} \ --output json \ --timeout 1000s) APP_NAME=$(echo $METADATA | jq -r '.name') INGRESS_HOSTNAME=$(kubectl get ingress -n feature-builds --insecure-skip-tls-verify \ -o jsonpath='{.items[?(@.metadata.annotations.meta\.helm\.sh\/release-name=="'$APP_NAME'")]}' | \ jq -r '.spec.rules[0].host') echo "****************************************" echo "APP NAME ::: $APP_NAME" echo "INGRESS HOSTNAME ::: $INGRESS_HOSTNAME" echo "****************************************" fi