После написания кода проекта и тестировании его в местной среде разработки необходимо создать репозиторий GitLab и загрузить код и настроить для развертывания к Heroku.
.gitignore.
Добавить .gitignore Файл на ваш репозиторий, чтобы временные файлы и каталоги, созданные в процессе здания, не загружаются в GitLab. Вы можете использовать шаблоны, предоставляемые GitLab или генерировать этот файл в gitignore.io Отказ
Просто введите в строке поиска Технологии, которые вы используете для проекта, и она будет генерировать файл для вас.
Файл будет выглядеть следующим образом:
# Created by https://www.gitignore.io/api/rust,python # Edit at https://www.gitignore.io/?templates=rust,python ### Python ### # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] *$py.class # C extensions *.so # Distribution / packaging .Python build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ wheels/ pip-wheel-metadata/ share/python-wheels/ *.egg-info/ .installed.cfg *.egg MANIFEST # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. *.manifest *.spec # Installer logs pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ .nox/ .coverage .coverage.* .cache nosetests.xml coverage.xml *.cover .hypothesis/ .pytest_cache/ # Translations *.mo *.pot # Scrapy stuff: .scrapy # Sphinx documentation docs/_build/ # PyBuilder target/ # pyenv .python-version # pipenv # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. # However, in case of collaboration, if having platform-specific dependencies or dependencies # having no cross-platform support, pipenv may install dependencies that don't work, or not # install all needed dependencies. #Pipfile.lock # celery beat schedule file celerybeat-schedule # SageMath parsed files *.sage.py # Spyder project settings .spyderproject .spyproject # Rope project settings .ropeproject # Mr Developer .mr.developer.cfg .project .pydevproject # mkdocs documentation /site # mypy .mypy_cache/ .dmypy.json dmypy.json # Pyre type checker .pyre/ ### Rust ### # Generated by Cargo # will have compiled files and executables /target/ # Remove Cargo.lock from gitignore if creating an executable, leave it for libraries # More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html Cargo.lock # These are backup files generated by rustfmt **/*.rs.bk # End of https://www.gitignore.io/api/rust,python
Heroku
Перед настройкой репозитория вы должны создать приложение Heroku.
Перейти к Dashboard.heroku.com/account и скопируйте ключ API.
Dockerfile
Создайте новый Dockerfile в своем хранилище. Он будет иметь следующий контент:
FROM docker.io/username/rust-python:latest
WORKDIR /home/admin
USER admin
RUN mkdir app
WORKDIR app
RUN env PYTHON_CONFIGURE_OPTS='--enable-shared' pyenv install 3.7.7
ENV LD_LIBRARY_PATH $HOME/.pyenv/versions/3.7.7/lib/
RUN pyenv global 3.7.7
RUN pyenv rehash
RUN rustup override set nightly
COPY pyproject.toml ./
RUN poetry config virtualenvs.create false \
&& poetry lock \
&& poetry export --without-hashes -f requirements.txt --dev \
| poetry run pip install -r /dev/stdin \
&& poetry debug
COPY . ./
RUN poetry install --no-interaction \
&& cargo build --release
CMD ["sh", "run"]
По словам этот вопрос Адрес реестра контейнера (Docker.io) должен быть указан до имени базового изображения для Buillah, чтобы правильно вытащить изображение из Docker Hub.
Базовое изображение, используемое для проекта, будет создан ранее и доступен от Имя пользователя/Rust-Python: последние Отказ
Затем установите Workdir к /home/admin и Пользователь к админ . Создать приложение каталог и установить его как Workdir Отказ
Установите Python 3.7.7 с общими библиотеками и установить Ld_library_path Переменная среды.
Укажите версию Python и Ruad для использования.
Скопируйте pyproject.toml файл. Поэзия используется для управления зависимостями Python, но не будет создана виртуальная среда.
Затем заблокируйте зависимости и экспортируйте до требования .txt Файл и установите их, используя пипс Это делается для создания кэширования их.
Затем установите зависимости Python и Rust в зависимости от проекта и создайте проект для производства.
Когда создается создаваемое изображение Docker, Bash Скрипт по имени Беги выполняется.
Беги Сценарий Bash имеет следующий контент, чтобы Heroku знает, как запустить приложение:
ROCKET_PORT=$PORT ROCKET_ENV=prod ./target/release/rust-python-demo
Переменная $ Порт Установлен Heroku, поскольку он динамически выбирает порт для приложения, это значение присвоено Rocket_port Отказ Тогда окружающая среда устанавливается на производство с Rocket_env = Prod И двоичное приложение запущено.
Gitlab ci.
Добавьте значение ключа API Heroku, которую вы скопировали до настроек репозитория, следуя ступеням ниже:
- Перейти к
Настройки>CI/CDОтказ - В
ПеременныеРаздел Нажмите наРазвернутьОтказ - Добавьте переменную
Heroku_api_keyи назначьте значение копированию ранее.
Затем добавьте .gitlab-ci.yml Файл, это файл конфигурации непрерывной интеграции системы, предоставленной GitLab.
Для этого я просто следую следующую руководству Alessandro Diafia на Непрерывное развертывание с GitLab, Docker и Heroku Отказ
Файл будет выглядеть следующим образом:
stages:
- build
- release
build_image:
only:
- master
image: registry.gitlab.com/majorhayden/container-buildah
stage: build
variables:
STORAGE_DRIVER: "vfs"
BUILDAH_FORMAT: "docker"
before_script:
- dnf install -y nodejs
- curl https://cli-assets.heroku.com/install.sh | sh
- sed -i '/^mountopt =.*/d' /etc/containers/storage.conf
script:
- buildah bud --iidfile iidfile -t rust-python-demo:$CI_COMMIT_SHORT_SHA .
- buildah push --creds=_:$(heroku auth:token) $(cat iidfile) registry.heroku.com/heroku-app-name /web
release:
only:
- master
image: node:10.17-alpine
stage: release
before_script:
- apk add curl bash
- curl https://cli-assets.heroku.com/install.sh | sh
script:
- heroku container:release -a heroku-app-name web
У него будут только две этапы, build_image , где изображение Docker построен с использованием DockerFile, созданный ранее и добавлен в реестр Heroku, и Выпуск , где изображение будет толкаться в приложение Heroku.
Просто заменить Registry.heroku.com/heroku-app-name/Web и Heroku Container: Release-A Heroku-Name Web С именем приложения, которое вы создали на Heroku.
Если все пойдет хорошо, задания трубопровода добится успеха, и ваше приложение развернуто в Heroku.
Вы можете пойти в Rust-Python-demo.herokuapp.com Чтобы увидеть живую демонстрацию.
Оригинал: «https://dev.to/mattdark/from-gitlab-to-heroku-with-docker-3db2»