Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
57 commits
Select commit Hold shift + click to select a range
f67cdb2
Upgrade to IntelliJ 2025.3
Oct 23, 2025
f65b542
Fix class cast exception in explorer dialogs
Oct 30, 2025
2cd176b
Update sign pipeline
Oct 30, 2025
a4fcb96
Remove 'setRequired' from form which may break the UX in eap
Nov 3, 2025
fb526e2
Merge remote-tracking branch 'origin/develop.next' into develop.eap
wangmingliang-ms Nov 6, 2025
aba290d
Merge branch 'develop.next' into develop.eap
Nov 6, 2025
7e4d451
Merge remote-tracking branch 'origin/develop.next' into develop.eap
wangmingliang-ms Jan 21, 2026
2936d8c
Merge remote-tracking branch 'origin/develop' into develop.next
wangmingliang-ms Jan 21, 2026
57adfd5
Add App Modernization support with Migrate to Azure feature
fangjian0423 Jan 20, 2026
75cecba
use new extension point interface & refactor
fangjian0423 Jan 21, 2026
ad32f49
update xml
fangjian0423 Jan 21, 2026
d209bf7
refactor
fangjian0423 Jan 22, 2026
d4e5f7a
add jumpping to app mod panel if there is no recommendation data
fangjian0423 Jan 22, 2026
6f437ae
enhance open app mod panel
fangjian0423 Jan 22, 2026
2c70d74
1. use one MigrateToAzureAction instead MigrateToAzureAction and Migr…
fangjian0423 Jan 22, 2026
07e235b
remove unuseful properties
fangjian0423 Jan 23, 2026
fc74e63
update text for github copilot already installed scenario
fangjian0423 Jan 23, 2026
ff9d484
add telemetry support
fangjian0423 Jan 23, 2026
f1b3791
set DEBUG_TELEMETRY to false
fangjian0423 Jan 23, 2026
0b6f861
Add java-upgrade promotion
Jan 26, 2026
a2f7812
move migration code to javamigration package and add utils package
fangjian0423 Jan 26, 2026
bb6b9ec
Enhance the feature function and remove unused code
Jan 26, 2026
bf4c5ae
revert .idea file
fangjian0423 Jan 27, 2026
3ee458a
remove InstallPluginDialog and add built-in dialog
fangjian0423 Jan 27, 2026
9445e3f
revert gradle.properties
fangjian0423 Jan 28, 2026
0e1cc29
revert gradle.properties
fangjian0423 Jan 28, 2026
407a07e
telemetry update click-option to click-task
fangjian0423 Jan 28, 2026
38b2625
telemetry update no-options to no-tasks
fangjian0423 Jan 28, 2026
26818ea
Add fix for single CVE dependency;
Jan 28, 2026
6cc112a
Add telemetry
Jan 29, 2026
46b410d
remove duplicate and unuseful code
fangjian0423 Jan 29, 2026
5e722c9
resolve conflicts
fangjian0423 Jan 29, 2026
def8dac
text update
fangjian0423 Jan 29, 2026
67e9969
telemetry update
fangjian0423 Jan 29, 2026
57213c7
Fix bug of version match and add EOF date comparison
Jan 29, 2026
bc93974
Add try catch to escape error and log. Fix comments
Jan 30, 2026
b3c2a88
add more logs and add MigrationStatePreloader to pre load migration data
fangjian0423 Jan 30, 2026
d98f429
Merge branch 'appmod-support' of https://github.com/fangjian0423/azur…
fangjian0423 Jan 30, 2026
f272480
use correct parameter to avoid error log
fangjian0423 Jan 30, 2026
392b903
Merge pull request #11621 from fangjian0423/appmod-support
wangmingliang-ms Jan 30, 2026
607eaa5
bump version and update changelog.
wangmingliang-ms Jan 30, 2026
4200fdd
Merge pull request #11644 from microsoft/wangmi/prepare-v3.97.0
wangmingliang-ms Jan 30, 2026
e90f8da
Merge remote-tracking branch 'origin/develop' into develop.next
wangmingliang-ms Feb 2, 2026
aad53b5
Merge remote-tracking branch 'origin/develop' into develop.next
wangmingliang-ms Feb 2, 2026
d0013f9
Merge remote-tracking branch 'origin/develop' into develop.next
wangmingliang-ms Feb 3, 2026
a94866b
Merge branch 'develop' into develop.next
wangmingliang-ms Feb 3, 2026
a8683c2
Merge remote-tracking branch 'origin/develop' into develop.next
wangmingliang-ms Feb 13, 2026
ce8e08e
Merge remote-tracking branch 'origin/develop' into develop.next
wangmingliang-ms Feb 13, 2026
230a5cc
Support IntelliJ IDEA 2026.1 EAP
wangmingliang-ms Mar 9, 2026
3d1f332
Fix: Upgrade Gradle to 9.0 and IntelliJ Platform Plugin to 2.12.0 for…
wangmingliang-ms Mar 9, 2026
5127af9
Support IntelliJ IDEA 2026.1 EAP - fix build.gradle.kts for Plugin 2.…
wangmingliang-ms Mar 9, 2026
67d894c
Fix ktlint code style violations for IntelliJ 2026.1 EAP support
wangmingliang-ms Mar 9, 2026
3782f32
Fix IntelliJ 2026.1 EAP API breaking changes
wangmingliang-ms Mar 9, 2026
b7c85c5
fix: remove override of final ConsoleViewImpl.isDisposed() method
wangmingliang-ms Mar 9, 2026
e7c547c
fix: add missing resource bundle key 'user/appmod.refresh_migrate_node'
wangmingliang-ms Mar 9, 2026
4dbbd18
fix: use reflection for Scala plugin SBT versions API compatibility
wangmingliang-ms Mar 10, 2026
0a0662c
fix: adapt StreamingLogsConsoleView for ConsoleViewImpl.isDisposed() …
wangmingliang-ms Mar 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
212 changes: 212 additions & 0 deletions .azure-pipelines/build_and_sign.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,212 @@
name: $(Date:yyyyMMdd).$(Rev:r)
variables:
- name: Codeql.Enabled
value: true
- name: IsStableBuild
value: ${{ or(eq(variables['Build.SourceBranch'], 'refs/heads/main'), startsWith(variables['Build.SourceBranch'], 'refs/heads/release-')) }}
- name: IsNightlyBuild
value: ${{ and(eq(variables['Build.Reason'], 'Schedule'), eq(variables['Build.SourceBranch'], 'refs/heads/develop')) }}
- name: DoRealSign
value: ${{ or(eq(parameters.ForceRealSign, true), eq(variables['IsStableBuild'], true), eq(variables['IsNightlyBuild'], true)) }}
- name: DoProceedToRelease
value: ${{ or(eq(variables['DoRealSign'], true), eq(parameters.ForceTestSignRelease, true)) }}
- name: RELEASE_CHANNEL
${{ if or(eq(variables['Build.SourceBranch'], 'refs/heads/main'), startsWith(variables['Build.SourceBranch'], 'refs/heads/release-')) }}:
value: stable
${{ else }}:
value: nightly
- name: SIGNTYPE
${{ if eq(variables['DoRealSign'], true) }}:
value: real
${{ else }}:
value: test

