This is because when you include a $ in your yaml it needs to be escaped:
You can use a $$ (double-dollar sign) when your configuration needs a literal dollar sign. This prevents Drone from interpolating a value, so a $$ allows you to refer to environment variables that you don’t want processed by Drone.
======CMD======
date -R
echo ${MAC_USER}/${MAC_PASSWORD}
bash -lc 'security unlock-keychain -p ******** login.keychain'
bash -lc 'security unlock-keychain -p ${MAC_PASSWORD} login.keychain'
date -R
======END======
out: Mon, 03 Dec 2018 09:49:29 +0800
out: ********/********
out: Mon, 03 Dec 2018 09:49:29 +0800
err: security: SecKeychainUnlock <NULL>: The user name or passphrase you entered is not correct.
==========================================
Successfully executed commands to all host.
==========================================
This is a problem with your bash scripting. You are using single-quotes in your script. When you use single quotes, it is a string literal, and your environment variables will not be expanded.
Also, if I understand your post correctly, you are also trying to run this from command line with drone exec (if I misunderstood, you can ignore this). When you run your pipeline locally you need to pass your secrets to drone exec. The drone exec command does not have any access to secrets stored in the drone server.