DEV Community

Cover image for Gerenciando versões iOS automaticamente sem ferramentas externas
Rafael Leandro
Rafael Leandro

Posted on

Gerenciando versões iOS automaticamente sem ferramentas externas

TL;DR:

Vai, apressadinho: agvtool --help

Capítulo 1: Um longo esperado reencontro



Estava num pré-feriadão, tranquilo e feliz até precisar fazer uma release do SDK que mantenho no trabalho e o Fastlane estava quebrando o .xcodeproj.
Esse script recebia uma versão por parâmetro mas eu queria deixar isso totalmente automatizado no CI, aproveitei esse momento para começar a saga de reescrever tudo e resolver tanto o projeto corrompido, como automatizar o incremento da versão.

Capítulo 2: O Confronto com os Orcs

Utilizar Fastlane no meu contexto implica em gerenciar a versão do Ruby e do Fastlane, então novos desenvolvedores ou qualquer um do time que vá rodar o projeto precisariam configurar isso também, incluindo a máquina do CI.
Como eu preciso apenas fazer o archive e enviar o SDK, não é necessário o Fastlane, a solução escolhida foi fazer tudo em shell script mesmo.

Capítulo 3: A Chegada em Mordor

Image description

One script to rule them all

Dividi em 3 etapas:
1 - Descobrir a versão do projeto
2 - Fazer o incremento da versão, seguindo a lógica das versões anteriores
3 - Definir a versão no projeto

Aqui o primeiro passo é descobrir qual a versão atual do projeto e para isso usei o agvtool
Para pegar a versão do projeto utilizo o what-marketing-version e para pegar o build number what-version.
agvtool what-marketing-version

retorno da função agvtool what-marketing-version mostrando as versões em cada target

Em shell:

agv_output=$(agvtool what-marketing-version)
current_version=$(echo "$agv_output" | grep 'Found CFBundleShortVersionString' | head -n 1 | sed -E 's/.*of "([0-9]+\.[0-9]+\.[0-9]+)".*/\1/')
echo "$current_version"
Enter fullscreen mode Exit fullscreen mode

Com o número da versão só fiz uma lógica para incrementar de acordo com o que meu projeto segue. Incrementa o patch até 9, depois passa para o minor até 9 e depois incrementa o major.

increment_version() {
    local version="$1"

    # Divide into (major, minor, patch)
    IFS='.' read -r major minor patch <<< "$version"

    # Increment the patch number, considering the limit of 9 
    if [ "$patch" -lt 9 ]; then
        ((patch++))
    else
        # If patch reaches 9, reset it to 0 and increment the minor number
        patch=0
        if [ "$minor" -lt 9 ]; then
            ((minor++))
        else
            # If minor reaches 9, reset it to 0 and increment the major number
            minor=0
            if [ "$major" -lt 9 ]; then
                ((major++))
            fi
        fi
    fi

    echo "$major.$minor.$patch"
}
Enter fullscreen mode Exit fullscreen mode

E finalmente, para atualizar a versão:

version=$(get_version)
new_version=$(increment_version $version)
agvtool new-marketing-version $new_version
Enter fullscreen mode Exit fullscreen mode

Image description

Top comments (0)