• Перенос репозитория с Bitbucket на Github

    @yulyugin
    git clone --bare --mirror oldgitrepourl.git repo.git
    cd repo.git
    git push --mirror newgitrepourl
    Ответ написан
    2 комментария
  • Как передавать файлы конфигурации с переменными если не через ConfigMap который только для чтения?

    chupasaurus
    @chupasaurus
    Сею рефлекторное, злое, временное
    В официальных образах nginx достаточно создавать их в /etc/nginx/templates/ с суффиксом .template.
    Файл с переменными на замену монтируется как /etc/nginx/templates/config.conf.template
    Шелл скрипт, дёргаемый энтрипоинтом, копирует с подменой и получается /etc/nginx/conf.d/config.conf
    Ответ написан
    7 комментариев
  • Как правильно объявить сохранение артефакта с томами Docker?

    @mureevms
    Предположение 1:
    > Uploading artifacts... found 1 matching files and directories

    Он нашел одно совпадение. Быть может это именно каталог ${CI_PROJECT_DIR}/tmp/var/www/app, в котором не обнаружил файл artifact-$CI_JOB_NAME-$CI_COMMIT_REF_NAME. Для решения попробовать указать вместо вашего варианта, так. Не понятно как и какой файл создается в этом каталоге, вы этого не показывает, вероятно он просто не подходит под шаблон.
    artifacts:
        when: always
        paths:
          - "${CI_PROJECT_DIR}/tmp/var/www/app/*" # именно в кавычках


    Предположение 2:
    Раннер запускается от своего пользователя, а файл создается от пользователя, под которым запускается процесс в контейнере, как правило, это рут, поэтому имеет смысл попробовать перед docker-compose дать 777 права на этот каталог:
    script:
        - chmod 777 ${CI_PROJECT_DIR}/tmp/var/www/app


    Предположение 3:
    Маловероятно, вы же проверили, но на всякий случай проверьте еще раз, смущает частое упоминание /var/www/app в разных вариациях и не уверен, что это один и тот же каталог для хоста и контейнера. Например, ${CI_PROJECT_DIR}/tmp/var/www/app каталог для раннера это не одно и тоже, что и для контейнера.

    И последнее:
    Вы монтируете каталог /var/www/app, а создаете ${CI_PROJECT_DIR}/tmp/var/www/app
    Ответ написан
    6 комментариев
  • Как запускать несколько stage одновременно?

    @yellowmew
    Cloud infrastructure, monitoring engineer. SRE
    Есть два варианта развития событий: вы распределяете последовательность выполнения по стейжам или рисуете свой граф выполнения
    В первом случае последовательность стейжей важна - джобы параллелятся в рамках одного стейжа и следующий стейж не запустится пока не выполнятся все джобы предыдущего.
    .pre всегда запускается перед пользовательскими стейжами,
    Во втором - вы можете запланировать свой граф выполнения с помощью needs
    Я не нашел в документации, что .pre все еще будет выполняться первой, если ее джобы участвуют в вашем собственном графе, так что возможно это решение. В случае использования needs (и gitlab 14.2+ или gitlab.com 14.1) можно вообще не прописывать стейжи. В случае gitlab <=14.0 стейжи все еще нужны, потому что needs не будет работать с джобами одного стейжа.
    Внимательно прочитайте требования к needs https://docs.gitlab.com/ee/ci/yaml/#requirements-a... соответственно вашей версии gitlab
    Ответ написан
    Комментировать
  • Что такое фикстуры и миграции?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Фикстуры - это по сути тестовые данные. Они нужны для unit-тестирования. Это могут быть как данные в базе, так и обычные файлы (обычно 2 варианта, до и после обработки так скажем). Каждый раз когда запускаются тесты, эти данные используются для установления начального состояния системы, что бы тесты всегда выполнялись предсказуемо.

    Для функционального тестирования (тестрирование контроллеров, интаграционных тестов) фикстуры не применяются, хотя суть там так же сходна. Если честно, то тут мнение расходится. Одни говорят что при функциональных тестах нельзя использовать даже моки, то есть система в процессе выполнения тестов полностью создает то состояние которое необходимо для других тестов. Например последовательное выполнение тестов на добавление статьи и ее просмотр. Другие же предпочитают для каждого тесткейса выставлять состояние с нуля. По сути это схоже с использованием фикстур, но реализация различается. У вас есть некое api для заполнения данными (скажем метод добавляющий пользователя), и перед выполнением тест-кейса происходит ресет данных и заполнение их новыми. Плюсы так же есть - можно распаралелить выполнение тестов. (но не верьте мне на слово)

    Миграции - механизм организации версионности структуры проекта. Вы можете написать миграцию для изменения местоположения статики (картинки, поменять ссылки в базе и т.д.), или же у вас добавляется новая таблица/поле. Обычно дополняется обратной миграцией, которая восстанавливает исходную структуру. Обязательно для работы в команде или при частом изменении организации данных в проекте, вообще я бы посоветовал использовать их всегда.
    Ответ написан
    Комментировать
  • В чем принципиальное различие NAT и PROXY?

    vvpoloskin
    @vvpoloskin Куратор тега Компьютерные сети
    Инженер связи
    Сосед попросил вас позвонить в газовую службу. Вы - прокси для соседа.
    Несколько соседей попросили позвонить вас в газовую службу. Вы позвонили по первой просьбе, а на другие ответили, что уже звонили. Вы - кеширующая прокси для соседей.
    Сосед взял ваш телефон и позвонил в газовую службу с вашего номера. Вы - NAT для соседа.
    Ответ написан
    3 комментария
  • Как сделать поиск по таблице с подключением к Active Directory для получения email пользователя и отправки ему значений этого пользователя?

    Danya_Violet
    @Danya_Violet
    CTO/CIO
    from ldap3 import Server, Connection, SUBTREE
    
    s = Server(ad_domain, use_ssl=True, port=636)  # Адрес домена, шифрование, порт
    c = Connection(s, ad_admin, ad_password)
    
    # Поиск учётной записи в домене (Active Directory) по фамилии или логину
    def search_ad(last='*', login='*'):
        c.bind()
        c.search('ou=Офис, dc=domain, dc=local',
                 '(&(objectCategory=Person)(sn={})(sAMAccountName={}))'.format(last, login), SUBTREE,
                 attributes=['sAMAccountName', 'givenName', 'sn', 'cn', 'whenCreated', 'lastLogon', 'pwdLastSet',
                             'msDS-UserPasswordExpiryTimeComputed', 'memberOf', 'ipPhone', 'lockoutTime',
                             'distinguishedName'])
        a = c.entries
        c.unbind()
        return a


    # Вывод информации учётной записи в домене (Active Directory)
    def change_ad(cn):
        c.bind()
        c.search('ou=Офис, dc=domain, dc=local', '(&(objectCategory=Person)(cn={}))'.format(cn), SUBTREE,
                 attributes=['sAMAccountName', 'givenName', 'sn', 'cn', 'whenCreated', 'lastLogon', 'pwdLastSet',
                             'msDS-UserPasswordExpiryTimeComputed', 'memberOf', 'ipPhone', 'lockoutTime'])
        a = c.entries
        for ad_user in c.entries:
            name = ad_user['givenName']
            last = ad_user['sn']
            login = ad_user['sAMAccountName']


    # Отправка электронного письма
    def send_email(message):
        msg_email = MIMEMultipart()
    
        msg_email['From'] = email_from
        msg_email['To'] = email_to
        msg_email['Subject'] = 'Тема'
    
        body = 'Текст сообщения'
    
        msg_email.attach(MIMEText(body, 'plain'))
    
        server = smtplib.SMTP_SSL('smtp.yandex.ru:465')
        server.login(email_from, email_password)
        text = msg_email.as_string()
        server.sendmail(email_from, email_to, text)
        server.quit()
    Ответ написан
    2 комментария
  • Как сделать поиск по таблице с подключением к Active Directory для получения email пользователя и отправки ему значений этого пользователя?

    @BeatHazard
    Накидал скрипт, думаю то, что вам нужно.

    $users = Import-Csv -Path "C:\test\test.csv" -Encoding Default -Delimiter ","
    $AD = Get-ADUser -filter *

    #Указание параметров почтового сервера
    $EmailFrom = "email@address.ru" #необходимо указать адрес от имени которого будут отправляться письма
    $Subject = "Тема письма" #необходимо указать тему письма
    $smtpServer = "smtp.mail.ru" #необходимо указать адрес почтового сервера
    $smtp = New-Object net.mail.smtpclient($smtpServer)
    ####################################

    foreach ($user in $users)
    {
    $username = $user.name
    $EmailTo = $ad | where-object {$_.name -like "*$username*"} | Select-Object UserPrincipalName
    $EmailTo = $EmailTo.UserPrincipalName
    $Monitor = $user.Monitor
    $Mouse = $user.Mouse
    $Body = "Monitor - $Monitor Mouse -$Mouse"
    $smtp.Send($EmailFrom, $EmailTo, $Subject, $Body)
    $EmailTo = $Null
    }
    Ответ написан
    4 комментария
  • Куда именно нужно ставить тег HABRACUT в длинной статье на GT?

    Boomburum
    @Boomburum
    Местный
    Кат - это специальный тег, который разделяет пост на 2 части: "до ката" (вступление) и "после ката" (продолжение статьи). До ката должна находиться информация, максимально завлекающая под кат. Поэтому может находиться где угодно - после первого предложения, после первого абзаца, после картинки до ката (КДПВ - Картинка Для Привлечения Внимания).
    Ответ написан
    1 комментарий
  • Как реализовать автоматическое развёртывание Python проектов с помощью TeamCity?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    Выполните деплоймент вручную, используя только консольные команды.

    Запомните все, что вы сделали, напишите из этого скрипт, создайте в тимсити джобу с этим скриптом и запускайте.

    В случае необходимости, установите необходимый софт на тестовый стенд (git/bash/etc). Возможно вам понадобится еще один тимсити агент, установленный прямо на тестовую виндовую машину.
    Ответ написан
    2 комментария
  • Как рекурсивно скопировать по сети с одного хоста на другой (винда-винда)?

    akelsey
    @akelsey
    Старый надежный robocopy с ключами "/mir /sec /secfix"
    Ответ написан
    Комментировать
  • Git, как обновить проект ?

    ghaiklor
    @ghaiklor
    NodeJS TechLead
    Если вы хотите обновить у себя
    git pull
    Если вы хотите залить изменения на удаленный git-репозиторий
    git push
    Ответ написан
    Комментировать
  • Отличается ли настройка teamcity от jenkins?

    @imikh
    В каждой избушке свои погремушки.
    Ответ написан
    Комментировать
  • Что необходимо настроить, чтобы не прописывать sudo для системных команд?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer
    Правильный ответ заключается в том, что для sudo без аргументов, переменная PATH захардкожена

    * sudo по дефолту не использует PATH от вашего юзера или от root
    * sudo также игнорирует глобальные переменные из /etc/environment или /etc/profile.d/*.sh.
    * PATH для sudo захардкожен и равен /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

    Если нужно сделать свой PATH в судо, то можно сделать или так: "sudo bash" и уже в открытом bash настроить PATH или другие переменные.
    Или можно прописать то, что вам нужно в глобальный конфиг /etc/profile.d/name_anything.sh используя export, и запустить
    sudo su -

    Для справки, можно почитать man sudo, искать env_reset
    Ответ написан
    Комментировать
  • Что необходимо настроить, чтобы не прописывать sudo для системных команд?

    martin74ua
    @martin74ua Куратор тега Linux
    Linux administrator
    su
    и
    su -

    это разные команды.
    Ответ написан
    Комментировать
  • Где находится папка .ssh?

    selivanov_pavel
    @selivanov_pavel
    Linux admin
    В шеле ~ раскрывается как домашняя папка текущего пользователя, ~user - как домашняя папка пользователя user: ~/.ssh - для текущего пользователя, ~user/.ssh - для пользователя user.

    Выше писали, что можно получить информацию из /etc/passwd, но это неправильный подход: /etc/passwd используется для локальных пользователей. Если в системе настроены другие источники пользователей, например LDAP, в /etc/passwd их не будет. Правильно будет использовать утилиту getent, которая всё это учитывает:

    getent passwd | cut -d: -f6
    Ответ написан
    Комментировать
  • Как работает scanf в плюсах?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    мне надо в цикле на каждой итерации запрашивать ввод строки.
    cin » s1
    позволяет это сделать, а
    scanf("%255[^\n]", s1)
    только 1 раз.

    А вот такой scanf -- позволяет это сделать сколько угодно раз:
    scanf("%255[^\n]\n", s1);
    А вот такой позволяет ввести строку заранее неизвестной длины:
    char *p;
    scanf("%m[^\n]\n", &p);
    Ответ написан
    Комментировать
  • Как совместить вируальное окружение и реп git?

    VMesser
    @VMesser
    gitter.im/VBA-developers
    Надо папку с вложенным .git прописать в файл .gitignore в корневой папке верхнего репозитория : folder/
    Тогда git не будет отслеживать изменения в ней.
    Всё, можно пользоваться раздельно.
    Ответ написан
    Комментировать
  • Пайтон и virtualenv?

    virtualenv никак не связан с твоим проектом. Это python, который отделён от других в системе. Проект может лежать где угодно. Несколько проектов могут использовать один virtualenv. Если тебе нужны другие python пакеты для другого проекта и ты хочешь их отделить надо создать ещё один virtualenv.
    Ответ написан
    Комментировать
  • Как совместить вируальное окружение и реп git?

    Mi11er
    @Mi11er
    A human...
    Делаем корневую папку, проект, в ней 2 , одна с окружением, вторая с гитом.
    Все ...
    Виртуальное окружение ни кто в гит не пихает ...
    Ответ написан
    4 комментария