123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188 |
- #!/bin/bash
- if [[ "$(uname)" != "Darwin" ]] ; then
- echo "This should be run on macOS"
- exit 1
- fi
- go version
- export GO111MODULE=on
- # build 'cloudflared-darwin-amd64.tgz'
- mkdir -p artifacts
- FILENAME="$(pwd)/artifacts/cloudflared-darwin-amd64.tgz"
- PKGNAME="$(pwd)/artifacts/cloudflared-amd64.pkg"
- TARGET_DIRECTORY=".build"
- BINARY_NAME="cloudflared"
- VERSION=$(git describe --tags --always --dirty="-dev")
- PRODUCT="cloudflared"
- CODE_SIGN_PRIV="code_sign.p12"
- CODE_SIGN_CERT="code_sign.cer"
- INSTALLER_PRIV="installer.p12"
- INSTALLER_CERT="installer.cer"
- BUNDLE_ID="com.cloudflare.cloudflared"
- SEC_DUP_MSG="security: SecKeychainItemImport: The specified item already exists in the keychain."
- export PATH="$PATH:/usr/local/bin"
- mkdir -p ../src/github.com/cloudflare/
- cp -r . ../src/github.com/cloudflare/cloudflared
- cd ../src/github.com/cloudflare/cloudflared
- GOCACHE="$PWD/../../../../" GOPATH="$PWD/../../../../" CGO_ENABLED=1 make cloudflared
- # Add code signing private key to the key chain
- if [[ ! -z "$CFD_CODE_SIGN_KEY" ]]; then
- if [[ ! -z "$CFD_CODE_SIGN_PASS" ]]; then
- # write private key to disk and then import it keychain
- echo -n -e ${CFD_CODE_SIGN_KEY} | base64 -D > ${CODE_SIGN_PRIV}
- out=$(security import ${CODE_SIGN_PRIV} -A -P "${CFD_CODE_SIGN_PASS}" 2>&1)
- exitcode=$?
- if [ -n "$out" ]; then
- if [ $exitcode -eq 0 ]; then
- echo "$out"
- else
- if [ "$out" != "${SEC_DUP_MSG}" ]; then
- echo "$out" >&2
- exit $exitcode
- fi
- fi
- fi
- rm ${CODE_SIGN_PRIV}
- fi
- fi
- # Add code signing certificate to the key chain
- if [[ ! -z "$CFD_CODE_SIGN_CERT" ]]; then
- # write certificate to disk and then import it keychain
- echo -n -e ${CFD_CODE_SIGN_CERT} | base64 -D > ${CODE_SIGN_CERT}
- out1=$(security import ${CODE_SIGN_CERT} -A 2>&1)
- exitcode1=$?
- if [ -n "$out1" ]; then
- if [ $exitcode1 -eq 0 ]; then
- echo "$out1"
- else
- if [ "$out1" != "${SEC_DUP_MSG}" ]; then
- echo "$out1" >&2
- exit $exitcode1
- else
- echo "already imported code signing certificate"
- fi
- fi
- fi
- rm ${CODE_SIGN_CERT}
- fi
- # Add package signing private key to the key chain
- if [[ ! -z "$CFD_INSTALLER_KEY" ]]; then
- if [[ ! -z "$CFD_INSTALLER_PASS" ]]; then
- # write private key to disk and then import it into the keychain
- echo -n -e ${CFD_INSTALLER_KEY} | base64 -D > ${INSTALLER_PRIV}
- out2=$(security import ${INSTALLER_PRIV} -A -P "${CFD_INSTALLER_PASS}" 2>&1)
- exitcode2=$?
- if [ -n "$out2" ]; then
- if [ $exitcode2 -eq 0 ]; then
- echo "$out2"
- else
- if [ "$out2" != "${SEC_DUP_MSG}" ]; then
- echo "$out2" >&2
- exit $exitcode2
- fi
- fi
- fi
- rm ${INSTALLER_PRIV}
- fi
- fi
- # Add package signing certificate to the key chain
- if [[ ! -z "$CFD_INSTALLER_CERT" ]]; then
- # write certificate to disk and then import it keychain
- echo -n -e ${CFD_INSTALLER_CERT} | base64 -D > ${INSTALLER_CERT}
- out3=$(security import ${INSTALLER_CERT} -A 2>&1)
- exitcode3=$?
- if [ -n "$out3" ]; then
- if [ $exitcode3 -eq 0 ]; then
- echo "$out3"
- else
- if [ "$out3" != "${SEC_DUP_MSG}" ]; then
- echo "$out3" >&2
- exit $exitcode3
- else
- echo "already imported installer certificate"
- fi
- fi
- fi
- rm ${INSTALLER_CERT}
- fi
- # get the code signing certificate name
- if [[ ! -z "$CFD_CODE_SIGN_NAME" ]]; then
- CODE_SIGN_NAME="${CFD_CODE_SIGN_NAME}"
- else
- if [[ -n "$(security find-certificate -c "Developer ID Application" | cut -d'"' -f 4 -s | grep "Developer ID Application:" | head -1)" ]]; then
- CODE_SIGN_NAME=$(security find-certificate -c "Developer ID Application" | cut -d'"' -f 4 -s | grep "Developer ID Application:" | head -1)
- else
- CODE_SIGN_NAME=""
- fi
- fi
- # get the package signing certificate name
- if [[ ! -z "$CFD_INSTALLER_NAME" ]]; then
- PKG_SIGN_NAME="${CFD_INSTALLER_NAME}"
- else
- if [[ -n "$(security find-certificate -c "Developer ID Installer" | cut -d'"' -f 4 -s | grep "Developer ID Installer:" | head -1)" ]]; then
- PKG_SIGN_NAME=$(security find-certificate -c "Developer ID Installer" | cut -d'"' -f 4 -s | grep "Developer ID Installer:" | head -1)
- else
- PKG_SIGN_NAME=""
- fi
- fi
- # sign the cloudflared binary
- if [[ ! -z "$CODE_SIGN_NAME" ]]; then
- codesign -s "${CODE_SIGN_NAME}" -f -v --timestamp --options runtime ${BINARY_NAME}
-
- # notarize the binary
- if [[ ! -z "$CFD_NOTE_PASSWORD" ]]; then
- zip "${BINARY_NAME}.zip" ${BINARY_NAME}
- xcrun altool --notarize-app -f "${BINARY_NAME}.zip" -t osx -u ${CFD_NOTE_USERNAME} -p ${CFD_NOTE_PASSWORD} --primary-bundle-id ${BUNDLE_ID}
- fi
- fi
- # creating build directory
- rm -rf $TARGET_DIRECTORY
- mkdir "${TARGET_DIRECTORY}"
- mkdir "${TARGET_DIRECTORY}/contents"
- cp -r ".mac_resources/scripts" "${TARGET_DIRECTORY}/scripts"
- # copy cloudflared into the build directory
- cp ${BINARY_NAME} "${TARGET_DIRECTORY}/contents/${PRODUCT}"
- # compress cloudflared into a tar and gzipped file
- tar czf "$FILENAME" "${BINARY_NAME}"
- # build the installer package
- if [[ ! -z "$PKG_SIGN_NAME" ]]; then
- pkgbuild --identifier com.cloudflare.${PRODUCT} \
- --version ${VERSION} \
- --scripts ${TARGET_DIRECTORY}/scripts \
- --root ${TARGET_DIRECTORY}/contents \
- --install-location /usr/local/bin \
- --sign "${PKG_SIGN_NAME}" \
- ${PKGNAME}
- # notarize the package
- if [[ ! -z "$CFD_NOTE_PASSWORD" ]]; then
- xcrun altool --notarize-app -f ${PKGNAME} -t osx -u ${CFD_NOTE_USERNAME} -p ${CFD_NOTE_PASSWORD} --primary-bundle-id ${BUNDLE_ID}
- xcrun stapler staple ${PKGNAME}
- fi
- else
- pkgbuild --identifier com.cloudflare.${PRODUCT} \
- --version ${VERSION} \
- --scripts ${TARGET_DIRECTORY}/scripts \
- --root ${TARGET_DIRECTORY}/contents \
- --install-location /usr/local/bin \
- ${PKGNAME}
- fi
- # cleaning up the build directory
- rm -rf $TARGET_DIRECTORY
|