parameters:
- name: ForceRealSign
displayName: "Force usage of real sign (PME PoP needed)"
type: boolean
default: false
- name: ForceTestSignRelease
displayName: "Force release on test sign (for test ONLY)"
type: boolean
default: false

resources:
repositories:
- repository: self
type: git
ref: refs/heads/main
- repository: 1esPipelines
type: git
name: 1ESPipelineTemplates/1ESPipelineTemplates
ref: refs/tags/release

trigger:
branches:
include:
- main
- develop
- release-*

pr:
- main
- develop
- release-*

schedules:
- cron: "0 22 * * 0-4" # 6:00 Mon-Fri UTC+8
displayName: "Nightly build"
branches:
include:
- develop
always: true

extends:
template: v1/1ES.Official.PipelineTemplate.yml@1esPipelines
parameters:
featureFlags:
disableNetworkIsolation: true
pool:
name: VSEngSS-MicroBuild2022-1ES
stages:
- stage: Build_Plugin
displayName: "Build Plugin"
jobs:
- job: Build_and_Sign
displayName: Build and Sign Plugin
timeoutInMinutes: 360
templateContext:
outputs:
- output: pipelineArtifact
artifactName: plugin
targetPath: $(build.artifactstagingdirectory)/plugin
displayName: "Publish Artifact: plugin"
steps:
- checkout: self
clean: true
fetchTags: false
- task: PowerShell@2
displayName: Install JDK 21
inputs:
targetType: inline
script: |
# Download Adoptium/Temurin JDK 21.0.8
Write-Host "Downloading Java 21.0.8..."
$source = "https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.8%2B9/OpenJDK21U-jdk_x64_windows_hotspot_21.0.8_9.zip"
$destination = "$(build.sourcesdirectory)\jdk21_x64_windows.zip"
Invoke-WebRequest -Uri $source -OutFile $destination
- task: JavaToolInstaller@0
displayName: "Use Java 21"
inputs:
versionSpec: 21
jdkArchitectureOption: x64
jdkSourceOption: LocalDirectory
jdkFile: '$(build.sourcesdirectory)\jdk21_x64_windows.zip'
jdkDestinationDirectory: "$(agent.toolsDirectory)/jdk21"
- task: UseNode@1
inputs:
version: "22.x"
- task: NuGetAuthenticate@1
displayName: "🔩 NuGet Authenticate"
- task: MicroBuildSigningPlugin@4
displayName: "Add MicroBuild Signing Plugin"
inputs:
${{if eq(variables.DoRealSign, true) }}:
signType: "real"
ConnectedPMEServiceName: "40012d40-9ded-4f75-8476-d60758200346"
${{ else }}:
signType: "test"
feedSource: "https://mseng.pkgs.visualstudio.com/DefaultCollection/_packaging/MicroBuildToolset/nuget/v3/index.json"
env:
MicroBuildOutputFolderOverride: "$(Agent.TempDirectory)"
- task: PowerShell@2
displayName: Build Plugin
inputs:
targetType: inline
script: |
mvn -v
# ./gradlew buildUtils || exit -1
mvn clean install -f ./Utils/pom.xml -T 1C "-Dcheckstyle.skip=true" "-Dmaven.test.skip=true" "-Dmaven.javadoc.skip=true"
mvn clean -f ./Utils/pom.xml
cd PluginsAndFeatures/azure-toolkit-for-intellij
./gradlew clean buildPlugin -s "-Papplicationinsights.key=$(INTELLIJ_KEY)" "-PneedPatchVersion=false" "-Psources=false" "-Porg.gradle.configureondemand=false" "-Porg.gradle.daemon=false" "-Porg.gradle.unsafe.configuration-cache=false" "-Porg.gradle.caching=false"
env:
USE_STABLE_VERSION: $(IsStableBuild)
- task: PowerShell@2
displayName: Unpackage
inputs:
targetType: inline
script: |
Write-Host "Creating artifacts directory..."
New-Item -ItemType Directory -Path ".\artifacts\intellij\" -Force
Write-Host "Finding plugin zip file..."
$zipFile = Get-ChildItem ".\PluginsAndFeatures\azure-toolkit-for-intellij\build\distributions\*.zip" | Select-Object -First 1
Write-Host "Found: $($zipFile.FullName)"
Write-Host "Copying to artifacts..."
Copy-Item $zipFile.FullName ".\artifacts\intellij\azure-intellij.zip"
Write-Host "Extracting archive..."
Expand-Archive -Path ".\artifacts\intellij\azure-intellij.zip" -DestinationPath ".\artifacts\intellij\folder" -Force
Write-Host "Cleaning up temporary zip file..."
Remove-Item ".\artifacts\intellij\azure-intellij.zip"
Write-Host "Unpackaging completed successfully"
- task: PowerShell@2
displayName: Sign jars
timeoutInMinutes: 240
inputs:
targetType: inline
script: |
Write-Host "Searching for JAR files to sign..."
$files = Get-ChildItem -Path . -Include "azure-intellij-*.jar", "azure-toolkit-for-intellij*.jar", "azure-toolkit-ide-*.jar", "azuretools-core.jar", "azure-explorer-common.jar", "hdinsight-node-common.jar" -Recurse -File
Write-Host "Found $($files.Count) JAR file(s) to sign"
$counter = 0
foreach ($file in $files) {
$counter++
Write-Host "[$counter/$($files.Count)] Signing: $($file.Name) with sign type: $(SIGNTYPE)"
dotnet "$env:MBSIGN_APPFOLDER/DDSignFiles.dll" -- /file:"$($file.FullName)" /certs:100010171 /signType:$(SIGNTYPE)
Write-Host " ✓ Signed successfully"
}
Write-Host "All JAR files signed successfully"
workingDirectory: 'artifacts/intellij/folder/azure-intellij/lib'
- task: CmdLine@2
displayName: Repackage
inputs:
script: |
echo Starting repackaging...
cd artifacts\intellij\folder
echo Creating final zip archive: azure-intellij-$(Build.BuildNumber).zip
tar -a -c -f ..\..\azure-intellij-$(Build.BuildNumber).zip *
echo Repackaging completed successfully
- task: CopyFiles@2
displayName: "Copy Files to: $(build.artifactstagingdirectory)"
inputs:
SourceFolder: $(system.defaultworkingdirectory)/artifacts
Contents: "*.zip"
TargetFolder: $(build.artifactstagingdirectory)/plugin
- task: AzureArtifacts.manifest-generator-task.manifest-generator-task.ManifestGeneratorTask@0
displayName: "Manifest Generator "
inputs:
BuildDropPath: $(build.artifactstagingdirectory)/plugin
- stage: Release_Plugin
condition: ${{ variables.DoProceedToRelease }}
displayName: Release Plugin to Marketplace
dependsOn: Build_Plugin
jobs:
- deployment: releasePlugin
templateContext:
type: releaseJob
isProduction: true
inputs:
- input: pipelineArtifact
artifactName: "plugin"
targetPath: "$(Pipeline.Workspace)/plugin"
environment: azure-intellij-plugin-release
strategy:
runOnce:
deploy:
steps:
- task: PowerShell@2
displayName: Release
inputs:
targetType: inline
script: |
curl.exe -i --header "Authorization: Bearer ${env:RELEASE_TOKEN}" -F pluginId=28791 -F "file=@$(Pipeline.Workspace)/plugin/azure-intellij-$(Build.BuildNumber).zip" -F channel=$(RELEASE_CHANNEL) https://plugins.jetbrains.com/plugin/uploadPlugin
18 changes: 9 additions & 9 deletions .azure-pipelines/sign-for-stable-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -87,23 +87,23 @@ extends:
clean: true
fetchTags: false
- task: PowerShell@2
displayName: Install JDK 17
displayName: Install JDK 21
inputs:
targetType: inline
script: |
# Download Adoptium/Temurin JDK 17.0.12
Write-Host "Downloading Java 17.0.12..."
$source = "https://download.oracle.com/java/17/archive/jdk-17.0.12_windows-x64_bin.zip"
$destination = "$(build.sourcesdirectory)\jdk17_x64_windows.zip"
# Download Adoptium/Temurin JDK 21.0.8
Write-Host "Downloading Java 21.0.8..."
$source = "https://download.oracle.com/java/21/archive/jdk-21.0.2_windows-x64_bin.zip"
$destination = "$(build.sourcesdirectory)\jdk21_x64_windows.zip"
Invoke-WebRequest -Uri $source -OutFile $destination
- task: JavaToolInstaller@0
displayName: 'Use Java 17'
displayName: 'Use Java 21'
inputs:
versionSpec: 17
versionSpec: 21
jdkArchitectureOption: x64
jdkSourceOption: LocalDirectory
jdkFile: '$(build.sourcesdirectory)\jdk17_x64_windows.zip'
jdkDestinationDirectory: '$(agent.toolsDirectory)/jdk17'
jdkFile: '$(build.sourcesdirectory)\jdk21_x64_windows.zip'
jdkDestinationDirectory: '$(agent.toolsDirectory)/jdk21'
- task: UseNode@1
inputs:
version: "22.x"
Expand Down
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -111,3 +111,5 @@ pom.xml.versionsBackup
# Bicep Language Server
**/bicep-langserver/**
**/azure-intellij-plugin-bicep/downloaded.zip
*.log
deps.txt
125 changes: 125 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
# CLAUDE.md

