Введение:
https://www.youtube.com/watch?v=Yg5rpke79X4&list=PLg5SS_4L6LYstwxTEOU05E0URTHnbtA0l&index=14 - видосик GitHub Action - позволяет запускать Linux и Windows команды, а также автоматизировать Test, Build, Deploy нашего кода в Repasitory GitHub без использования серверов для этой автоматизации например Jenkins.
0. Включение автоматизации GitHub Action
Включение автоматизации происходит добавлением файлов YAML в специальную директорию .github/workflows в вашем Repository .github/workflows/myfile_pipe_line.yml *.yml - имя файла YAML может быть любым Синтаксис очень похож на Ansible и Dockerfile
1. default файл YAML
# This is a basic workflow to help you get started with Actions
name: CI
# Controls when the action will run. Triggers the workflow on push or pull request
# events but only for the master branch
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
# This workflow contains a single job called "build"
build:
# The type of runner that the job will run on
runs-on: ubuntu-latest
# Steps represent a sequence of tasks that will be executed as part of the job
steps:
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- uses: actions/checkout@v2
# Runs a single command using the runners shell
- name: Run a one-line script
run: echo Hello, world!
# Runs a set of commands using the runners shell
- name: Run a multi-line script
run: |
echo Add other actions to build,
echo test, and deploy your project.
2. Создание и редактирование Action
!!! идем в репозитории -> Action -> Skip this and set up a workflow yourself
!!! попадаем в редактор Action
!!! Называем файл как хотим
!!! клавиши ctrl + space - авто подстановка значений
# Коментарии...
name: My-Project1 # важное имя, без пробелов
env: # глобальные переменные
APPLICATION_NAME : "MyFlask" # глобальные переменные
DEPLOY_PACKAGE_NAME : "flask-deploy-ver-${{ github.sha }}" # глобальные переменные
on: # когда запустить
push: # запустить при push на ветку master
branches:
- master
jobs:
my_testing:
runs-on: ubuntu-latest # какие образы используются
steps:
- name: Print hello message # Название задачи
run : echo "Hello world from testing" # Задача
- name: Execute few commands
run: |
echo "Hello Message1"
echo "Hello Message2"
echo "Aplication name: ${{ env.APPLICATION_NAME }}"
- name: Git clone myproject
uses: actions/checkout@v1 # получаем наш репозиторий git для виртуальной машины
my_deploy:
runs-on: ubuntu-latest
needs: [my_testing] # выполнять после выполнения my_testing
steps:
- name: Print hello message
run : echo "Hello world from deploy"
3. Пример файла YAML
name: My-Project1
env:
APPLICATION_NAME : "MyFlask"
DEPLOY_PACKAGE_NAME : "flask-deploy-ver-${{ github.sha }}"
on:
push:
branches:
- master
jobs:
my_testing:
runs-on: ubuntu-latest
steps:
- name: Print hellow message in testing
run : echo "Hello world from testing"
- name: Execute few commands
run: |
echo "Hello Message1"
echo "Hello Message2"
echo "Aplication name: ${{ env.APPLICATION_NAME }}"
- name: List current folder
run : ls -la
- name: Git clone myproject
uses: actions/checkout@v1
- name: List current folder
run : ls -la
my_deploy:
runs-on: ubuntu-latest
needs: [my_testing]
env:
VAR1: "This is Job Level var1"
VAR2: "This is Job Level var2"
steps:
- name: Print hello message deploy
run : echo "Hello world from deploy"
- name: Print vars
run : |
echo "Var1 = ${{ env.VAR1 }}"
echo "Var2 = ${{ env.VAR2 }}"
echo "Var3 = $LOCAL_VAE"
env:
LOCAL_VAE: "This is super local Enviromment variable"
- name: Deploymend package
run : echo "Deploy package name is ${{ env.DEPLOY_PACKAGE_NAME }}"
- name: Lets test some packages iof the are here 1
run : aws --version
- name: Lets test some packages iof the are here 2
run : zip --version
4. Пример файла yml для AWS
#---------------------------------------------------------------------
# GitHub Action Workflow to Deploy Flask App to AWS ElasticBeanstalk
#
# Version Date Info
# 1.0 2019 Initial Version
#
# Made by Denis Astahov ADV-IT Copyleft (c) 2019
#---------------------------------------------------------------------
name: CI-CD-Pipeline-to-AWS-ElasticBeastalk
env:
EB_PACKAGE_S3_BUCKET_NAME : "adv-it-flask-application-packages"
EB_APPLICATION_NAME : "MyFlask"
EB_ENVIRONMENT_NAME : "MyFlask-env"
DEPLOY_PACKAGE_NAME : "flask_app_${{ github.sha }}.zip"
AWS_REGION_NAME : "us-west-2"
on:
push:
branches:
- master
jobs:
my_ci_part:
runs-on: ubuntu-latest
steps:
- name: Git clone our repo
uses: actions/checkout@v1
- name: Create ZIP deployment package
run : zip -r ${{ env.DEPLOY_PACKAGE_NAME }} ./ -x *.git*
- name: Configure my AWS Credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id : ${{ secrets.MY_AWS_ACCESS_KEY }}
aws-secret-access-key: ${{ secrets.MY_AWS_SECRET_KEY }}
aws-region : ${{ env.AWS_REGION_NAME }}
- name: Copy Deployment package to S3 bucket
run : aws s3 cp ${{ env.DEPLOY_PACKAGE_NAME }} s3://${{ env.EB_PACKAGE_S3_BUCKET_NAME }}/
- name: Print Happy Message for CI finish
run : echo "CI Pipeline part Finished successfully!"
my_cd_part:
runs-on: ubuntu-latest
needs: [my_ci_part]
steps:
- name: Configure my AWS Credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id : ${{ secrets.MY_AWS_ACCESS_KEY }}
aws-secret-access-key: ${{ secrets.MY_AWS_SECRET_KEY }}
aws-region : ${{ env.AWS_REGION_NAME }}
- name: Create new ElasticBeanstalk Application Version
run : |
aws elasticbeanstalk create-application-version \
--application-name ${{ env.EB_APPLICATION_NAME }} \
--source-bundle S3Bucket="${{ env.EB_PACKAGE_S3_BUCKET_NAME }}",S3Key="${{ env.DEPLOY_PACKAGE_NAME }}" \
--version-label "Ver-${{ github.sha }}" \
--description "CoimmitSHA-${{ github.sha }}"
- name: Deploy new ElasticBeanstalk Application Version
run : aws elasticbeanstalk update-environment --environment-name ${{ env.EB_ENVIRONMENT_NAME }} --version-label "Ver-${{ github.sha }}"
- name: Print Happy Message for CD finish
run : echo "CD Pipeline part Finished successfully!"