Skip to content

📕 Tutoriais

Douglas Medeiros edited this page Jan 2, 2023 · 8 revisions

Indice

Repositórios dentro de um repositório com push automático

Guia rápido para aplicar o conceito de sub pastas como repositório e sincronizando automaticamente.

Git Subtree

O Git subtree é uma alternativa ao git submodule, o conceito aqui é o mesmo, ter um diretório dentro do seu projeto que é um clone/espelho de um outro projeto, tendo comandos como push, commit ou pull sincronizados. Voce pode conferir no desenho abaixo um exemplo de como fica a arquitetura, onde a pasta http é na verdade o repositório dump-components/php-http.

dumptecnologia/php-framework
|    bin
|    console
|    src
|    |    Http (esta pasta dentro do projeto é na verdade o repositório dump-components/php-http)
|    |    Patterns
|    |    Log
|    test

O exemplo foi tirado do nosso repositório dumptecnologia/php-framework que contém essa implementação.

Vamos lá

Por padrão, Git subtree requer comandos adicionais para pode sincronizar ou clonar, para entender como isso funciona, pare um pouquinho e leia o guia básico da subtree, para contornar isso, podemos fazer uma configuração no GitHub Actions para automatizar o processo de sincronização, fazendo com que você de push no repositório pai e ele atualize os repositórios da subtree automaticamente. Essa é a mesma ideia que o Laravel usa em seu framework, tendo projetos para cada pacote e um projeto pai gerenciando tudo.

  1. Adicione uma pasta como um git subtree
git subtree add --prefix src/Http [email protected]:dump-components/php-http.git main --squash
  1. De push no repositório para atualizar com a informação da nova subtree
git subtree push --prefix src/Http [email protected]:dump-components/php-http.git main

Agora seu repositório tem uma referencia a subtree,vamos automatizar o processo de push dela usando uma action do github.

  1. Escreva uma action com as informações da sincronização, essa irá rodar cada vez que o repositório tiver um push, a action ira verificar se teve alterações na subtree e dará git subtree push automaticamente.
name: push-sub-repositories

on: [ push ]

jobs:
  update-php-http:
    name: dump-components/php-http
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: 0
      - uses: nxtlvlsoftware/[email protected]
        with:
          repo: 'dump-components/php-http'
          path: 'src/Http'
          deploy_key: '${{ secrets.PHP_HTTP }}'
          force: true

DockerHub build and push

Gerando a Token

  • Necessário gerar uma key na conta utilizada para hospedar as imagens
    • Vá até o menu:
      • Account Settings
      • Security
      • Na tela aparecerá
        • Access Tokens
          • Clique em New Access Token
          • Coloque uma descrição e informe a permissão de leitura, escrita e deleção.

Cadastrando token no github

  • Com o token em mãos vá até o github
    • No repositório que você quer automatizar o build/push
      • Precisamos criar as variáveis de ambiente
        • DOCKER_USERNAME => username do DockerHub
        • DOCKER_PASSWORD => token

Criando workflow

  • Crie o arquivo YML abaixo na pasta .github/workflows
    • Agora quando subirmos uma tag branch o deploy e push vai começar automaticamente
name: Publish Docker image

on:
  push:
    tags:
      - '*.*.*'

jobs:
  push_to_registry:
    name: Push Docker image to Docker Hub
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write
    steps:

      - name: Check out the repo
        uses: actions/checkout@v3

      - name: Set env
        run: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV
      
      - name: Log in to Docker Hub
        uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}
      
      - name: Extract metadata (tags, labels) for Docker
        id: meta
        uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38
        with:
          images: dumptec/php-fpm
      
      - name: Build and push Docker image | BASE
        uses: docker/build-push-action@v3
        env:
          TAG: ${{ steps.meta.outputs.tags }}
        with:
          context: ./Dockerfiles/base/
          push: true
          tags: |
            ${{ secrets.DOCKER_USERNAME }}/php-fpm:base-${{ env.RELEASE_VERSION }}
            ${{ secrets.DOCKER_USERNAME }}/php-fpm:base-latest
          labels: ${{ steps.meta.outputs.labels }}

Gerando Certificado SSL auto assinado

Gerando rootCA.key

openssl genrsa -des3 -out rootCA.key 2048
pass=badpass

Gerando rootCA.pem

  • Use o comando abaixo e preencha os campos
    • Country Name (2 letter code) [AU]
    • State or Province Name (full name) [Some-State]:
    • Locality Name (eg, city) []:
    • Organization Name (eg, company) [Internet Widgits Pty Ltd]:
    • Organizational Unit Name (eg, section) []:
    • Common Name (e.g. server FQDN or YOUR name) []:
    • Email Address []:
openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 3650 -out rootCA.pem

Gerando server.csr.cnf

Crie o arquivo abaixo, preenchendo os campos de acordo com a necessidade

[req]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn

[dn]
C=BR
ST=RS
L=RS
O=Dump tech
OU=Technology
[email protected]
CN = localhost

Gerando arquivo V3.ext

Crie o arquivo abaixo, preenchendo os campos de acordo com a necessidade

authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = myexample.com
DNS.2=sub.myexample.com
DNS.3=myexample1.com
DNS.4=localhost

Crie a chave do certificado

O comando abaixo utiliza o arquivo server.csf.cnf para gerar a key

openssl req -new -sha256 -nodes -out server.csr -newkey rsa:2048 -keyout server.key -config server.csr.cnf

Crie o certificado

O comando abaixo utiliza o arquivo v3.ext para gerar o certificado

openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 500 -sha256 -extfile v3.ext

Referências