EcoAssist v5.28 #10
Workflow file for this run
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Build macOS release | |
on: | |
workflow_dispatch: | |
release: | |
types: | |
- published | |
jobs: | |
build-macos-release: | |
runs-on: macos-15 | |
env: | |
RELEASE_VERSION: ${{ github.event.release.tag_name }} | |
BUCKET_NAME: github-release-files-storage | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v3 | |
# - name: Debug dependencies | |
# run: | | |
# root="$HOME/EcoAssist" | |
# mkdir -p "${root}" | |
# git clone --ipv4 --depth 1 https://github.com/PetervanLunteren/visualise_detection.git "${root}/visualise_detection" | |
- name: Install Miniconda | |
run: | | |
mkdir "$HOME/miniforge" | |
curl --ipv4 -L "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-MacOSX-arm64.sh" -o miniforge.sh | |
bash miniforge.sh -b -u -p "$HOME/miniforge" | |
echo "succesfully installed at $HOME/miniforge" | |
- name: Install dependencies | |
run: | | |
### refresh root | |
root="$HOME/EcoAssist_files" | |
if [ -d "${root}" ]; then | |
rm -rf "${root}" | |
echo "$root folder removed" | |
else | |
echo "$root folder does not exist" | |
fi | |
### set ipv4 settings | |
export PIP_NO_IPV6=1 | |
export CONDA_SSL_VERIFY=0 | |
export CONDA_USE_IPV4=1 | |
### create folder structure | |
mkdir -p "${root}" | |
mkdir -p "${root}/envs" | |
mkdir -p "${root}/models" | |
mkdir -p "${root}/models/det" | |
mkdir -p "${root}/models/cls" | |
mkdir -p "${root}/models/det/MegaDetector 5a" | |
mkdir -p "${root}/yolov5_versions/yolov5_old" | |
mkdir -p "${root}/yolov5_versions/yolov5_new" | |
echo "Hello world!" >> "${root}/first-startup.txt" | |
## clone repositories | |
git clone --ipv4 --depth 1 https://github.com/PetervanLunteren/EcoAssist-experiments.git "${root}/EcoAssist" | |
rm -rf "${root}/EcoAssist/.git" | |
mv "${root}/EcoAssist/main.py" "${root}/main.py" | |
RAW_VERSION=${{ env.RELEASE_VERSION }} | |
CLEAN_VERSION="${RAW_VERSION#v}" | |
echo "$CLEAN_VERSION" > "${root}/EcoAssist/version.txt" | |
echo "EcoAssist cloned" | |
git clone --ipv4 https://github.com/agentmorris/MegaDetector.git "${root}/MegaDetector" | |
git -C "${root}/MegaDetector" checkout e8a4fc19a2b9ad1892dd9ce65d437252df271576 | |
rm -rf "${root}/MegaDetector/.git" | |
mv "${root}/MegaDetector" "${root}/cameratraps" | |
echo "MegaDetector cloned" | |
git clone --ipv4 https://github.com/ultralytics/yolov5.git "${root}/yolov5_versions/yolov5_old/yolov5" | |
git -C "${root}/yolov5_versions/yolov5_old/yolov5" checkout 868c0e9bbb45b031e7bfd73c6d3983bcce07b9c1 | |
rm -rf "${root}/yolov5_versions/yolov5_old/yolov5/.git" | |
echo "yolov5 old version cloned" | |
git clone --ipv4 https://github.com/ultralytics/yolov5.git "${root}/yolov5_versions/yolov5_new/yolov5" | |
git -C "${root}/yolov5_versions/yolov5_new/yolov5" checkout 3e55763d45f9c5f8217e4dad5ba1e6c1f42e3bf8 | |
rm -rf "${root}/yolov5_versions/yolov5_new/yolov5/.git" | |
echo "yolov5 new version cloned" | |
git clone --ipv4 --branch pyside6 --depth 1 https://github.com/PetervanLunteren/Human-in-the-loop.git "${root}/Human-in-the-loop" | |
rm -rf "${root}/Human-in-the-loop/.git" | |
echo "Human-in-the-loop cloned" | |
git clone --ipv4 --depth 1 https://github.com/PetervanLunteren/visualise_detection.git "${root}/visualise_detection" | |
rm -rf "${root}/visualise_detection/.git" | |
echo "visualise_detection cloned" | |
### download megadetector | |
curl --ipv4 -L https://github.com/agentmorris/MegaDetector/releases/download/v5.0/md_v5a.0.0.pt -o "${root}/models/det/MegaDetector 5a/md_v5a.0.0.pt" | |
### source conda | |
source "$HOME/miniforge/etc/profile.d/conda.sh" | |
source "$HOME/miniforge/bin/activate" | |
conda_exe="$HOME/miniforge/bin/conda" | |
### set high timeout value and ip address for ipv4 fallback issues | |
$conda_exe config --set remote_connect_timeout_secs 120 | |
$conda_exe config --set remote_max_retries 5 | |
$conda_exe config --set remote_read_timeout_secs 120 | |
$conda_exe config --set ssl_verify False | |
$conda_exe config --set fetch_threads 2 | |
$conda_exe config --show | |
### install mamba | |
$conda_exe install mamba -n base -c conda-forge -y | |
conda_exe="$HOME/miniforge/bin/mamba" | |
### install env-base | |
$conda_exe env create --file="${root}/cameratraps/envs/environment-detector-m1.yml" -p "${root}/envs/env-base" | |
$conda_exe run -p "${root}/envs/env-base" conda install pytorch==1.13.1 torchvision==0.14.1 -c pytorch -y | |
$conda_exe run -p "${root}/envs/env-base" conda uninstall opencv -y | |
$conda_exe run -p "${root}/envs/env-base" pip install --timeout=120 opencv-python | |
$conda_exe run -p "${root}/envs/env-base" pip install --timeout=120 RangeSlider | |
$conda_exe run -p "${root}/envs/env-base" pip install --timeout=120 gpsphoto | |
$conda_exe run -p "${root}/envs/env-base" pip install --timeout=120 exifread | |
$conda_exe run -p "${root}/envs/env-base" pip install --timeout=120 piexif | |
$conda_exe run -p "${root}/envs/env-base" pip install --timeout=120 openpyxl | |
$conda_exe run -p "${root}/envs/env-base" pip install --timeout=120 customtkinter | |
$conda_exe run -p "${root}/envs/env-base" pip install --timeout=120 CTkTable | |
$conda_exe run -p "${root}/envs/env-base" pip install --timeout=120 folium | |
$conda_exe run -p "${root}/envs/env-base" pip install --timeout=120 plotly | |
$conda_exe run -p "${root}/envs/env-base" pip install --timeout=120 "gitpython>=3.1.30" | |
$conda_exe run -p "${root}/envs/env-base" pip install --timeout=120 "tensorboard>=2.4.1" | |
$conda_exe run -p "${root}/envs/env-base" pip install --timeout=120 "thop>=0.1.1" | |
$conda_exe run -p "${root}/envs/env-base" pip install --timeout=120 "protobuf<=3.20.1" | |
$conda_exe run -p "${root}/envs/env-base" pip install --timeout=120 "setuptools>=65.5.1" | |
$conda_exe run -p "${root}/envs/env-base" pip install --timeout=120 PySide6 | |
$conda_exe run -p "${root}/envs/env-base" conda install lxml -y | |
"${root}/envs/env-base/bin/pyside6-rcc" -o "${root}/Human-in-the-loop/libs/resources.py" "${root}/Human-in-the-loop/resources.qrc" | |
### install env-tensorflow | |
$conda_exe env create --file="${root}/EcoAssist/classification_utils/envs/tensorflow-macos-silicon.yml" -p "${root}/envs/env-tensorflow" | |
### install env-pytorch | |
$conda_exe create -p "${root}/envs/env-pytorch" python=3.8 -y | |
$conda_exe run -p "${root}/envs/env-pytorch" pip install --timeout=120 torch==2.0.1 torchvision==0.15.2 | |
$conda_exe run -p "${root}/envs/env-pytorch" pip install --timeout=120 "ultralytics==8.0.191" | |
$conda_exe run -p "${root}/envs/env-pytorch" pip install --timeout=120 "numpy==1.24.1" | |
$conda_exe run -p "${root}/envs/env-pytorch" pip install --timeout=120 "humanfriendly==10.0" | |
$conda_exe run -p "${root}/envs/env-pytorch" pip install --timeout=120 "jsonpickle==3.0.2" | |
$conda_exe run -p "${root}/envs/env-pytorch" pip install --timeout=120 timm | |
$conda_exe run -p "${root}/envs/env-pytorch" pip install --timeout=120 dill | |
### install env-pywildlife | |
$conda_exe create -p "${root}/envs/env-pywildlife" python=3.8 -y | |
$conda_exe run -p "${root}/envs/env-pywildlife" pip install --timeout=120 pytorchwildlife | |
$conda_exe run -p "${root}/envs/env-pywildlife" pip install --timeout=120 "setuptools<70" | |
$conda_exe run -p "${root}/envs/env-pywildlife" pip install --timeout=120 jsonpickle | |
### run pyinstaller from fresh environment | |
$conda_exe create -p "$HOME/miniforge/envs/env-fresh" python=3.8 pyinstaller -y | |
$conda_exe run -p "$HOME/miniforge/envs/env-fresh" pyinstaller --onefile --windowed --icon="${root}/EcoAssist/imgs/logo_small_bg.icns" --distpath="${HOME}/dist" --workpath="${HOME}/build" "${root}/main.py" | |
### clean | |
$conda_exe clean --all --yes --force-pkgs-dirs | |
$conda_exe clean --all --yes | |
### move and rename executables | |
# cp "${HOME}/dist/main" "${root}/EcoAssist ${RELEASE_VERSION} installer" # installer executable | |
mv "${HOME}/dist/main" "${root}/EcoAssist ${RELEASE_VERSION} debug" # debug executable | |
mv "${HOME}/dist/main.app" "${root}/EcoAssist ${RELEASE_VERSION}.app" # main app executable | |
- name: Zip folder contents | |
run: | | |
cd "$HOME" | |
tar -caf "macos-${{ env.RELEASE_VERSION }}.tar.xz" EcoAssist_files | |
# - name: Upload files to Google Cloud | |
# run: | | |
# cd "$HOME" | |
# # init vars | |
# BUCKET_NAME="${{ env.BUCKET_NAME }}" | |
# PINNED_FOLDER_NAME="${{ env.RELEASE_VERSION }}" | |
# LATEST_FOLDER_NAME="latest" | |
# PINNED_FILE_NAME="macos-${{ env.RELEASE_VERSION }}.tar.xz" | |
# LATEST_FILE_NAME="macos-latest.tar.xz" | |
# # upload release pinned version | |
# gsutil cp -r $PINNED_FILE_NAME gs://$BUCKET_NAME/$PINNED_FOLDER_NAME/$PINNED_FILE_NAME | |
# - name: Get the release body | |
# id: get_release | |
# run: | | |
# release=$(gh release view ${{ github.ref_name }} --json body -q .body) | |
# echo "$release" > release_body.txt | |
# - name: Append link to release body | |
# id: append_link | |
# run: | | |
# new_body="$(cat release_body.txt) | |
# - Install for **macOS** (Apple Silicon - M1, M2, M3, etc.): [macos-${{ env.RELEASE_VERSION }}.tar.xz](https://storage.googleapis.com/${{ env.BUCKET_NAME }}/${{ env.RELEASE_VERSION }}/macos-${{ env.RELEASE_VERSION }}.tar.xz)" | |
# echo "$new_body" > new_release_body.txt | |
# - name: Update the release body | |
# run: | | |
# gh release edit ${{ github.ref_name }} --notes "$(cat new_release_body.txt)" | |
- name: Install Platypus | |
run: | | |
# copy files into the right directory | |
sudo mkdir -p '/usr/local/share/platypus/' | |
sudo cp "${{ github.workspace }}/install_files/macos/ScriptExec" '/usr/local/share/platypus/' | |
sudo cp "${{ github.workspace }}/install_files/macos/platypus_clt" '/usr/local/share/platypus/' | |
sudo cp -r "${{ github.workspace }}/install_files/macos/MainMenu.nib" '/usr/local/share/platypus/' | |
# make executable | |
sudo chmod +x '/usr/local/share/platypus/ScriptExec' | |
sudo chmod +x '/usr/local/share/platypus/platypus_clt' | |
- name: Append VERSION to Platypus Installer Script | |
shell: bash | |
run: | | |
# Define the file path | |
FILE_PATH="${{ github.workspace }}/install_files/macos/platypus-install-compiler.sh" | |
# Create a new file with the VERSION line | |
echo "VERSION=\"${{ env.RELEASE_VERSION }}\"" > newFile.sh | |
# Append the original file's content | |
cat "$FILE_PATH" >> newFile.sh | |
# Replace the original file with the new file | |
mv newFile.sh "$FILE_PATH" | |
- name: Create Installer | |
run: | | |
sudo '/usr/local/share/platypus/platypus_clt' --app-icon '${{ github.workspace }}/install_files/macos/logo.icns' --name 'EcoAssist-${{ env.RELEASE_VERSION }}-installer' --interface-type 'Progress Bar' --interpreter '/bin/bash' --app-version '${{ env.RELEASE_VERSION }}' '${{ github.workspace }}/install_files/macos/platypus-install-compiler.sh' | |
- name: Compress the macOS installer | |
run: | | |
cd "${{ github.workspace }}/install_files/macos" | |
zip -r "EcoAssist-${{ env.RELEASE_VERSION }}-installer.zip" "EcoAssist-${{ env.RELEASE_VERSION }}-installer.app" | |
- name: Get Upload URL for Release | |
id: get_upload_url | |
uses: actions/github-script@v6 | |
with: | |
script: | | |
const release = await github.rest.repos.getReleaseByTag({ | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
tag: '${{ env.RELEASE_VERSION }}', | |
}); | |
// Write the upload URL to the environment file | |
const fs = require('fs'); | |
fs.appendFileSync(process.env.GITHUB_ENV, `UPLOAD_URL=${release.data.upload_url}\n`); | |
- name: Authenticate GitHub CLI | |
run: echo "${{ secrets.GITHUB_TOKEN }}" | gh auth login --with-token | |
- name: Upload Asset to GitHub Release | |
uses: actions/upload-release-asset@v1 | |
with: | |
upload_url: ${{ env.UPLOAD_URL }} | |
asset_path: "${{ github.workspace }}/install_files/macos/EcoAssist-${{ env.RELEASE_VERSION }}-installer.zip" | |
asset_name: "MacOS-installer-${{ env.RELEASE_VERSION }}.zip" | |
asset_content_type: application/octet-stream | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
- name: Authenticate with Google Cloud | |
uses: google-github-actions/auth@v1 | |
with: | |
credentials_json: ${{ secrets.GOOGLE_STORAGE_UPLOAD_KEY }} | |
- name: Set up Google Cloud | |
uses: google-github-actions/setup-gcloud@v1 | |
with: | |
project_id: github-file-storage | |
- name: Upload program files to Google Cloud | |
run: | | |
cd "$HOME" | |
# init vars | |
BUCKET_NAME="${{ env.BUCKET_NAME }}" | |
PINNED_FOLDER_NAME="${{ env.RELEASE_VERSION }}" | |
LATEST_FOLDER_NAME="latest" | |
PINNED_FILE_NAME="macos-${{ env.RELEASE_VERSION }}.tar.xz" | |
LATEST_FILE_NAME="macos-latest.tar.xz" | |
# upload release pinned version | |
gsutil cp -r $PINNED_FILE_NAME gs://$BUCKET_NAME/$PINNED_FOLDER_NAME/$PINNED_FILE_NAME | |
# upload latest release version | |
gsutil cp -r $PINNED_FILE_NAME gs://$BUCKET_NAME/$LATEST_FOLDER_NAME/$LATEST_FILE_NAME | |
- name: Upload installer to Google Cloud | |
run: | | |
cd "${{ github.workspace }}/install_files/macos/" | |
INSTALLER="EcoAssist-${{ env.RELEASE_VERSION }}-installer.zip" | |
gsutil cp -r $INSTALLER gs://${{ env.BUCKET_NAME }}/latest/EcoAssist-latest-installer.zip |