This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.

## Project Overview

Azure Toolkits for Java — IDE plugins for IntelliJ IDEA and Eclipse that help Java developers create, develop, configure, test, and deploy applications to Azure. The primary focus of active development is the IntelliJ plugin.

## Build Commands

### Prerequisites
- Java 17 (required for IntelliJ plugin; set `JAVA_HOME` accordingly)
- The shared toolkit libraries from [azure-maven-plugins](https://github.com/microsoft/azure-maven-plugins) must be installed to local Maven repo first

### Build shared toolkit libs (one-time or when libs change)
```bash
# Clone and build azure-toolkit-libs into local Maven repo
git clone https://github.com/microsoft/azure-maven-plugins.git
cd azure-maven-plugins/azure-toolkit-libs
mvn clean install -B -T 4 -Dmaven.test.skip=true
```

### Build Utils (Maven modules in Utils/)
```bash
# From repo root — builds the IDE-specific wrapper libraries
mvn clean install -f Utils/pom.xml
# Or via the root Gradle task:
./gradlew buildUtils -x buildToolkitsLib
```

### Build IntelliJ plugin
```bash
cd PluginsAndFeatures/azure-toolkit-for-intellij
./gradlew clean buildPlugin -s
```
Output ZIP: `PluginsAndFeatures/azure-toolkit-for-intellij/build/distributions/`

### Build Eclipse plugin
```bash
mvn clean install -f Utils/pom.xml
mvn clean install -f PluginsAndFeatures/AddLibrary/AzureLibraries/pom.xml
mvn clean install -f PluginsAndFeatures/azure-toolkit-for-eclipse/pom.xml
```

### Build everything (from repo root)
```bash
./gradlew buildAll
```

### Run/Debug IntelliJ plugin locally
Open `PluginsAndFeatures/azure-toolkit-for-intellij` in IntelliJ and use the Gradle `runIde` task. Remote debug port: 5005.

### Tests
```bash
# IntelliJ plugin tests (run from the IntelliJ plugin dir)
cd PluginsAndFeatures/azure-toolkit-for-intellij
./gradlew test

# Utils tests (Maven)
mvn test -f Utils/pom.xml

# Skip tests during build
./gradlew buildAll -PskipTest=true
# Or for Maven modules:
mvn install -f Utils/pom.xml -Dmaven.test.skip=true
```

### Checkstyle
Checkstyle runs by default on Maven builds. Skip with:
```bash
mvn install -f Utils/pom.xml -Dcheckstyle.skip=true
```
IntelliJ plugin checkstyle config: `PluginsAndFeatures/azure-toolkit-for-intellij/config/checkstyle/checkstyle.xml`

## Architecture

### Three-Layer Dependency Stack

1. **azure-toolkit-libs** (external repo: `azure-maven-plugins`) — Core SDK wrappers for Azure services. IDE-agnostic. Must be `mvn install`ed to local repo before building this project.

2. **Utils/** (this repo, Maven) — IDE-specific wrapper libraries (`azure-toolkit-ide-libs` and `azure-toolkit-ide-hdinsight-libs`). Each Azure service has a corresponding `azure-toolkit-ide-*-lib` module (e.g., `azure-toolkit-ide-appservice-lib`, `azure-toolkit-ide-cosmos-lib`). Built with Maven and published to local repo for the Gradle IntelliJ build to consume.

3. **PluginsAndFeatures/** (this repo) — IDE plugin implementations:
- `azure-toolkit-for-intellij/` — IntelliJ plugin (Gradle + Kotlin DSL, ~40 submodules)
- `azure-toolkit-for-eclipse/` — Eclipse plugin (Maven/Tycho)

### IntelliJ Plugin Module Structure

The IntelliJ plugin is a single composite plugin built from ~40 Gradle submodules, each declared in `settings.gradle.kts`. Key module categories:

- **`azure-intellij-plugin-lib`** — Core IntelliJ integration: UI components (AzureComboBox, AzureDialog, Tree), action framework, auth, messager, task manager, telemetry. This is the foundation module.
- **`azure-intellij-plugin-lib-java`** — Java-specific IntelliJ utilities (run configs, artifact handling).
- **`azure-intellij-plugin-base`** — Plugin entry point (`AzurePlugin` as `StartupActivity`), lifecycle management.
- **`azure-intellij-plugin-service-explorer`** — Azure Explorer tool window.
- **`azure-intellij-resource-connector-lib`** — Resource connection framework (connecting Azure resources to project modules).
- **Service modules** — One per Azure service (e.g., `azure-intellij-plugin-appservice`, `azure-intellij-plugin-cosmos`, `azure-intellij-plugin-database`, `azure-intellij-plugin-storage`, etc.)
- **`-java` suffix modules** — Java-language-specific features for that service (e.g., `azure-intellij-plugin-appservice-java`, `azure-intellij-plugin-database-java`).

### Extension Point Pattern

The plugin uses an IntelliJ extension point `com.microsoft.tooling.msservices.intellij.azure.actions` with the `IActionsContributor` interface. Each service module registers its own `ActionsContributor` implementation via its `META-INF/*.xml` descriptor. These are composed into the main `plugin.xml` using `xi:include`.

To add a new service module:
1. Create the module directory under `PluginsAndFeatures/azure-toolkit-for-intellij/`
2. Add it to `settings.gradle.kts`
3. Add an `implementation(project(":module-name"))` dependency in the root `build.gradle.kts`
4. Create a `META-INF/<module-name>.xml` descriptor
5. Include it in `src/main/resources/META-INF/plugin.xml` via `xi:include`

### Build System Details

- **Root Gradle** (`build.gradle` at repo root) — Orchestrates cross-project builds. Uses Groovy DSL with Gradle 8.8.
- **IntelliJ Gradle** (`PluginsAndFeatures/azure-toolkit-for-intellij/build.gradle.kts`) — Uses Kotlin DSL with IntelliJ Platform Gradle Plugin 2.3.0. Targets IntelliJ IDEA Ultimate for compilation. Version catalog at `gradle/libs.versions.toml`.
- **Maven** (`Utils/pom.xml`) — Builds the IDE wrapper libraries. Uses AspectJ for cross-cutting concerns (via `azure-toolkit-common-lib`).
- AspectJ weaving is used at both Maven (aspectj-maven-plugin) and Gradle (io.freefair.aspectj.post-compile-weaving) levels.

### Key Conventions

- Java 17 source/target for all modules.
- Lombok is used project-wide (`@Data`, `@Builder`, etc.).
- All Java source files require the MIT license header (enforced by checkstyle).
- LF line endings required (no CRLF).
- No tabs — spaces only.
- TODOs must be named: `TODO (name): description`.
- Base package: `com.microsoft.azure.toolkit.intellij` for IntelliJ modules, `com.microsoft.azure.toolkit.lib` for library modules.
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@ public class CveFixDependencyInProblemsViewAction extends AnAction implements Du
private static final String CVE_MARKER = "CVE-";

private VulnerabilityInfo vulnerabilityInfo;

public CveFixDependencyInProblemsViewAction() {
super();
}
Expand Down
Loading