variables: BUILD_DIR: "/data/openpilot" OUTPUT_DIR: "${CI_PROJECT_DIR}/output" CI_DIR: "${CI_PROJECT_DIR}/release/ci" VERSION: 'echo $(date "+%Y.%m.%d")' GIT_SUBMODULE_STRATEGY: recursive GIT_DISCOVERY_ACROSS_FILESYSTEM: 1 DEV_C3_SOURCE_BRANCH: "master-dev-c3" GIT_CONFIG_USER_EMAIL: "gitlab@pipeline.com" GIT_CONFIG_USER_NAME: "Gitlab Pipeline" PUBLIC_REPO_URL: "https://github.com/sunnyhaibin/sunnypilot" BASE_BUILD_NUMER: 3000 EXTRA_VERSION_IDENTIFIER: "${CI_PIPELINE_IID}" NEW_BRANCH: ${CI_COMMIT_REF_NAME}-prebuilt stages: - build - sanity - publish - notify default: retry: 2 tags: - sunnypilot - x86 .default_before_script: &default_before_script - 'if [ "$EXTRA_VERSION_IDENTIFIER" = "$CI_PIPELINE_IID" ]; then export EXTRA_VERSION_IDENTIFIER=$((CI_PIPELINE_IID + BASE_BUILD_NUMER)); fi' - 'export VERSION=$(eval $VERSION)-${EXTRA_VERSION_IDENTIFIER}' - 'mkdir -p "${BUILD_DIR}/"' - 'git config --global user.email "${GIT_CONFIG_USER_EMAIL}"' - 'git config --global user.name "${GIT_CONFIG_USER_NAME}"' workflow: # If running on any branch other than main. rules: # We are an MR, but it's a draft, we won't proceed with anything. - if: '$CI_MERGE_REQUEST_TITLE =~ /^wip:/i || $CI_MERGE_REQUEST_TITLE =~ /^draft:/i' when: never # Below are the rules when a commit is done (code has been added to the branch) # Commit to master-dev-c3 - if: $CI_COMMIT_REF_NAME == $DEV_C3_SOURCE_BRANCH variables: EXTRA_VERSION_IDENTIFIER: "${CI_PIPELINE_IID}" NEW_BRANCH: "dev-c3" AUTO_BUILD: true when: always #commit made to main (master) - if: $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH variables: NEW_BRANCH: "staging-c3" VERSION: 'cat common/version.h | grep COMMA_VERSION | sed -e "s/[^0-9|.]//g"' EXTRA_VERSION_IDENTIFIER: "staging" AUTO_PUBLISH: true AUTO_BUILD: true when: always # if tag - if: $CI_COMMIT_TAG variables: NEW_BRANCH: "release-c3" VERSION: 'cat common/version.h | grep COMMA_VERSION | sed -e "s/[^0-9|.]//g"' EXTRA_VERSION_IDENTIFIER: "release" AUTO_BUILD: true - when: always build: stage: build cache: key: "${CI_COMMIT_REF_SLUG}" paths: - "${CI_DIR}/scons_cache" before_script: - find $BUILD_DIR/ -mindepth 1 -delete - *default_before_script - "echo Starting build stage..." - "echo BUILD_DIR: ${BUILD_DIR}" - "echo CI_DIR: ${CI_DIR}" - "echo VERSION: ${VERSION}" - "echo CI_COMMIT_REF_NAME: ${CI_COMMIT_REF_NAME}" - git config --global --add safe.directory ${CI_PROJECT_DIR} script: - export PYTHONPATH="$BUILD_DIR" - "echo Building Panda..." - scons -j$(nproc) cache_dir=${CI_DIR}/scons_cache ${CI_PROJECT_DIR}/panda - mkdir -p ${BUILD_DIR} - ls -la ${BUILD_DIR} - "echo Building Rest..." - ./release/release_files.py | sort | uniq | rsync -vrRl --files-from=- . $BUILD_DIR/ # - cp -pR --parents $(cat release/files_common release/files_tici | sort | uniq) $BUILD_DIR/ 2> >(grep -v 'warning:' >&2) - cd $BUILD_DIR - sed -i '/from .board.jungle import PandaJungle, PandaJungleDFU/s/^/#/' panda/__init__.py # comment panda jungle when prebuilt - scons -j$(nproc) cache_dir=${CI_DIR}/scons_cache --minimal - touch ${BUILD_DIR}/prebuilt - sudo rm -rf ${OUTPUT_DIR} - mkdir -p ${OUTPUT_DIR} # We first include the paths we want to keep, even if we later will be excluding the other things on those paths - rsync -avm --include='**/panda/board/' --include='**/panda/board/obj' --include='**/panda/board/obj/panda.bin.signed' --include='**/panda/board/obj/panda_h7.bin.signed' --include='**/panda/board/obj/bootstub.panda.bin' --include='**/panda/board/obj/bootstub.panda_h7.bin' --exclude='.sconsign.dblite' --exclude='*.a' --exclude='*.A' --exclude='*.o' --exclude='*.O' --exclude='*.os' --exclude='*.OS' --exclude='*.pyc' --exclude='*.PYC' --exclude='moc_*' --exclude='MOC_*' --exclude='*.cc' --exclude='*.CC' --exclude='Jenkinsfile' --exclude='supercombo.onnx' --exclude='**/panda/board/*' --exclude='**/panda/board/obj/**' --exclude='**/panda/certs/' --exclude='**/panda/crypto/' --exclude='**/release/' --exclude='**/.github/' --exclude='**/selfdrive/ui/replay/' --exclude='**/__pycache__/' --exclude='**/selfdrive/ui/*.h' --exclude='**/selfdrive/ui/**/*.h' --exclude='**/selfdrive/ui/qt/offroad/sunnypilot/' --exclude='**/.git/' --exclude='**/SConstruct' --exclude='**/SConscript' --delete-excluded --chown=comma:comma ${BUILD_DIR}/ ${OUTPUT_DIR}/ after_script: # cleanup build dir after doing work - find $BUILD_DIR/ -mindepth 1 -delete artifacts: paths: - ${OUTPUT_DIR}/ tags: [ 'sunnypilot', 'tici' ] rules: - if: $AUTO_BUILD when: always - when: manual .publish_base: &publish_base image: alpine variables: GIT_SUBMODULE_STRATEGY: normal stage: publish needs: - job: build artifacts: true before_script: - 'apk update && apk upgrade' - 'apk add git bash openssh' - 'eval $(ssh-agent -s)' - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - - 'mkdir -p ~/.ssh/' - 'chmod 700 ~/.ssh' - export HOST=$(echo ${GIT_ORIGIN} | cut -d'@' -f2 | cut -d':' -f1) - echo fetching ssh pub keys for ${HOST} - 'ssh-keyscan -H ${HOST} >> ~/.ssh/known_hosts' # Adding gitlab to trusted - 'chmod 644 ~/.ssh/known_hosts' - *default_before_script script: - echo "${GIT_ORIGIN}" - echo "Calling to publish [${CI_DIR}/publish.sh ${CI_PROJECT_DIR} ${OUTPUT_DIR} ${NEW_BRANCH} ${VERSION} ${GIT_ORIGIN}]" - git config --global --add safe.directory ${OUTPUT_DIR} - $CI_DIR/publish.sh "${CI_PROJECT_DIR}" "${OUTPUT_DIR}" "${NEW_BRANCH}" "${VERSION}" "${GIT_ORIGIN}" "-${EXTRA_VERSION_IDENTIFIER}" allow_failure: false publish to private gitlab prebuilt: extends: ".publish_base" variables: GIT_ORIGIN: git@gitlab.com:sunnypilot/public/sunnypilot-prebuilts.git rules: - if: $AUTO_BUILD when: on_success - if: $CI_MERGE_REQUEST_IID when: on_success - when: manual publish to public github prebuilt: extends: ".publish_base" variables: GIT_ORIGIN: git@github.com:sunnyhaibin/sunnypilot.git GIT_CONFIG_USER_EMAIL: "jason.wen@sunnypilot.ai" GIT_CONFIG_USER_NAME: "Jason Wen" rules: - if: $AUTO_PUBLISH when: on_success - when: manual .notify_discord: ¬ify_discord image: alpine stage: notify needs: ["build"] variables: DISCORD_HOOK: "${DISCORD_MANUAL_BUILD_WEBHOOK_URL}" # Default hook if not overriden by children before_script: - 'apk add curl jq envsubst' script: - echo using [${TEMPLATE}] - cat release/ci/${TEMPLATE} | envsubst | tee payload.json - 'curl -X POST -H "Content-Type: application/json" -d "$(cat payload.json)" ${DISCORD_HOOK} | jq .' rules: - if: $NEW_BRANCH when: on_success - when: never allow_failure: true notify pending action: extends: ".notify_discord" variables: TEMPLATE: "discord_template_notify_dev_private.json" before_script: - !reference [".notify_discord", "before_script"] - export AVATAR_URL=$(curl -s -X GET "https://gitlab.com/api/v4/avatar?email=${GITLAB_USER_EMAIL}" | jq -r '.avatar_url') notify new dev build: extends: ".notify_discord" stage: notify needs: ["publish to public github prebuilt"] # This notify shall only happen after a publish to github public variables: TEMPLATE: "discord_template_notify_dev_public.json" before_script: - !reference [".notify_discord", "before_script"] - export EXTRA_VERSION_IDENTIFIER=$((CI_PIPELINE_IID + BASE_BUILD_NUMER)) rules: - if: $NEW_BRANCH == "dev-c3" variables: DISCORD_HOOK: "${DISCORD_NEW_BUILD_WEBHOOK_URL}" # Overriding hook because we know we are dev-c3 - !reference [".notify_discord", "rules"]