How to transfer proxy admin ownership to a custom multisig wallet contract and upgrade proxy via a multisig?

Thanks @ericglau,

When I try to prepare my upgrade in local development network, there seems to be no deployment of the new implementation contract. When I then call the upgrade function using my multisig contract I receive an error message that the implementation contract hasn't been deployed.

3_prepare_contract_upgrade.ts:

import { prepareUpgrade } from '@openzeppelin/truffle-upgrades';
import { Network } from './types';

module.exports = (artifacts: Truffle.Artifacts) => {
    return async (deployer: Truffle.Deployer, network: Network, accounts: string[]) => {
        const TokenUpgradeable = artifacts.require('TokenUpgradeable');
        const TokenUpgradeableTest = artifacts.require('TokenUpgradeableTest');
        const TokenUpgradeableInstance = await TokenUpgradeable.deployed();
        await prepareUpgrade(TokenUpgradeableInstance.address, TokenUpgradeableTest as any, { deployer: deployer as any });
    };
};

4_upgrade_token_contract.ts:

import { admin } from '@openzeppelin/truffle-upgrades';
import { Network } from './types';
import { getTxIdFromMultiSigWallet } from '../test/lib/test-helpers';

module.exports = (artifacts: Truffle.Artifacts) => {
    return async (deployer: Truffle.Deployer, network: Network, accounts: string[]) => {
        const TokenUpgradeableTest = artifacts.require('TokenUpgradeableTest');
        const TokenUpgradeableTestInstance = await TokenUpgradeableTest.deployed();
        console.log(`TokenUpgradeableTestInstance address: ${TokenUpgradeableTestInstance.address}`);

        const MultiSigWallet = artifacts.require('MultiSigWallet');
        const multiSigWalletInstance = await MultiSigWallet.deployed();
        const adminInstance = await admin.getInstance();
        const data = await adminInstance.contract.methods.upgrade(TokenUpgradeableTestInstance.address).encodeABI();
        await multiSigWalletInstance.submitTransaction(adminInstance.address, 0, data, { from: accounts[0] });
        const txId = await getTxIdFromMultiSigWallet(multiSigWalletInstance);
        await multiSigWalletInstance.confirmTransaction(txId, { from: accounts[1] });
        console.log('Upgraded admin');
    };
};

I can however log out the output of prepareUpgrade and I'm given an address. What's confusing is that in the Truffle migrations log there is 0 gas spent and no information about any deployment of the new implementation contract.

Why am I getting conflicting information and how best to proceed?