Salesforce 移行ツールによるメタデータ取得

:::note alert
Ant 移行ツールは Spring '24 で廃止されました。
代わりにSalesforceCLIを使用することができます。

- [Ant 移行ツールの有効期限](https://help.salesforce.com/s/articleView?id=release-notes.rn_deployment_ant_migration_tool_eol.htm&release=248&type=5)
- [Salesforce CLI](https://developer.salesforce.com/ja/tools/salesforcecli)
:::

## 移行ツールの導入
インストールは [Ant 移行ツールガイド（Salesforce開発者ドキュメント）
](https://developer.salesforce.com/docs/atlas.ja-jp.daas.meta/daas/forcemigrationtool_container_install.htm) を参照。
sampleフォルダをコピーし、各ファイルを編集して使用します。
build.xmlの入ったフォルダはant-salesforce.jarと同じディレクトリに格納する必要があります。

## 各ファイルの説明
* build.xml : Ant で実行される一連のコマンドを定義。
* build.properties : Salesforce の接続情報を設定。
* package.xml : 1 回の要求で取得またはリリースするコンポーネントを指定。

## 準備

sampleフォルダをコピペして以下の様に各ファイルを配置。

```
salesforce_ant_43.0
├── ant-salesforce.jar
├── Readme.html
└── sample
    ├── build.properties
    ├── build.xml
    └── retrieveallpkg
        └── package.xml
```

build.xml を編集。↓ 編集例。

```xml:build.xml
<project name="Sample usage of Salesforce Ant tasks" default="test" basedir="." xmlns:sf="antlib:com.salesforce">

    <property file="build.properties"/>
    <property environment="env"/>

    <tstamp prefix="Datetime">
        <format property="now" pattern="yyyyMMdd_HHmm" locale="en" />
    </tstamp>

    <condition property="sf.username" value=""> <not> <isset property="sf.username"/> </not> </condition>
    <condition property="sf.password" value=""> <not> <isset property="sf.password"/> </not> </condition>
    <condition property="sf.sessionId" value=""> <not> <isset property="sf.sessionId"/> </not> </condition>

    <taskdef resource="com/salesforce/antlib.xml" uri="antlib:com.salesforce">
        <classpath>
            <pathelement location="../ant-salesforce.jar" />
        </classpath>
    </taskdef>

    <!-- メタデータの取得 -->
    <target name="retrieveall">
      <mkdir dir="${sf.username}_${Datetime.now}"/>
      <sf:retrieve
          username="${sf.username}"
          password="${sf.password}"
          sessionId="${sf.sessionId}"
          serverurl="${sf.serverurl}"
          maxPoll="${sf.maxPoll}"
          retrieveTarget="${sf.username}_${Datetime.now}"
          unpackaged="retrieveallpkg/package.xml"/>
    </target>

    <!-- メタデータタイプ一覧の取得 -->
    <target name="describeMetadata">
      <sf:describeMetadata username="${sf.username}" password="${sf.password}" sessionId="${sf.sessionId}" serverurl="${sf.serverurl}"/>
    </target>
</project>
```
package.xml の編集。取得するメタデータを指定する。持ってこれるメタデータの一覧は `ant describeMetadata` で取得可能。
※標準オブジェクト、メールテンプレートなどは個別に指定しないと取得できないため、注意。
↓ 編集例。

```xml:retrieveallpkg/package.xml
<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">

    <!-- メタデータ取得用package.xml -->
    <types><members>*</members><name>InstalledPackage</name></types>
    <types><members>*</members><name>CustomLabels</name></types>
    <types><members>*</members><name>StaticResource</name></types>
    <types><members>*</members><name>Scontrol</name></types>
    <types><members>*</members><name>Certificate</name></types>
    <types><members>*</members><name>AuraDefinitionBundle</name></types>
    <types><members>*</members><name>LightningComponentBundle</name></types>
    <types><members>*</members><name>ApexComponent</name></types>
    <types><members>*</members><name>ApexPage</name></types>
    <types><members>*</members><name>Queue</name></types>
    <types><members>*</members><name>CaseSubjectParticle</name></types>
    <types><members>*</members><name>ExternalDataSource</name></types>
    <types><members>*</members><name>NamedCredential</name></types>
    <types><members>*</members><name>ExternalServiceRegistration</name></types>
    <types><members>*</members><name>Role</name></types>
    <types><members>*</members><name>Group</name></types>
    <types><members>*</members><name>GlobalValueSet</name></types>
    <types><members>*</members><name>StandardValueSet</name></types>
    <types><members>*</members><name>CustomPermission</name></types>
    <types><members>*</members><name>CustomObject</name></types>
    <types><members>*</members><name>ReportType</name></types>
    <types><members>*</members><name>Report</name></types>
    <types><members>*</members><name>Dashboard</name></types>
    <types><members>*</members><name>AnalyticSnapshot</name></types>
    <types><members>*</members><name>Layout</name></types>
    <types><members>*</members><name>Document</name></types>
    <types><members>*</members><name>CustomPageWebLink</name></types>
    <types><members>*</members><name>Letterhead</name></types>
    <types><members>*</members><name>EmailTemplate</name></types>
    <types><members>*</members><name>QuickAction</name></types>
    <types><members>*</members><name>FlexiPage</name></types>
    <types><members>*</members><name>CustomTab</name></types>
    <types><members>*</members><name>CustomApplicationComponent</name></types>
    <types><members>*</members><name>CustomApplication</name></types>
    <types><members>*</members><name>EmbeddedServiceConfig</name></types>
    <types><members>*</members><name>EmbeddedServiceBranding</name></types>
    <types><members>*</members><name>Flow</name></types>
    <types><members>*</members><name>FlowDefinition</name></types>
    <types><members>*</members><name>EventSubscription</name></types>
    <types><members>*</members><name>EventDelivery</name></types>
    <types><members>*</members><name>Workflow</name></types>
    <types><members>*</members><name>AssignmentRules</name></types>
    <types><members>*</members><name>AutoResponseRules</name></types>
    <types><members>*</members><name>EscalationRules</name></types>
    <types><members>*</members><name>ApprovalProcess</name></types>
    <types><members>*</members><name>HomePageComponent</name></types>
    <types><members>*</members><name>HomePageLayout</name></types>
    <types><members>*</members><name>CustomObjectTranslation</name></types>
    <types><members>*</members><name>GlobalValueSetTranslation</name></types>
    <types><members>*</members><name>StandardValueSetTranslation</name></types>
    <types><members>*</members><name>ApexClass</name></types>
    <types><members>*</members><name>ApexTrigger</name></types>
    <types><members>*</members><name>ApexTestSuite</name></types>
    <types><members>*</members><name>Profile</name></types>
    <types><members>*</members><name>PermissionSet</name></types>
    <types><members>*</members><name>CustomMetadata</name></types>
    <types><members>*</members><name>ProfilePasswordPolicy</name></types>
    <types><members>*</members><name>ProfileSessionSetting</name></types>
    <types><members>*</members><name>DataCategoryGroup</name></types>
    <types><members>*</members><name>RemoteSiteSetting</name></types>
    <types><members>*</members><name>CspTrustedSite</name></types>
    <types><members>*</members><name>MatchingRules</name></types>
    <types><members>*</members><name>DuplicateRule</name></types>
    <types><members>*</members><name>CleanDataService</name></types>
    <types><members>*</members><name>WaveApplication</name></types>
    <types><members>*</members><name>WaveDataset</name></types>
    <types><members>*</members><name>EclairGeoData</name></types>
    <types><members>*</members><name>WaveLens</name></types>
    <types><members>*</members><name>WaveDashboard</name></types>
    <types><members>*</members><name>WaveXmd</name></types>
    <types><members>*</members><name>WaveDataflow</name></types>
    <types><members>*</members><name>WaveRecipe</name></types>
    <types><members>*</members><name>CustomSite</name></types>
    <types><members>*</members><name>ChannelLayout</name></types>
    <types><members>*</members><name>ContentAsset</name></types>
    <types><members>*</members><name>SharingRules</name></types>
    <types><members>*</members><name>Community</name></types>
    <types><members>*</members><name>ChatterExtension</name></types>
    <types><members>*</members><name>CallCenter</name></types>
    <types><members>*</members><name>ConnectedApp</name></types>
    <types><members>*</members><name>AppMenu</name></types>
    <types><members>*</members><name>DelegateGroup</name></types>
    <types><members>*</members><name>SiteDotCom</name></types>
    <types><members>*</members><name>NetworkBranding</name></types>
    <types><members>*</members><name>BrandingSet</name></types>
    <types><members>*</members><name>FlowCategory</name></types>
    <types><members>*</members><name>LightningBolt</name></types>
    <types><members>*</members><name>LightningExperienceTheme</name></types>
    <types><members>*</members><name>SamlSsoConfig</name></types>
    <types><members>*</members><name>CorsWhitelistOrigin</name></types>
    <types><members>*</members><name>ActionLinkGroupTemplate</name></types>
    <types><members>*</members><name>TransactionSecurityPolicy</name></types>
    <types><members>*</members><name>SynonymDictionary</name></types>
    <types><members>*</members><name>PathAssistant</name></types>
    <types><members>*</members><name>LeadConvertSettings</name></types>
    <types><members>*</members><name>PlatformCachePartition</name></types>
    <types><members>*</members><name>TopicsForObjects</name></types>
    <types><members>*</members><name>EmailServicesFunction</name></types>
    <types><members>*</members><name>Settings</name></types>

    <version>43.0</version>
</Package>
```

### 使用方法
1. build.properties に Salesforce ユーザ名とパスワードを設定。
2. コンソールで build.xml のあるディレクトリに移動する。
3. `ant retrieveall` を実行する。
4. build.xml があるディレクトリに、フォルダ `ユーザ名_yyyyMMdd_HHmm` が作成され、package.xml で指定したメタデータが取得される。