Инструменты пользователя

Инструменты сайта


develop:gh_actions

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
develop:gh_actions [2024/01/26 09:23]
admin
develop:gh_actions [2024/02/19 03:46] (текущий)
admin
Строка 1: Строка 1:
 ====== GitHub Actions ====== ====== GitHub Actions ======
- 
  
 ===== Введение ===== ===== Введение =====
Строка 11: Строка 10:
 Можно работать в онлайн редакторе\\ Можно работать в онлайн редакторе\\
 </details> </details>
- 
  
  
Строка 23: Строка 21:
  
 Может быть вызван автоматически, вручную либо выполняться по расписанию\\ Может быть вызван автоматически, вручную либо выполняться по расписанию\\
- 
 Пример workflow:\\ Пример workflow:\\
 <code yaml> <code yaml>
Строка 48: Строка 45:
  
  
-==== Jobs ==== 
  
 +==== Jobs ====
 +"**Джобы выполняются** на разных VM", для выполнения в рамках одной VM есть **steps**\\
  
 <details> <details>
Строка 117: Строка 115:
 </details> </details>
  
 +
 +
 +==== Actions ====
 +Вместо инструкции "**run**", для вызова команд, можно использовать готовые модули или решения, написанные другими разработчиками, они распространяются бесплатно на маркетплейсе GH\\
  
 <details> <details>
-<summary>:!: </summary>+<summary>:!: пример</summary
 +Например популярный экшен для загрузки кода из репозитория, "checkout@v3"\\ 
 + 
 +<code yaml> 
 +name: print workflow 
 +on: workflow_dispatch 
 + 
 +jobs: 
 +  checkout: 
 +    runs-on: ubuntu-latest 
 +    steps: 
 +      - name: checkout_repo 
 +        uses: actions/checkout@v3 
 +</code>
 </details> </details>
  
  
  
 +==== Примеры ====
  
-==== Actions ====+<details> 
 +<summary>:!: Большой пример </summary> 
 +Главный экшен "ci-production" является точкой входа, внутри запускает доп экшены\\ 
 +Выполняются на self-hosted раннерах\\ 
 +Настроено несколько окружений, содержащих свой набор переменных, задаются в настройках репозитория\\
  
  
  
-<details> +"ci-production.yml"\\ 
-<summary>:!: </summary> +Триггеримся на пуш тега с формате "release-"\\ 
-</details>+Нюанс в том что сработает пуш этого тега в любую ветку а выпуск релиза предполагается наверно из мастера\\
  
 +<code bash>
 +name: ci-production
 +on:
 +  push:
 +    tags:
 +      - 'release-*'
  
 +jobs:
 +  build:
 +    uses: ./.github/workflows/build.yml
 +    secrets: inherit
  
-====  ====+  deploy-stage: 
 +    needs: build 
 +    uses: ./.github/workflows/deploy.yml 
 +    with: 
 +      environment: stage 
 +    secrets: inherit
  
-<details> +  deploy-prod: 
-<summary> </summary>+    needs: deploy-stage 
 +    uses: ./.github/workflows/deploy.yml 
 +    with: 
 +      environment: prod 
 +    secrets: inherit 
 +</code> 
 + 
 + 
 + 
 +Для запуска тестов делаем flow с триггером на пуш в любую ветку кроме "master", в него как раз предполагается пуш релизного тега, иначе запускаются оба флоу \\
  
 <code bash> <code bash>
 +name: ci-test
 +on:
 +  push:
 +    branches:
 +      - '**'
 +      - '!master'
 +
 +jobs:
 +  build:
 +    uses: ./.github/workflows/build.yml
 +    secrets: inherit
 +
 +  deploy-stage:
 +    needs: build
 +    uses: ./.github/workflows/deploy.yml
 +    with:
 +      environment: stage
 +    secrets: inherit
 +</code>
 +
 +
 +
 +"build.yml"
 +<code bash>
 +name: build
 +on:
 +  workflow_call:
 +
 +jobs:
 +  build:
 +    runs-on:
 +      - self-hosted
 +      - Linux
 +      - kube-common
 +
 +    steps:
 +      - uses: actions/checkout@v4
 +
 +      - name: Set up JDK 17
 +        uses: actions/setup-java@v4
 +        with:
 +          java-version: 17
 +          distribution: 'adopt'
 +
 +      - name: Validate Gradle Wrapper
 +        uses: gradle/wrapper-validation-action@v2.1.1
 +
 +      - name: Compile
 +        run: sudo bash ./gradlew :compileJava
 +
 +      - name: Test
 +        run: sudo bash ./gradlew :test
 +
 +      - name: Build
 +        run: sudo bash ./gradlew :bootJar
 +
 +      - name: Inject GitHub variables
 +        uses: rlespinasse/github-slug-action@v4
 +
 +      - name: Set docker tags
 +        run: |
 +          echo 'DOCKER_TAGS<<EOF' >> $GITHUB_ENV
 +          # В этой переменной последний тег, если нет собственного то в нем будет название ветки
 +          if [[ "$GITHUB_REF_SLUG" =~ "release-".* ]]; then
 +            echo "registry.myapp.ru/myapp:$GITHUB_REF_SLUG-$GITHUB_SHA_SHORT"
 +            echo "registry.myapp.ru/myapp:latest"
 +          else
 +            echo "registry.myapp.ru/myapp:branch-$GITHUB_REF_SLUG-$GITHUB_SHA_SHORT"
 +          fi >> $GITHUB_ENV
 +          echo 'EOF' >> $GITHUB_ENV
 +          cat $GITHUB_ENV
 +
 +      - name: Login to Registry
 +        uses: docker/login-action@v3
 +        with:
 +          registry: registry.myapp.ru
 +          username: ${{ secrets.DOCKER_USERNAME }}
 +          password: ${{ secrets.DOCKER_PASSWORD }}
 +
 +      - name: Setup Docker Buildx
 +        uses: docker/setup-buildx-action@v3
 +
 +      - name: Build and push image
 +        uses: docker/build-push-action@v5
 +        with:
 +          context: .
 +          file: ./docker/Dockerfile
 +          push: true
 +          tags: ${{ env.DOCKER_TAGS }}
 +</code>
 +
 +
 +
 +"deploy.yml"\\
 +Деплоится на удаленный сервер, кредлы ssh сохранены в секретах репы\\
 +Для применения окружения переменных "stage", нужен блок "environment"\\
 +<code bash>
 +name: deploy
 +on:
 +  workflow_call:
 +    inputs:
 +      environment:
 +        required: true
 +        type: string
 +
 +jobs:
 +  deploy:
 +    runs-on:
 +      - self-hosted
 +      - Linux
 +      - kube-common
 +
 +    environment:
 +      name: ${{ inputs.environment }}
 +
 +    steps:
 +      - uses: actions/checkout@v4
 +
 +      # Для того чтобы задеплоить именно эту версию образа, чтобы и для тестов тоже работало
 +      # Указываем в докер-компоуз тег образа который мы добавляли на прошлом шаге 
 +      - name: Inject GitHub variables
 +        uses: rlespinasse/github-slug-action@v4
 +
 +      - name: Get docker-image tags
 +        run: |
 +          echo 'DOCKER_TAGS<<EOF' >> $GITHUB_ENV
 +          if [[ "$GITHUB_REF_SLUG" =~ "release-".* ]]; then
 +            echo "$GITHUB_REF_SLUG-$GITHUB_SHA_SHORT"
 +          else
 +            echo "branch-$GITHUB_REF_SLUG-$GITHUB_SHA_SHORT"
 +          fi >> $GITHUB_ENV
 +          echo 'EOF' >> $GITHUB_ENV
 +          cat $GITHUB_ENV
 +
 +      # Далее добавить еще один replace в компоуз
 +      - name: Set secrets & environment
 +        run: |
 +          cd ./docker/
 +          sed -i 's/<DATABASE_NAME>/${{ vars.DATABASE_NAME }}/g' ./docker_compose_myapp.yml
 +          sed -i 's/<DATABASE_USER_NAME>/${{ vars.DATABASE_USER_NAME }}/g' ./docker_compose_myapp.yml
 +
 +      - name: Deploy on remote host
 +        uses: cross-the-world/ssh-scp-ssh-pipelines@latest
 +        with:
 +          host: ${{ secrets.SSH_HOST }}
 +          user: ${{ secrets.SSH_USER }}
 +          pass: ${{ secrets.SSH_PASS }}
 +          first_ssh: |
 +            echo '===== PREPARE HOST ====='
 +            sudo mkdir -p /opt/${{ vars.APP_DIRECTORY }}/
 +            sudo mkdir -p /opt/pgdata/
 +            sudo chown -R ${{ secrets.SSH_USER }}. /opt/
 +
 +          scp: |
 +            echo '===== SENDING FILES ====='
 +            './docker/postgres' => /opt/${{ vars.APP_DIRECTORY }}/
 +            './docker/docker_compose_myapp.yml' => /opt/${{ vars.APP_DIRECTORY }}/
 +
 +          last_ssh: |
 +            echo '===== LOGIN TO REGISTRY ====='
 +            sudo docker login registry.myapp.io -u '${{ secrets.DOCKER_USERNAME }}' -p '${{ secrets.DOCKER_PASSWORD }}'
 +
 +            echo '===== RESTART DOCKER-COMPOSE ====='
 +            cd /opt/${{ vars.APP_DIRECTORY }}/
 +            sudo docker-compose -f docker_compose_myapp.yml down
 +            sudo docker-compose -f docker_compose_myapp.yml up -d
 </code> </code>
 </details> </details>
 +
 +
 +
 +
 +====  ====
 +
 +
 +
  
  
develop/gh_actions.1706261001.txt.gz · Последнее изменение: 2024/01/26 09:23 — admin